Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 准备SQL查询_Mysql_Sql_Sql Injection_Parameterization - Fatal编程技术网

Mysql 准备SQL查询

Mysql 准备SQL查询,mysql,sql,sql-injection,parameterization,Mysql,Sql,Sql Injection,Parameterization,在我的PHP文档中,我得到了如下所示的SQL查询: if(isset($_GET['id'])) { $id = $_GET['id']; $q = "SELECT * FROM `objekt_t` WHERE `id`='" . $id . "'"; $row = mysqli_query($con, $q) or die(mysqli_error($con)); while($r = mysqli_fetch_assoc($row)) {

在我的PHP文档中,我得到了如下所示的SQL查询:

if(isset($_GET['id']))
{
    $id = $_GET['id'];
    $q = "SELECT * FROM `objekt_t` WHERE `id`='" . $id . "'";
    $row = mysqli_query($con, $q) or die(mysqli_error($con));
    while($r = mysqli_fetch_assoc($row))
    {
        $objekt = $r;
    }
}
$stmt = $mysqli->prepare('SELECT * FROM objekt_t WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();

$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    // $row is an associative array
}
我意识到这是关于SQL注入之类的非常不安全的做法,所以我一直在研究使用绑定参数准备好的SQL查询。查看下面的示例查询:

$stmt = $db->prepare('update people set name = ? where id = ?');
$stmt->bind_param('si',$name,$id);
$stmt->execute();

我不明白如何使用绑定参数修改当前查询以匹配更安全的查询。非常感谢您的帮助。

准备好的语句将原始数据传输到查询,因此SQL注入是不可能的。无需对
real\u escape\u String
或任何其他格式化函数进行转义,因为这会为您提供转义

例如:

$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE Username=?");
$statement->bind_param('s',$_POST['Username']);
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();
我基本上是将我的$u POST数据直接绑定到查询,因为数据是作为原始数据发送的,所以即使查询包含一种注入形式,比如$u POST['username'];查询将正常运行


就过程和OOP风格而言,这取决于偏好,我个人更喜欢OOP风格而不是其他选项,因为它更具可读性

使用数字:

$ID= 5;
$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE ID=?");
$statement->bind_param('i',$ID);
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();
也可以直接在语句中使用精确值:

$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE ID='5'");
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();
照样

$mysqli = new mysqli("localhost", "my_user", "my_password", "db");

if(isset($_GET['id']))
{
    $id = $_GET['id'];
    $q = "SELECT some_field FROM `objekt_t` WHERE `id`= ?";

    if ($stmt = $mysqli->prepare($q)) {    
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->bind_result($result);
        $stmt->fetch();
    }
}

现在$result变量包含查询结果。

您可以这样做:

if(isset($_GET['id']))
{
    $id = $_GET['id'];
    $q = "SELECT * FROM `objekt_t` WHERE `id`='" . $id . "'";
    $row = mysqli_query($con, $q) or die(mysqli_error($con));
    while($r = mysqli_fetch_assoc($row))
    {
        $objekt = $r;
    }
}
$stmt = $mysqli->prepare('SELECT * FROM objekt_t WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();

$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    // $row is an associative array
}

我的查询结果是在
$stmt
还是在
$result
中?我刚刚用这句话编辑了这篇文章。$result变量包含脚本执行后的查询结果给我空值。这是为什么?哦,对不起,如果您使用
$stmt->bind\u result($result)
您不能使用
选择*
,而只需
选择一些字段
。或者使用
$stmt->bind_result($field1,$filed2)对,我误解了它是如何获取数据的。感谢您的帮助。将行
/$行更改为关联数组
var\u dump($row)执行时给我一个空文档,为什么?get_result方法需要MySQL本机驱动程序(mysqlnd)。可能是您没有安装。如何使用查询结果?尝试
var\u转储($resultCol)给我空值。我不明白如何使用/调用查询结果。通过我的修改,您应该在
prepare
中修改查询以从数据库返回有效结果。bind_结果将一个变量绑定到所使用的列,因此如果您在查询中选择了4列,则需要分配4个变量,例如,如果I将整个
prepare
行更改为
$db->prepare(“SELECT*FROM objekt__t,其中id=?”和下一行到
bind_param('s','5'),只有一列可以选择,因为我的表中只有一列
id='5'
。当我尝试
var\u dump($resultCol)时,这仍然没有给我任何帮助。我觉得我遗漏了一些明显的东西。如果要将字符串绑定到整数的位置,请将bind_参数更改为:
bind_参数('I','5')甚至知道这是不推荐的。查看我的更新:仍然没有发生任何事情。如果I
var\u dump($statement)
使用这两种方法,我看到
[“受影响的行”]=>NULL
。你知道为什么会这样吗?我怎样才能看到查询的实际发生?