PDO 调试 - 绑定后查看查询? [复制]
Posted
技术标签:
【中文标题】PDO 调试 - 绑定后查看查询? [复制]【英文标题】:PDO Debugging - View Query AFTER Bind? [duplicate] 【发布时间】:2012-06-22 18:25:30 【问题描述】:可能重复:Retrieve (or simulate) full query from PDO prepared statement
我不知道为什么我的查询返回 0 行。它实现了一些非常动态的搜索功能,以及许多 if/loop 语句等。因此要调试它,我想看看究竟是什么字符串正在发送到服务器。有没有办法通过 php 做到这一点?
有没有办法询问服务器“上次查询是什么”,或者告诉 PDO“告诉我你发送了什么”?
我看到一个使用str_replace
手动输入值来代替:fieldValue
的响应,但这可能是语法问题(或者可能是通过不正确的循环等),这种方法没有帮助.
使用bindValue(":fieldValue", $value);
,如果有影响的话。
编辑
原来是一个简单的if ($var="true") ...
,应该是if ($var=="true") ...
。从这个意义上说,我猜 PHP 与 Java 不一样?无论哪种方式,问题仍然存在(因为我经常遇到这种情况)。我不得不使用一系列echo "You are Here";
来找到这个错误,因为它在技术上是有效的,但不正确。如果我有最后的 SQL 语句,我可能会看到“哦,我的代码添加了 where column = true
,一定是通过了错误的 IF...”。
【问题讨论】:
如果准备/绑定没有被模拟,你所说的查询在任何地方都不存在。然后,语句和绑定成为数据库的组成部分。但是,在您的开发服务器上启用query_log
(永远不要在生产中这样做)可能会对所做的工作有所了解。
嗯,就是这样;我不知道该尝试什么。我通常使用简单的echo $sql
来执行此操作,其中$sql
是我的声明,但使用 PDO(我是新手),它只是向我显示 SELECT column FROM table WHERE column = :fieldValue
,如果 where 声明最终是,这对我没有帮助哪里出错了。
Retrieve (or simulate) full query from PDO prepared statement 和 ***.com/questions/530627/… 和 ***.com/questions/1786322/… 的可能重复项
@StuckAtWork 你能告诉我们不工作的代码吗?
【参考方案1】:
这是关于 SQL 调试的最常见的神话。 “我需要在准备好后查看查询,才能判断是否发生了错误”。事实是,你没有,我会告诉你原因。
一旦准备好查询,占位符就可以被视为有效的字符串/整数。你不在乎里面有什么。
此外,如果您正确设置 PDO,您将收到详细的 PDOException
详细说明您遇到的错误以及错误发生位置的完整回溯,以及从 mysql 获得的错误字符串,这使得语法错误很容易找到。
启用 PDO 异常并禁用模拟准备:
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
【讨论】:
我的错误处理正确;问题是没有错误。我需要知道实际发送的是什么,这样我才能知道它在我的代码中从哪里获取信息。由于无法检查最后的字符串,我无法分辨出什么在做什么。 “返回 0 行”,而不是“抛出错误”。 @StuckAtWork:如果您不使用全局空间之类的东西,那么您应该可以毫无问题地告诉您查询中的内容。 查看答案编辑;这个问题不是很明显,但如果我能够看到它到底是什么,它就会有约束力。根据几个条件,它绑定了与:fieldValue
s 不同的东西。我必须手动检查并检查哪些行正在执行,以查看 :fieldValue
被绑定的内容。
有效的语法并不意味着没有错误。我的调试函数需要知道绑定的值是什么,并且存在大量具有有效语法的错误。以上是关于PDO 调试 - 绑定后查看查询? [复制]的主要内容,如果未能解决你的问题,请参考以下文章