8

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

当我运行此代码时出现预期错误

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('I\'m','d\'Artagnan')' 附近

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

  1. 它从哪里得到如此熟悉的字符串表示 - 引用和转义?是专门报告错误还是实际查询的一部分?
  2. 它在现实中是如何工作的?它是否用数据替换占位符?
  3. 有没有办法获得整个查询,而不仅仅是一点点,用于调试目的?

更新

mysqli按预期做:它抛出一个错误说near 'INN(?,?)'

4

2 回答 2

7

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

  1. 报价发生在数据库端。数据库转义并清理它接收到的所有值(参见项目符号 2),以便正确解释。抛出错误的那一刻,数据库(在本例中为 MySQL)打印出它尝试运行的查询。如果它只是显示准备好的部分,这不会有太大帮助。

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

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

我希望这有点帮助。

于 2010-09-16T13:42:04.343 回答
7

尝试添加

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

;)

于 2010-09-16T15:28:51.277 回答