我正在学习PHP,通常使用预准备语句与mysqli的,如果我有一个查询我只是将其回显到屏幕上看到它看起来像问题的第一步。
我如何能做到这一点用事先准备好的声明中?
我想看看SQL语句中的变量被取代了。
我正在学习PHP,通常使用预准备语句与mysqli的,如果我有一个查询我只是将其回显到屏幕上看到它看起来像问题的第一步。
我如何能做到这一点用事先准备好的声明中?
我想看看SQL语句中的变量被取代了。
使用准备好的语句:
有没有在PHP端的SQL查询的“建筑”,那么,有没有办法真正得到该查询。
这意味着,如果你想看到一个SQL查询,您必须使用,那么,SQL查询,并没有准备好的语句。
对于与mysql_stmt_prepare(),并在mysql_stmt_execute()C API函数执行预处理语句,服务器写入准备和执行行一般查询日志,这样,当准备和执行的语句,你可以告诉。
[...]服务器写入以下行一般查询日志:
准备[1]选择?
执行[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";
我通常这样做时,我需要调试一个带参数的准备SQL。
准备和执行的例子:
$sql = "SELECT VAL1, VAL2 FROM TABLE(?, '?', '?', '?', '?', ?, '?', '?', '?')";
$prep = ibase_prepare( $sql ) or die("Error");
$query = ibase_execute($prep, $param1, $param2, .....) or $err = true;
^^^^^^^^^^^^^^^^^^^^^^^
最简单的方法来调试导致这句话的SQL:
printf( str_replace('?', '%s', $sql), $param1, $param2, ....);
^^^^^^^^^^^^^^^^^^^^^^
你只需要做一个printf的,取代了? 由一个%S准备的SQL字符串。 将printf的所有解释作为一个字符串,以每个参数为将它放在每个取代%S。
帕斯卡MARTIN(+1)同意,所以我建议进行调试另一种技术: var_dump()
或登录你插入语句中的每个变量,这样你应该能够弄清楚,如果是错误的数据或逻辑错误的SQL。
我最近更新的这个项目,包括作曲家集成,单元测试和参照更好地处理接受的参数(这需要更新到PHP 5.6)。
我创建了一组扩展默认类mysqli
和mysqli_stmt
类,允许你查看潜在的查询字符串,它应该提供您要查找的内容的再现:
https://github.com/noahheck/E_mysqli
这是给你一个正常的(接近)直接替代mysqli
返回一个自定义对象mysqli_stmt
当你的对象prepare()
查询字符串。 结合您的参数后, E_mysqli
将允许您查看生成的查询字符串作为一个新的属性stmt
对象:
$mysqli = new E_mysqli($dbHost, $dbUser, $dbPass, $dbName);
$query = "INSERT INTO registration SET name = ?, email = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $_POST['name'], $_POST['email']);
$stmt->execute();
echo $stmt->fullQuery;
会导致:
INSERT INTO registration SET name = 'John Doe', email = 'john.doe@example.com'
还有一些注意事项使用此扩展名(在GitHub上项目的README解释),但对于解决您的应用程序的麻烦的地方,或过渡到从程序的面向对象的风格,这应该提供帮助大多数用户的水平。
正如我在GitHub上项目所概述的,我没有使用有实际工作经验mysqli
扩展,并且这个项目是在它的用户的请求创建的姊妹项目,因此能够对开发者在使用该提供任何反馈生产将不胜感激。
免责声明 -正如我所说的,我做了这个扩展。
您可以像使用工具Lottip 。 我们的想法是像MySQL的代理行为。 它解析MySQL的数据包,提取查询和它的PARAMS,所以你可以看到准备的语句与它的内容。