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

当我使用此代码 预期的错误

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语法中有一个错误...附近的“ Inn('i 'm','d 'artagnan')”在第1行

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

  1. 它在哪里得到如此熟悉的字符串表示形式 - 引用和逃脱?是特别报告错误还是实际查询的一部分?
  2. 它如何实现?它是否用数据代替占位符?
  3. 有没有办法为调试目的获取整个查询,而不仅仅是一点查询?

更新

mysqli 是否按预期进行:它引发的错误说 near 'INN(?,?)'

有帮助吗?

解决方案

尝试添加

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

;)

其他提示

我不确定所有细节,但我会尝试回答。

  1. 引号发生在数据库侧。数据库逃脱并消毒了所有值(请参阅子弹2),以便正确解释。抛出错误的那一刻,数据库(在这种情况下为MySQL)打印出试图运行的查询。如果仅显示准备好的部分,这将不会有帮助。

  2. 不,不是。在准备时间,查询将在服务器端编译。当查询使用值执行时,仅传输值。这与直接在数据库上进行准备和执行几乎相同。

  3. 这取决于您正在使用的数据库。例如,MySQL可以将所有查询记录到日志文件(请检查My.cnf设置)。但是你也可以使用 debugdumpparams() 在PHP一侧。

我希望这有点有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top