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:如果您不使用全局空间之类的东西,那么您应该可以毫无问题地告诉您查询中的内容。 查看答案编辑;这个问题不是很明显,但如果我能够看到它到底是什么,它就会有约束力。根据几个条件,它绑定了与:fieldValues 不同的东西。我必须手动检查并检查哪些行正在执行,以查看 :fieldValue 被绑定的内容。 有效的语法并不意味着没有错误。我的调试函数需要知道绑定的值是什么,并且存在大量具有有效语法的错误。

以上是关于PDO 调试 - 绑定后查看查询? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

windowsdmp文件的复制后找不到调试信息

PDO错误调试

Xamarin.iOS:捆绑笔尖没有被复制到模拟器/设备以进行调试/发布

调试 PDO mySql 将 NULL 插入数据库而不是空

低代码平台-宜搭的核心概念

从 PDO 准备语句中检索(或模拟)完整查询