请仔细阅读本问题。这通常不是愚蠢的“我的代码不起作用!!!”问题
当我使用预期错误
运行此代码时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')'附近
但是多年来我一直在想,查询和数据会分别发送到服务器并且永远不会干扰。因此我有一些问题(虽然我怀疑有人得到答案......)
更新
mysqli
按预期执行:它会引发错误near 'INN(?,?)'
答案 0 :(得分:7)
我不确定所有细节,但我会尽力回答。
引用发生在数据库端。数据库转义并清理它收到的所有值(见子弹2),以便正确解释它。 抛出错误的那一刻,数据库(在本例中为MySQL)打印出它试图运行的查询。如果它只显示准备好的部分,那就没那么有用了。
不,它没有。在准备时,查询在服务器端进行编译。使用值执行查询时,仅传输值。这与直接在数据库上调用PREPARE和EXECUTE非常相似。
这取决于您使用的数据库。例如,MySQL可以将所有查询记录到日志文件中(请查看my.cnf设置)。但您也可以在PHP端使用debugDumpParams()。
我希望这有点帮助。
答案 1 :(得分:7)
尝试添加
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
)