當前位置: 首頁> 最新文章列表> 如何判斷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 )。