php PDO - 您绑定(bind)所有参数吗?

标签 php mysql pdo

我一直想知道绑定(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) notifiedfrom_deletedto_deleted 字段也是有意义的,因为这是静态值,插入时始终为 0新消息?

<小时/>

我需要修改我的问题。我知道出于安全原因,没有理由也绑定(bind)不是由用户生成的字段/值。就我而言,没有理由绑定(bind)字段 notifiedfrom_deletedto_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/

相关文章:

PHP 如何正确处理生产服务器上的严重错误通知。

php - PDO 和存储过程的无缓冲查询错误

php - MySQL PDO dbname 在 MySQL 升级后停止工作

php - 在 Laravel 4 中转义原始 SQL 查询

php - 带变量的 Codeigniter MySQL 查询

php - 无法否定 mysql 中的条件

php - Robots.txt优先级问题

php - 在 Memcache 中更新/设置缓存数组的元素

php - 查询后使用php从多行中检索信息

javascript - Node.js 和 MySQL 函数使用