如何查看预准备语句的内容?

2022-08-30 16:38:50

我正在努力学习在PHP中使用ready语句和mysqli,通常,如果我遇到查询问题,我只是将其回显到屏幕上,看看它作为第一步是什么样子。

我如何使用预准备语句执行此操作?

我希望在变量被替换后看到SQL语句。


答案 1

使用预准备语句:

  • 当您准备语句时,它将发送到MySQL服务器
  • 绑定变量+执行语句时,只有变量会发送到MySQL服务器
  • 语句+绑定变量在MySQL服务器上执行 - 无需在每次执行语句时重新执行“准备”(这就是为什么当多次执行相同语句时,预准备语句可以提高性能的原因)

在PHP端没有SQL查询的“构建”,因此,没有办法实际获取该查询。

这意味着,如果要查看 SQL 查询,则必须使用 SQL 查询,而不是预准备语句。


答案 2
对于使用 mysql_stmt_prepare() 和 mysql_stmt_execute() C API 函数执行的预准备语句,服务器将“准备”和“执行”行写入常规查询日志,以便您可以知道何时准备和执行语句。
[...] 服务器将以下行写入常规查询日志:
准备 [1] SELECT ?
执行 [1] 选择 3

因此,出于调试目的,请激活常规日志并密切关注该文件。

编辑:哦,这个问题有一个[mysqli]标签...完全忽略了这一点。
如果语句根本没有执行,您是否(双/三次)检查在此过程中没有发生错误?

echo "<pre>Debug: start</pre>\n";

$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test');
if ($mysqli->connect_error) {
  die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

$result = $mysqli->query('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, primary key(id))');
if ( false=== $result) { 
 die('error : '. $mysqli->error);
}

$stmt = $mysqli->prepare('INSERT INTO foo (x) VALUES (?)');
if ( false===$stmt ) {
  die ('prepare() failed: ' . $mysqli->error);
}

$result = $stmt->bind_param('i', $x);
if ( false===$result ) {
  die('bind_param() failed');
}

$x = 1;
$result = $stmt->execute();
if ( false===$result ) {
  die('execute() failed: '.$stmt->error);
}

echo "<pre>Debug: end</pre>\n";

推荐