从"mysqli-> prepare"导出"查询"

Gui*_*nto 5 php mysqli prepared-statement

是否可以导出由mysqli::prepare和格式化的查询::bind_param

例:

<?php
$mysqli = new mysqli('host', 'user', 'pass', 'table');
if(mysqli_connect_errno()){
    printf('Connect failed: %s\n', mysqli_connect_error());
    exit;
}

$data=7290;

if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){
    $stmt->bind_param('i',$data);
    $stmt->execute();
    $stmt->bind_result($id,$info);
    while($q=$stmt->fetch()){
        echo $id,': ',$info,'<br>';
    }
    $stmt->close();
}
$mysqli->close();
?>
Run Code Online (Sandbox Code Playgroud)

我想导出QUERY由执行的功能mysql::preparebind_param 如此(这是一个假想的示例):

if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){
    $stmt->bind_param('i',$data);
    $stmt->execute();
    echo $stmt->exportQuery();//Function does not exist, just for example
Run Code Online (Sandbox Code Playgroud)

该函数::exportQuery将打印如下:

SELECT `id`,`info` FROM `propertys` WHERE id>7290
Run Code Online (Sandbox Code Playgroud)

有什么办法吗?

谢谢.

Bil*_*win 6

我知道这对调试很有用,但它不是预处理语句的工作方式.参数不与客户端的预准备语句组合.PHP永远不应该访问与其参数结合的查询字符串.

执行prepare()时,SQL语句将发送到数据库服务器,执行execute()时会单独发送参数.MySQL的通用查询日志确实显示了在执行()后插值的最终SQL.以下是我的常规查询日志的摘录.我从mysql CLI运行查询,而不是从PHP运行,但原理是一样的.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1
Run Code Online (Sandbox Code Playgroud)

你的评论:

@Baily是正确的,MySQL没有客户端解决方案来返回带有插值参数的完整查询.这不是PHP的错.

要启用上面提到的日志记录,请在MySQL客户端中使用此命令,或者通过API从PHP提交:

SET GLOBAL general_log = ON;
Run Code Online (Sandbox Code Playgroud)

完成收集信息后应该关闭日志,因为记录每个查询会花费一些开销.

SET GLOBAL general_log = OFF;
Run Code Online (Sandbox Code Playgroud)

PS:动态更改日志记录设置需要MySQL 5.1或更高版本.在早期版本中,您必须在更改日志记录时重新启动mysqld.