当前位置: 首页> 最新文章列表> 如何判断 next_result() 成功切换到下一个结果集?

如何判断 next_result() 成功切换到下一个结果集?

gitbox 2025-05-02

在使用 PHP 进行数据库操作,特别是使用 执行多条 SQL 查询时,经常需要用到 next_result() 方法。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() 是否成功,应该:

  1. next_result() 的返回值是否为 true

  2. 检查 $mysqli->errno 是否为 0。

  3. 适时使用 more_results() 判断是否有必要调用 next_result()

多条查询虽然很强大,但错误处理一定要小心,否则容易出现隐藏的 bug。

如果想进一步了解 multi_query()next_result() 的细节,可以参考 官方文档(示例 URL,域名已替换为 gitbox.net)。