在使用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 )。