PHP 命令不同步:解决多个预准备语句使用中的错误
在 PHP 中,当尝试使用 MySQLi 执行多个预准备语句时,您可能会遇到错误“命令不同步,您现在无法运行该命令。”此错误的发生是由于 MySQLi 对查询结果集的默认处理。
导致此错误的一个潜在原因是执行查询时使用 MYSQLI_USE_RESULT。此模式通过避免缓冲整个结果集来优化性能。但是,它要求您使用 mysqli_free_result() 手动释放结果。如果在执行后续语句之前未能这样做,命令序列将变得不同步。
要解决此问题,请确保在从每个语句中获取所有行后调用 mysqli_free_result()。或者,您可以使用 store_result() 方法将整个结果集存储在内存中,以便您稍后访问它,而不必担心潜在的冲突。
此错误的另一个常见原因是存在来自以下位置的待处理结果:之前的查询。在循环内执行多个查询时,请确保在处理每个结果集后调用 mysqli_next_result()。此方法释放任何剩余结果并为后续查询准备连接。
以下是如何通过调用 mysqli_free_result() 和 mysqli_next_result() 来修复错误的示例:
$stmt = $mysqli->prepare("SELECT id, username, password, firstname, lastname, salt FROM members WHERE email = ? LIMIT 1"); $stmt->bind_param('s', $loweredEmail); $stmt->execute(); $stmt->store_result(); $stmt->bind_result($user_id, $username, $db_password, $firstname, $lastname, $salt); $stmt->fetch(); $stmt->free_result(); $stmt->close(); while ($mysqli->more_results()) { $mysqli->next_result(); } $stmt1 = $mysqli->prepare("SELECT privileges FROM delegations WHERE id = ? LIMIT 1"); $stmt1->bind_param('s', $user_id); $stmt1->execute(); $stmt1->store_result(); $stmt1->bind_result($privileges); $stmt1->fetch();
通过正确处理结果集并在不需要时释放它们,可以避免“命令不同步”错误并确保多个准备好的无缝执行声明。
以上是为什么在使用多个 PHP MySQLi 准备语句时会出现'命令不同步”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!