MySQL客户端不允许您执行新的查询,在该查询中仍需要从正在进行的查询中获取行。有关常见错误,请参见MySQL文档中的命令不同步。
您可以用来
mysqli_store_result()从外部查询中预提取所有行。这会将它们缓冲在MySQL客户端中,因此从服务器的角度来看,您的应用已获取了完整的结果集。然后,即使在从现在缓冲的外部结果集中提取行的循环中,您也可以执行更多查询。
或者,您
mysqli_result::fetch_all()将完整的结果集作为PHP数组返回,然后可以在该数组上循环。
调用存储过程是一种特殊情况,因为存储过程有可能返回多个结果集,每个结果集可能都有自己的行集。这就是为什么@
a1ex07的答案提到使用
mysqli_multi_query()和循环直到
mysqli_next_result()没有更多结果集。即使您的存储过程只有一个结果集,这也必须满足MySQL协议。
PS:顺便说一句,我看到您正在执行嵌套查询,因为您有代表层次结构的数据。您可能要考虑以不同的方式存储数据,以便可以更轻松地查询它。我做了一个名为“
SQL和PHP的分层数据模型”的演讲。我还在《SQL反模式:避免数据库编程的陷阱》一章中介绍了该主题。
这是
mysqli_next_result()在CodeIgnitor 3.0.3中实现的方法:
在
system/database/drivers/mysqli/mysqli_driver.php变化的第262行
protected function _execute($sql){ return $this->conn_id->query($this->_prep_query($sql));}对此
protected function _execute($sql){ $results = $this->conn_id->query($this->_prep_query($sql)); @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error return $results;}从2.x开始,这一直是一个问题。我刚刚更新到3.x,并且不得不将此破解复制到新版本中。



