PDO参数化查询的工作方式

时间:2010-09-16 13:35:24

标签: php pdo parameterized-query

请仔细阅读本问题。这通常不是愚蠢的“我的代码不起作用!!!”问题

当我使用预期错误

运行此代码时
try {
  $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
  $sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
    echo $e->getMessage();
}

我收到此错误消息

  

您的SQL语法错误...在第1行'INN('我'','d \'Artagnan')'附近

但是多年来我一直在想,查询和数据会分别发送到服务器并且永远不会干扰。因此我有一些问题(虽然我怀疑有人得到答案......)

  1. 它在哪里获得如此熟悉的字符串表示 - 引用和转义?它是否特别报告错误或是否是实际查询的一部分?
  2. 它是如何实际运作的?它是否用占位符代替数据?
  3. 为了调试目的,有没有办法获得整个查询,而不仅仅是一点点?
  4. 更新

    mysqli按预期执行:它会引发错误near 'INN(?,?)'

2 个答案:

答案 0 :(得分:7)

我不确定所有细节,但我会尽力回答。

  1. 引用发生在数据库端。数据库转义并清理它收到的所有值(见子弹2),以便正确解释它。 抛出错误的那一刻,数据库(在本例中为MySQL)打印出它试图运行的查询。如果它只显示准备好的部分,那就没那么有用了。

  2. 不,它没有。在准备时,查询在服务器端进行编译。使用值执行查询时,仅传输值。这与直接在数据库上调用PREPARE和EXECUTE非常相似。

  3. 这取决于您使用的数据库。例如,MySQL可以将所有查询记录到日志文件中(请查看my.cnf设置)。但您也可以在PHP端使用debugDumpParams()

  4. 我希望这有点帮助。

答案 1 :(得分:7)

尝试添加

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );