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::prepare
和bind_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)
有什么办法吗?
谢谢.
我知道这对调试很有用,但它不是预处理语句的工作方式.参数不与客户端的预准备语句组合.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.