我一直想知道绑定整个值列表是否是一个好习惯。例如,我必须遵循以下查询:
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
,from_deleted
和to_deleted
字段是否有意义,因为这是静态值,插入新的msg时总是0?
我需要修改我的问题。我知道出于安全原因,没有理由绑定非用户生成的字段/值。在我的情况下,没有理由绑定文件notified
,from_deleted
和to_deleted
,因为它们始终为0.但我真正的问题是我应该出于其他原因(缓存)绑定这些字段。请问mysql会缓存整个查询语句还是仅限绑定的parms?
答案 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();
}