Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.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/8/sorting/2.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
PHP从mysql_real_escape_字符串更改为PDO准备的语句_Php_Mysql - Fatal编程技术网

PHP从mysql_real_escape_字符串更改为PDO准备的语句

PHP从mysql_real_escape_字符串更改为PDO准备的语句,php,mysql,Php,Mysql,我目前使用mysql\u real\u escape\u string在查询数据库时对变量进行转义,以防止SQL注入。比如说, $keyword = mysql_real_escape_string($keyword); $guideline = mysql_real_escape_string($guideline); mysql_query("INSERT INTO table1 VALUES('$keyword','$guideline')");

我目前使用
mysql\u real\u escape\u string
在查询数据库时对变量进行转义,以防止SQL注入。比如说,

   $keyword = mysql_real_escape_string($keyword);
        $guideline = mysql_real_escape_string($guideline);  
        mysql_query("INSERT INTO table1 VALUES('$keyword','$guideline')");

$get = mysql_query("SELECT * FROM table2 WHERE keyword='$keyword'");

  while($row = mysql_fetch_assoc($get)) {
  //code
  }

在阅读了有关SQL注入预防的内容后,我已经了解到这还不足以停止SQL注入(现在有这么多代码需要检查和更正),我应该使用PDO准备的语句?我可以举一个例子,说明如何使用上面相同的$variables执行PDO准备的语句吗?

其实非常简单:

$db = new PDO($dsn, $user, $password);
$stmt = $db->prepare('INSERT INTO table1 VALUES(?,?)');
$stmt->execute(array($keyword, $guideline));
$stmt->close();

$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= ?');
$stmt->execute(array($keyword));
while(false !== ($row = $stmt->fetch())) {
   // do stuff
}
请注意,您还可以使用命名占位符,这有助于使代码更具可读性,但更为详细:

$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= :keyword');
$stmt2->execute(array(':keyword' => $keyword));

其实很简单:

$db = new PDO($dsn, $user, $password);
$stmt = $db->prepare('INSERT INTO table1 VALUES(?,?)');
$stmt->execute(array($keyword, $guideline));
$stmt->close();

$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= ?');
$stmt->execute(array($keyword));
while(false !== ($row = $stmt->fetch())) {
   // do stuff
}
请注意,您还可以使用命名占位符,这有助于使代码更具可读性,但更为详细:

$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= :keyword');
$stmt2->execute(array(':keyword' => $keyword));

首先,必须创建一个PDO对象:

$dbh = new PDO("mysql:dbname=$dbname", $username, $password);
然后有不同的方法将参数与查询关联:

  • 作为
    execute()
    的参数:

  • 通过绑定值(保留函数调用时指定的值):

  • 通过绑定参数(基础变量更改时更新):

  • 您甚至可以使用命名占位符而不是匿名的

    $qry = $dbh->prepare("SELECT * FROM table2 WHERE keyword = :kw");
    $qry->bindValue(":kw", $keyword);
    

    首先,必须创建一个PDO对象:

    $dbh = new PDO("mysql:dbname=$dbname", $username, $password);
    
    然后有不同的方法将参数与查询关联:

  • 作为
    execute()
    的参数:

  • 通过绑定值(保留函数调用时指定的值):

  • 通过绑定参数(基础变量更改时更新):

  • 您甚至可以使用命名占位符而不是匿名的

    $qry = $dbh->prepare("SELECT * FROM table2 WHERE keyword = :kw");
    $qry->bindValue(":kw", $keyword);
    

    这个更有意义

    <?php
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':value', $value);
    
    // insert one row
    $name = 'one';
    $value = 1;
    $stmt->execute();
    
    // insert another row with different values
    $name = 'two';
    $value = 2;
    $stmt->execute();
    ?>
    
    
    

    这一条更有意义

    <?php
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':value', $value);
    
    // insert one row
    $name = 'one';
    $value = 1;
    $stmt->execute();
    
    // insert another row with different values
    $name = 'two';
    $value = 2;
    $stmt->execute();
    ?>
    
    
    

    以下是我所做的,我并不自称是忍者,但已经做了一段时间了

    //connection
    $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
    
    //get Post data
    $name = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING);
    
    //SQL
    $SQL = $conn->prepare('SELECT * FROM users WHERE user_name=:name;');
    $SQL->execute(array(':name' => $name));
    
    //While Loop
    while($names = $SQL->fetch(PDO::FETCH_OBJ){
     echo $names->user_email
    }
    

    这就是我所做的,不是自称是忍者,而是已经做了一段时间了

    //connection
    $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
    
    //get Post data
    $name = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING);
    
    //SQL
    $SQL = $conn->prepare('SELECT * FROM users WHERE user_name=:name;');
    $SQL->execute(array(':name' => $name));
    
    //While Loop
    while($names = $SQL->fetch(PDO::FETCH_OBJ){
     echo $names->user_email
    }
    

    @杰伦:不,不是。它易受字符集相关注入的影响。然而,攻击者要做到这一点有些困难,但声称自己不受攻击仍然是错误的。谢谢,这么多相互矛盾的观点。我不使用任何变量来更改表名,我只使用它们来更改值,mysql_real_escape_string在那种情况下就足够了?我只会复制现有的答案,所以我强烈建议阅读这篇文章/教程@eis不记得了,我总是在连接后设置字符集(在PDO中和在mysql_*中之前)…@eis:那么PDO/准备的报表在100%的时间里都是这样吗?PDO/prepared语句到底是如何阻止SQL注入的?@jeroen:不,不是。它易受字符集相关注入的影响。然而,攻击者要做到这一点有些困难,但声称自己不受攻击仍然是错误的。谢谢,这么多相互矛盾的观点。我不使用任何变量来更改表名,我只使用它们来更改值,mysql_real_escape_string在那种情况下就足够了?我只会复制现有的答案,所以我强烈建议阅读这篇文章/教程@eis不记得了,我总是在连接后设置字符集(在PDO中和在mysql_*中之前)…@eis:那么PDO/准备的报表在100%的时间里都是这样吗?PDO/prepared语句到底是如何阻止SQL注入的?这正是您为OP所要求的,所以感谢prodigitalson,但是@user892134我要提醒您阅读PDO:。准备好的语句确实会清理输入,但是还有其他方法可以使用PDO,而PDO则不会,本手册将帮助您理解这些方法。不过,使用PDO是个好主意。不是一个完整的ORM,但足够的抽象层也有助于增加一些安全性。这正是您要求的OP,所以prodigitalson很荣幸,但是@user892134我要提醒您阅读PDO:。准备好的语句确实会清理输入,但是还有其他方法可以使用PDO,而PDO则不会,本手册将帮助您理解这些方法。不过,使用PDO是个好主意。不是一个成熟的ORM,但足够的抽象层也有助于增加一些安全性。因此,第二个示例适用于静态变量,第三个示例适用于动态变量?@user892134:两种情况都可以使用。如果要使用不同的参数值多次执行查询,第三个示例尤其有用:然后只需更改
    $keyword
    并再次调用
    $qry->execute()
    ,而第二个示例则需要
    bindValue()
    每次都是。所以第二个例子是静态变量,第三个例子是动态变量?@user892134:在任何一种情况下都可以使用。如果要使用不同的参数值多次执行查询,则第三个示例尤其有用:然后只需更改
    $keyword
    并再次调用
    $qry->execute()
    ,而对于第二个示例,每次都需要
    bindValue()