我正在从mysql_*
调用更改为使用PDO调用,在开发新代码时无法弄清楚如何调试实际的SQL。
在mysql_*
调用下,我可以在PHP函数中编写一些SQL,也可以echo
实际的SQL来查看处理器在使用什么。
我还没能在PDO库中找到这样的野兽。debugDumpParams
看起来应该是这样的,但它没有吐出绑定语句。
我遇到的问题示例:
-
在我的第一次尝试中,我绑定了一个字符串,并在SQL语句中包含了引号,尽管绑定的data_type为string——我只是侥幸地尝试从语句中删除引号;调试会让我看到里面有一个重复的引号。
-
我把一些代码从一个项目复制到另一个项目,不小心忘了更正数据库名称。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块来发现问题。