php - 我如何查看调用 mysqli->prepare 产生的查询的最终文本?

标签 php mysql mysqli

像这样的代码之后:

$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';”)

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

最佳答案

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

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

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

因此,无法获取准备好的语句的 SQL -- 因为没有这样的 SQL


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

  • 手动创建与准备好的语句对应的 SQL 查询。
  • 或者输出语句的代码,带占位符;和数据列表
    • 这意味着您将没有可以执行的真正的 SQL 查询
    • 但这通常足以帮助调试

关于php - 我如何查看调用 mysqli->prepare 产生的查询的最终文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2648515/

相关文章:

来自 mysql 的 php 数组

php 71 不创建 php7.0-fpm.sock

php - 升级到 MySQLi - 就像将 mysql 换成 mysqli 一样简单?

php - Magento::类别和子类别

php - 解析多语言提要的最佳实践

mysql - cakephp - 更大的 (>) 不工作

mysql - 计算总行和真实条件行

php - mysqli 插入查询的结果不稳定

PHP 不会解析完整的 JSON 文件以获得所有结果

php - fatal error :调用未定义的方法 mysqli::error()