3 回答
TA贡献1799条经验 获得超9个赞
你这样说:
我从没有看到最终查询,因为它已发送到数据库
好吧,实际上,在使用准备好的语句时,没有“ 最终查询 ”之类的东西:
首先,将一条语句发送到数据库,并在那里准备
数据库解析查询,并建立查询的内部表示
并且,当您绑定变量并执行该语句时,只有变量会发送到数据库
然后数据库将值“注入”到语句的内部表示中
因此,回答您的问题:
有没有一种方法可以捕获由PDO发送到数据库的完整SQL查询并将其记录到文件中?
否:由于任何地方都没有“ 完整的SQL查询 ”,因此无法捕获它。
出于调试目的,您可以做的最好的事情是通过将值注入到语句的SQL字符串中来“重构”一个“真实的” SQL查询。
在这种情况下,我通常要做的是:
使用占位符回显与该语句对应的SQL代码
并在之后使用
var_dump
(或等效项)显示参数的值即使您没有可以执行的任何“真实”查询,通常也足以看到可能的错误。
就调试而言,这并不好-但这是准备好的语句的价格及其带来的优势。
TA贡献1906条经验 获得超3个赞
在数据库日志中查找
尽管Pascal MARTIN认为PDO不会一次向数据库发送完整的查询是正确的,但是ryeguy关于使用DB的日志记录功能的建议实际上使我可以看到完整的查询是由数据库组装和执行的。
方法如下:(这些说明适用于Windows计算机上的MySQL-您的工作量可能会有所不同)
在
my.ini
,下[mysqld]
部分中,添加一个log
命令,如log="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
重新启动MySQL。
它将开始记录该文件中的每个查询。
该文件将快速增长,因此请确保在完成测试后将其删除并关闭日志记录。
TA贡献1846条经验 获得超7个赞
当然,您可以使用此模式进行调试。{{ PDO::ATTR_ERRMODE }} 只需在查询之前添加新行,即可显示调试行。
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$db->query('SELECT *******');
- 3 回答
- 0 关注
- 659 浏览
添加回答
举报