【问题标题】:How Do I See The Final Text Of A Query Resulting From A Call To mysqli->prepare?如何查看由调用 mysqli->prepare 产生的查询的最终文本?
【发布时间】:2011-02-08 13:30:34
【问题描述】:

在这样的代码之后:

$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
$stmt->bind_param("s", $city);
$stmt->execute();
$stmt->bind_result($district);
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);

如何查看实际执行的 SQL 语句?

(它应该类似于“SELECT District FROM City WHERE Name='Simi Valley';”)

我已经意识到,在这种简单的情况下,简单地重构查询将非常容易......但是我如何才能以一种适用于非常复杂的准备语句的通用方式访问它,以及我不这样做的情况一定已经理解了查询的预期结构等。是不是可以在语句对象上调用某些函数或方法,在绑定后返回 SQL 查询的实际文本?

【问题讨论】:

  • 通常绑定是在数据库中完成的,所以你能做的最好的就是在应用层“模拟”它。你能澄清你想要做什么吗?如果您正在跟踪发送了哪些查询,为什么不从数据库端查看?
  • 我实际上从未尝试过这个,所以我将它作为评论留下。查询后,您也许可以得到使用var_dump($mysqli->info());执行的实际查询
  • 好的,我试试从DB端看。

标签: php mysql mysqli


【解决方案1】:

如果你这样设置,PDO 会模拟绑定;在this topic 中,您可以阅读有关 debugDumpParams 语句的信息,该语句也在PHP documentation 中。但是,当您将值替换留给真正的 sql 引擎时,无法检查值替换是否正确发生;一种解决方法可能是其中包含字段占位符的 SELECT,以便在结果中获得实际的字符串值:

SELECT :field1 as field1, :field2 as field2

如果你绑定并获取这个,它将包含值:

Array
(
    [field1] => Lorem ipsum
    [field2] => dolor sit amet
)

有了这个,您可以构建自己的调试函数,使用 sql 的 CONCAT 将原始查询字符串拼接在一起 - 但您不会从中学到很多东西,因为 SQL 在参数绑定方面非常可靠:)

【讨论】:

    【解决方案2】:

    当您使用准备好的语句时,没有“SQL 查询”:

    • 首先,您有一个包含占位符的语句
      • 这条语句被发送到数据库服务器,并在那里准备
      • 这意味着对 SQL 语句进行分析、解析,并且在内存中准备了一些表示它的数据结构
    • 然后,你有绑定变量
      • 发送到服务器
      • 并执行准备好的语句 -- 处理这些数据

    但是实际上并没有重建实际的真实 SQL 查询——无论是在 PHP 端,还是在数据库端。

    所以,没有办法获取准备好的语句的 SQL —— 因为没有这样的 SQL


    如果您需要查看一些信息,出于调试目的,如您所说,您通常有两种选择:

    • 要么创建与预准备语句相对应的 SQL 查询 + 手动绑定
    • 或者用占位符输出语句的代码;和数据列表
      • 这意味着您将无法执行真正的 SQL 查询
      • 但通常就足够了,有助于调试

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 2017-05-14
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多