[英]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::prepare
和bind_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;
};
}
您发表的许多评论表明您的问题实际上是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.