在对准备好的语句调用PDOStatement::execute()时,有没有办法执行原始SQL字符串?出于调试目的,这将非常有用.

推荐答案

我假设您的意思是希望得到最终的SQL查询,并在其中插入参数值.我知道这对调试很有用,但这不是准备好的语句的工作方式.在客户端,参数不能与预先准备好的语句组合在一起,因此PDO永远不能访问与其参数组合在一起的查询字符串.

SQL语句在执行prepare()时发送到数据库服务器,参数在执行()时单独发送.MySQL的常规查询日志(log)确实显示了最终的SQL,并在执行()后插入值.下面是我的一般查询日志(log)的摘录.我从mysql CLI运行查询,而不是从PDO运行,但原理是一样的.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

如果设置PDO属性PDO::ATTR_EMULATE_PREPARES,也可以得到想要的结果.在这种模式下,PDO将参数插入SQL查询,并在执行()时发送整个查询.This is not a true prepared query.在execute()之前,通过在SQL字符串中插入变量,可以避免预先准备好的查询带来的好处.


来自@afilina的Re comments :

不,文本SQL查询在执行期间与参数组合为not.所以PDO没有什么可以给你看的.

在内部,如果您使用PDO::ATTR_EMOLATE_PREPARES,则PDO会复制SQL查询,并在执行准备和执行之前将参数值插入其中.但是PDO不公开这个修改后的SQL查询.

PDOStatement对象有一个属性$queryString,但该属性仅在PDOStatement的构造函数中设置,并且在使用参数重写查询时不会更新.

PDO要求他们公开重写的查询将是一个合理的功能请求.但是,即使这样也不会给出"完整"的查询,除非您使用PDO::ATTR_EMOLATE_PREPARES.

这就是为什么我在上面展示了使用MySQL服务器的常规查询日志(log)的解决方法,因为在这种情况下,即使是带有参数占位符的准备好的查询也会在服务器上重写,并将参数值回填到查询字符串中.但这只在日志(log)记录期间完成,而不是在查询执行期间.

Php相关问答推荐

添加自定义Metabox到WooCommerce管理订单,启用HPOS

如何使用URL链接(mdl)切换选项卡

管理员订单列表中的自定义列与WooCommerce 8.6.1一起消失

Laravel:让所有用户在一年中的特定月份休息几天

如果WooCommerce中存在特定的运输方式,则隐藏其他运输方式

使用正则表达式搜索两个子字符串(没有重叠/共享字符)

如何将WooCommerce产品属性术语名称显示为链接术语?

多行PHP属性声明中是否允许单行注释

PHP测试字符串的所有POST值

如何在WooCommerce产品子类别中显示特定内容

将一个按钮添加到WooCommerce产品的管理视图中,该按钮链接到一个自定义的WebHook,并在末尾附加产品ID

模仿GUZLE中的curl 工作脚本(分块数据和二进制上传一起)

在PHP项目中安装OpenAI PHP SDK时出现问题

如何使用PHP从TXM(XML)标记中读取特定属性

WooCommerce 按产品运输插件:仅收取较高的运输费用

使用产品自定义字段作为 WooCommerce 中特定用户角色的折扣百分比

htaccess Rewriterule 无法以任何方式工作

在WooCommerce单产品页面中显示特价产品的节省金额

在这个 Laravel 应用中,如何仅显示已批准的 comments 回复?

htaccess php 文件,然后是文件夹