PDO调试 - 在绑定之后查看查询?

17 浏览
0 Comments

PDO调试 - 在绑定之后查看查询?

我弄不清楚为什么我的查询返回了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...”。

0
0 Comments

问题的原因是开发者需要查看绑定后的查询语句以便检测错误,但实际上这是一个错误的观念。一旦查询语句被准备好,占位符可以被视为一个有效的字符串或整数,不需要关心其中的内容。正确设置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行"而不是"抛出错误"。

最后,有效的语法并不意味着没有错误。调试函数需要在查询执行后知道绑定的值是什么,而这种错误属于有效语法的大类。

开发者不需要在绑定后查看查询语句以检测错误,而是通过正确设置PDO来获取详细的错误信息。在不使用全局变量的情况下,开发者可以轻松地知道查询中传入了什么内容。如果需要查看绑定后的值,可以手动检查执行的代码来获取。有效的语法并不保证没有错误,因此需要使用适当的调试方法来获取绑定的值。

0