如何调试PDO数据库查询?

在转向PDO之前,我通过连接字符串在PHP中创建了SQL查询。如果出现数据库语法错误,我可以回显最终的SQL查询字符串,然后在数据库中自己尝试,然后对其进行调整,直到修复错误,然后将其重新放入代码中。

预先准备的PDO语句更快,更好,更安全,但有一件令我困扰的事情:在将最终查询发送到数据库时,我再也看不到。当我在Apache日志或自定义日志文件中收到有关语法的错误时(我将错误记录在一个catch块内),我看不到引起它们的查询。

有没有一种方法可以捕获由PDO发送到数据库的完整SQL查询并将其记录到文件中?


智慧大石
浏览 660回答 3
3回答

扬帆大鱼

你这样说:我从没有看到最终查询,因为它已发送到数据库好吧,实际上,在使用准备好的语句时,没有“ 最终查询 ”之类的东西:首先,将一条语句发送到数据库,并在那里准备数据库解析查询,并建立查询的内部表示并且,当您绑定变量并执行该语句时,只有变量会发送到数据库然后数据库将值“注入”到语句的内部表示中因此,回答您的问题:有没有一种方法可以捕获由PDO发送到数据库的完整SQL查询并将其记录到文件中?否:由于任何地方都没有“ 完整的SQL查询 ”,因此无法捕获它。出于调试目的,您可以做的最好的事情是通过将值注入到语句的SQL字符串中来“重构”一个“真实的” SQL查询。在这种情况下,我通常要做的是:使用占位符回显与该语句对应的SQL代码并在之后使用var_dump (或等效项)显示参数的值即使您没有可以执行的任何“真实”查询,通常也足以看到可能的错误。就调试而言,这并不好-但这是准备好的语句的价格及其带来的优势。

一只名叫tom的猫

在数据库日志中查找尽管Pascal MARTIN认为PDO不会一次向数据库发送完整的查询是正确的,但是ryeguy关于使用DB的日志记录功能的建议实际上使我可以看到完整的查询是由数据库组装和执行的。方法如下:(这些说明适用于Windows计算机上的MySQL-您的工作量可能会有所不同)在my.ini,下[mysqld]部分中,添加一个log命令,如log="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"重新启动MySQL。它将开始记录该文件中的每个查询。该文件将快速增长,因此请确保在完成测试后将其删除并关闭日志记录。

喵喵时光机

当然,您可以使用此模式进行调试。{{ PDO::ATTR_ERRMODE }} 只需在查询之前添加新行,即可显示调试行。$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );$db->query('SELECT *******');  
打开App,查看更多内容
随时随地看视频慕课网APP