我一直想知道绑定(bind)整个值列表是否是一个好习惯。例如我必须执行以下查询:
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
在这种情况下,绑定(bind) notified
、from_deleted
和 to_deleted
字段也是有意义的,因为这是静态值,插入时始终为 0新消息?
我需要修改我的问题。我知道出于安全原因,没有理由也绑定(bind)不是由用户生成的字段/值。就我而言,没有理由绑定(bind)字段 notified
、from_deleted
和 to_deleted
因为它们始终为 0。但我真正的问题是我应该绑定(bind)这些字段吗由于其他原因(缓存)。 mysql 会缓存整个查询语句还是仅缓存绑定(bind)的参数?
最佳答案
实际上只需要像您所说的那样绑定(bind)来自外部源(您还应该删除 html 字符、脚本)的变量的参数(准备好的查询)。当您执行准备好的查询时,PDO 将转换引号以防止 sql 注入(inject)。您可以直接将静态变量放入查询中,因为您(开发人员)知道查找 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();
}
关于php PDO - 您绑定(bind)所有参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11590533/