prepare"-6ren"> prepare"-是否可以导出由 mysqli::prepare 和 ::bind_param 格式化的查询? 例子: prepare('SELECT `id`,`info` FROM `propertys` WHER-6ren">
gpt4 book ai didi

php - 从 "query"导出 "mysqli->prepare"

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:36:13 26 4
gpt4 key购买 nike

是否可以导出由 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 永远不应访问查询字符串及其参数。

SQL语句在prepare()时发送到数据库服务器,参数在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。

关于php - 从 "query"导出 "mysqli->prepare",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com