我正在努力学习在PHP中使用mysqli的预处理语句,通常,如果我遇到查询问题,我只需将它回显到屏幕上,看看它的第一步看起来是什么样子.
如何用准备好的声明做到这一点?
我希望在替换变量后看到SQL语句.
Pas*_*TIN 20
使用准备好的陈述
在PHP端没有"构建"SQL查询,因此,实际上无法获得该查询.
这意味着如果要查看SQL查询,则必须使用SQL查询,而不是使用预准备语句.
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)
当我需要调试带有参数的准备好的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 %s。printf将把所有解释为一个字符串,将每个参数放置在每个替换的 上%s。