你好我有几个要执行的查询,都返回独立的结果集:
select * from table;
call procedureA(par1);
call procedureB(par2);
我想在循环中执行它们以执行其他操作:
$queries = array("select * from table;", "call procedureA(par1);", "call procedureB(par2);");
foreach($queries as $query) {
$res=$db->query($query);
// do something here with the query result
someFunction($res);
}
第一个声明运行良好;在第二次迭代中,它停止声明$ res是非对象:
Call to a member function ... on a non-object
除了使用 mysqli_multi_query()之外,我可以循环执行多个查询吗?
更新我从代码示例中删除了 $ res-> close(); ,因为它对此问题有误导性和影响。
UPDATE2 - 解决方案 对于任何人来说,这是一个完整的工作代码:
$queries = array(
"CALL procedureA(par1)"
,"CALL procedureB()"
, "Select * from tableC"
);
// Open connection
$db = new mysqli(
$config['host']
,$config['user']
,$config['pwd']
,$config['dbname']
);
foreach($queries as $query) {
if ($res instanceof mysqli_result) {
$res->free();
}
$res=$db->query($query);
// do something with the query
echo getHtmlTable($res);
// free current result
$res->free();
// free subsequent resultset (es. the one with OK/ERR sp call status)
while ($db->next_result()) {
//free each result.
$res = $db->use_result();
if ($res instanceof mysqli_result) {
$res->free();
}
}
}
答案 0 :(得分:1)
在循环中运行查询没有什么特别之处。
如果您一个接一个地编写两个查询,或者在循环中运行它们,则没有区别。因此,一般来说,在循环中运行的几个查询与在我们所有脚本中运行的几个查询没有区别。
查询本身唯一可能出现的问题。比如说,存储过程调用总是返回至少两个结果集。在检索完所有结果集之前,不能运行任何其他查询。
因此,作为一个快速而肮脏的解决方案,可以添加这样的一行
while ($db->next_result()) {}
在循环的底部清理查询执行后可能保留在队列中的所有结果集。
为mysqli打开错误报告也很方便,让你知道发生的所有mysql错误。有了这个,你会在你的问题中添加这样的错误信息(这是“命令不同步”)。为此,请在mysqli connect之前添加此行:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
答案 1 :(得分:0)
$r->close();
应该是
$res->close();
您正在引用一个不存在的对象($ r)。
多个查询的执行取决于服务器配置。但除了thas。这会更好地使用事务(当然,这取决于那些存储过程的效果)