5

是否可以导出由mysqli::prepareand格式化的查询::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();
?>

我想导出由等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

该函数::exportQuery将像这样打印:

SELECT `id`,`info` FROM `propertys` WHERE id>7290

有什么解决办法吗?

谢谢。

4

3 回答 3

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

回复您的评论:

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

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

SET GLOBAL general_log = ON;

收集完信息后,您应该关闭日志,因为记录每个查询确实需要一些开销。

SET GLOBAL general_log = OFF;

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

于 2013-06-13T22:28:34.790 回答
0

准备好的语句不能那样工作,你看不到语句是有原因的,因为它应该能够在不进行操作的情况下传递给数据库。

因此,唯一的解决方案是将数据附加到字符串,然后回显或保存到变量。

编辑以包括您评论的安全问题..

//Assume you're using $_GET to get the id
$data = mysql_real_escape_string($_GET['yourID']);

$yourStatement = 'SELECT `id`,`info` FROM `propertys` WHERE id>';
$savedStatement = $yourStatement.$data;

echo $savedStatement;
//Will return 'SELECT `id`,`info` FROM `propertys` WHERE id>4'

if ($stmt = $mysqli->prepare($yourStatement.'?')){
$stmt->bind_param('i',$data);
$stmt->execute();
  }
于 2013-06-14T21:01:39.530 回答
-1

您可以在 echo 行上重复查询字符串,然后手动将变量放入字符串中,如下所示:

if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){
    $stmt->bind_param('i',$data);
    if($stmt->execute()){
        echo 'SELECT `id`,`info` FROM `propertys` WHERE id>'.$data;
    };
}

您发布的许多评论表明您的问题实际上是:

如何显示在 MySQL 上执行的最后一个查询?

于 2013-06-14T20:48:22.130 回答