繁体   English   中英

从“ mysqli->准备”导出“查询”

[英]Export “query” from “mysqli->prepare”

是否可以导出由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();
?>

我想导出由mysql::preparebind_param执行的QUERY函数,所以(这是一个虚构的示例):

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

有什么解决办法吗?

谢谢。

我知道这对调试很有用,但是它不是准备好的语句的工作方式。 参数不会与客户端上的预准备语句结合在一起。 PHP永远不能访问查询字符串及其参数。

当您执行prepare()时,SQL语句将发送到数据库服务器,而当您执行execute()时,将分别发送参数。 MySQL的常规查询日志的确显示了最终SQL,其中包含在execute()之后插入的值。 以下是我的一般查询日志的摘录。 我从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。

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

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

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

//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();
  }

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

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上执行的最后一个查询?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM