0

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

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

在这种情况下,绑定还有任何意义notified,因为这是静态值,所以在插入新消息时始终为 0 的字段from_deletedto_deleted


我需要修改我的问题。我知道出于安全原因,没有理由绑定不是从用户生成的字段/值。在我的情况下,没有理由绑定文件notified,因为它们总是 0。但我真正的问题是我是否应该出于其他原因绑定这些字段(缓存)。mysql 会缓存整个查询语句还是只缓存绑定的参数?from_deletedto_deleted

4

1 回答 1

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();
}
于 2012-07-21T08:10:59.627 回答