没有mysql_real_escape_string和bindValue的PDO

ade*_*oba 1 php pdo

我是PDO的新手,我编写了以下代码块:

$id = $_GET['id'];

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');

foreach($db->query("SELECT id,name FROM names where id = '$id' ") as $row) {
    echo "<p>", ($row['name']), "<br>";
}
Run Code Online (Sandbox Code Playgroud)

我的不确定性是:

  1. 因为我正在使用PDO,所以第一行中的OMIT mysql_real_escape_string是安全的
  2. 如果不使用绑定值运行上面的查询是安全的.

谢谢

Roc*_*mat 5

不,这不安全.PDO不会神奇地逃避您的查询.如图所示,您的代码对SQL注入非常开放.

如果您在查询中使用变量,请不要使用->query.不要试图自己逃避它们.你应该使用准备好的陈述.这是安全的方法.

$stmt = $db->prepare('SELECT id,name FROM names where id = ?');
if($stmt->execute(array($id))){
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        echo "<p>", ($row['name']), "<br>";
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,是的,您需要使用bindParam,或者execute如图所示.

PS mysql_real_escape_string是仅对于(废弃)mysql_扩展.它不适用于PDO.