存储过程在与 fetch_all 一起使用时导致 mysqli 出现问题


Stored Procedure causing problems with mysqli when used with fetch_all

我已经将这个问题分解为它的本质,但仍然有问题。

当我尝试使用 fetch_all 获取存储过程的结果时,我得到的结果按预期返回到数组,但随后的 mysqli 调用会引发"命令不同步"错误。

我什至尝试简化我的存储过程以...

CREATE PROCEDURE testp()
BEGIN
   SELECT * FROM tbl
END

我把桌子做小了,10 行 3 列。

我使用以下 PHP

$query = "CALL testp()";
$result = $db->query($query);
$rows = $result->fetch_all(MYSQL_ASSOC);
$result->free();
print_r($rows);
$query = "SELECT * FROM tbl WHERE id = ?";
$stmt = $this->db->prepare($query);
echo $this->db->error;
$stmt->close();

回声的"命令不同步;您现在无法运行此命令"和投掷致命错误:在非对象上调用成员函数 close()

按预期$rows输出

有什么想法吗?

老实说,这实际上是mysqli的工作方式!事情以 2 为批次发生,这意味着您需要在执行其他任何操作之前清除最后一个结果。如果你不 ->错误!

您可以使用 next_result() 来实现这一点,示例如下:

while($this->_mysqli->next_result());

..然后继续成功执行您的代码。上面的示例适合在返回数组之前运行fetch_assoc_进程之后。

(我知道这是 3 个月前问过的,但迟到总比从不;)