我假设您的意思是希望得到最终的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)记录期间完成,而不是在查询执行期间.