在使用 PHP 进行数据库操作,特别是使用 执行多条 SQL 查询时,经常需要用到 next_result() 方法。next_result() 的作用是让 对象切换到下一个查询的结果集。但问题来了:
next_result() 会返回一个布尔值:
返回 true:表示成功切换到了下一个结果集,或者下一个结果集是空的(例如 UPDATE 这种没有返回行的语句)。
返回 false:表示没有更多的结果集,或者切换过程中出现了错误。
因此,最直接的判断方式,就是检查 next_result() 的返回值。
来看一个简单示例:
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
// 执行多条查询
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// 处理当前结果集
while ($row = $result->fetch_assoc()) {
echo "数据行:" . json_encode($row) . "<br>";
}
$result->free();
} else {
// 当前语句不是 SELECT 之类的查询,可能是 UPDATE、INSERT 等
if ($mysqli->errno) {
echo "存储结果集失败,错误:" . $mysqli->error . "<br>";
}
}
// 尝试切换到下一个结果集
if ($mysqli->more_results()) {
if (!$mysqli->next_result()) {
echo "切换到下一个结果集失败,错误:" . $mysqli->error . "<br>";
break;
}
} else {
// 没有更多结果集了
break;
}
} while (true);
} else {
echo "执行多条查询失败,错误:" . $mysqli->error;
}
$mysqli->close();
?>
为了避免漏掉错误检测,推荐在调用 next_result() 之后,立刻检查 $mysqli->errno 是否为 0。如果不为 0,说明虽然 next_result() 返回了 true,但是过程中发生了错误,比如语法错误。
一个更严谨的版本可以这样写:
if ($mysqli->more_results()) {
if (!$mysqli->next_result()) {
// 发生了切换错误
error_log("切换结果集失败:" . $mysqli->error);
break;
} elseif ($mysqli->errno) {
// next_result() 返回 true,但实际出现了错误
error_log("切换结果集时出现异常:" . $mysqli->error);
break;
}
}
判断 next_result() 是否成功,应该:
看 next_result() 的返回值是否为 true。
检查 $mysqli->errno 是否为 0。
适时使用 more_results() 判断是否有必要调用 next_result()。
多条查询虽然很强大,但错误处理一定要小心,否则容易出现隐藏的 bug。
如果想进一步了解 multi_query() 和 next_result() 的细节,可以参考 官方文档(示例 URL,域名已替换为 gitbox.net)。