如何查看准备好的声明的内容?

Sto*_*ped 21 php mysql mysqli

我正在努力学习在PHP中使用mysqli的预处理语句,通常,如果我遇到查询问题,我只需将它回显到屏幕上,看看它的第一步看起来是什么样子.

如何用准备好的声明做到这一点?

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

Pas*_*TIN 20

使用准备好的陈述

  • 准备语句时,会将其发送到MySQL服务器
  • 绑定变量+执行语句时,只将变量发送到MySQL服务器
  • 并且语句+绑定变量在MySQL服务器上执行 - 每次执行语句时都不会重新执行"准备" (这就是为什么预处理语句在执行多次相同语句时可以提高性能的原因)

在PHP端没有"构建"SQL查询,因此,实际上无法获得该查询.

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

  • 好吧,这有点烦人 =\ 您会认为有一种方法可以获取已执行的语句 (2认同)

Vol*_*erK 12

对于使用mysql_stmt_prepare()和mysql_stmt_execute()C API函数执行的预准备语句,服务器将Prepare和Execute行写入常规查询日志,以便您可以判断语句的准备和执行时间.
[...]服务器将以下行写入常规查询日志:
准备[1] SELECT?
执行[1] SELECT 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";
Run Code Online (Sandbox Code Playgroud)


Net*_*ous 6

当我需要调试带有参数的准备好的sql时,我通常会这样做。

准备和执行示例:

$sql = "SELECT VAL1, VAL2 FROM TABLE(?, '?', '?', '?', '?', ?, '?', '?', '?')";
$prep = ibase_prepare( $sql ) or die("Error");
$query = ibase_execute($prep, $param1, $param2, .....) or $err = true;
                              ^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

调试语句结果 SQL 的简单方法是:

printf( str_replace('?', '%s', $sql), $param1, $param2, ....);
                                      ^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

您只需执行一次 printf,将?准备好的 SQL 字符串上的 替换为 1 %sprintf将把所有解释为一个字符串,将每个参数放置在每个替换的 上%s