使用MySQL调试PDO准备的查询


Debugging PDO prepared queries with MySQL

我正在从mysql_*调用更改为使用PDO调用,在开发新代码时无法弄清楚如何调试实际的SQL。

mysql_*调用下,我可以在PHP函数中编写一些SQL,也可以echo实际的SQL来查看处理器在使用什么。

我还没能在PDO库中找到这样的野兽。debugDumpParams看起来应该是这样的,但它没有吐出绑定语句。

我遇到的问题示例:

  1. 在我的第一次尝试中,我绑定了一个字符串,并在SQL语句中包含了引号,尽管绑定的data_type为string——我只是侥幸地尝试从语句中删除引号;调试会让我看到里面有一个重复的引号。

  2. 我把一些代码从一个项目复制到另一个项目,不小心忘了更正数据库名称。SQL自然会失败,因为其他数据库中不存在这些表。但程序只是返回了正确的错误结果。在PHP日志、MySQL日志或任何地方,我都没有得到表不存在的提示。

那么,其他人是如何调试PDOSQL调用的呢?我缺少什么?:)

对于第一个问题,检查查询确实很困难。除了在数据库服务器上记录查询之外,您对此无能为力。原因是准备好的查询并不是(总是)简单地将数据连接到查询中。关键是数据是与查询分开发送的。您可以通过$yourStatement->queryString访问查询字符串。它将只显示带有参数的查询。

对于第二个问题,默认情况下,当发生错误时,PDO不会抛出异常。这取决于你检查他们。不过你可以改变这个。http://php.net/manual/en/pdo.error-handling.php

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后,您可以通过查询执行过程中的try/catch块来发现问题。