php PDO - 你绑定所有parms吗?

时间:2012-07-21 08:06:01

标签: php mysql pdo

我一直想知道绑定整个值列表是否是一个好习惯。例如,我必须遵循以下查询:

INSERT INTO messages 
  (thread_id,message,from_id,to_id,to_viewed,notified,from_deleted,to_deleted,created)
  SELECT :threadId,:msg,:fromId,:toId,0,0,0,0,:createdTime FROM messages 
    WHERE thread_id = :threadId AND to_id=:toId LIMIT 1

在这种情况下,绑定notifiedfrom_deletedto_deleted字段是否有意义,因为这是静态值,插入新的msg时总是0?


我需要修改我的问题。我知道出于安全原因,没有理由绑定非用户生成的字段/值。在我的情况下,没有理由绑定文件notifiedfrom_deletedto_deleted,因为它们始终为0.但我真正的问题是我应该出于其他原因(缓存)绑定这些字段。请问mysql会缓存整个查询语句还是仅限绑定的parms?

1 个答案:

答案 0 :(得分:1)

实际上,只需要绑定来自外部源(您还应该删除html字符,脚本)的变量的参数(准备好的查询)。当您执行准备好的查询时,PDO将转换引号以防止sql注入。您可以直接将静态变量放入查询中,因为您(开发人员)知道要查找0或1是安全的,或者甚至是一些静态字符串。其余的只是具有语法正确的查询。

您可以运行此查询以使用sequelpro,phpmyadmin,mysql cli或任何其他sql实用程序插入测试行(假设您运行的是mysql)

INSERT INTO messages 
  (thread_id,message,from_id,to_id,to_viewed,notified,from_deleted,to_deleted,created)
  VALUES (1, 'Blah', 1, 2, 3, 0, 0, 0, '2012-07-21');

PDO示例

try {
    $dbh = new PDO($dsn, $user, $password);
    $sth = $dbh->prepare('SELECT * FROM messages WHERE thread_id = :threadId AND to_id=:toId LIMIT 1');
    $sth->execute(array(':threadId' => $id, ':toId' => $to_id));
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}