【问题标题】:PDO Debugging - View Query AFTER Bind? [duplicate]PDO 调试 - 绑定后查看查询? [复制]
【发布时间】: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 声明最终是,这对我没有帮助哪里出错了。
  • @StuckAtWork 你能告诉我们不工作的代码吗?

标签: php mysql debugging pdo


【解决方案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 被绑定的内容。
  • 有效的语法并不意味着没有错误。我的调试函数需要知道绑定的值是什么,并且存在大量具有有效语法的错误。
猜你喜欢
  • 2021-04-28
  • 2012-05-18
  • 2023-03-13
  • 2013-03-07
  • 2015-06-12
  • 1970-01-01
  • 2019-04-03
  • 2011-01-25
相关资源
最近更新 更多