在使用PHP 和MySQLi 進行數據庫操作時,我們通常每次只執行一個查詢語句。然而,在某些複雜的業務場景中,可能需要通過一個請求執行多個查詢語句,這時就需要處理多個結果集。 PHP 的mysqli擴展提供了next_result()函數來幫助我們遍歷這些結果集。
多個結果集通常出現在執行了包含多個語句的SQL 查詢時,例如:
SELECT * FROM users; SELECT * FROM orders;
這在存儲過程(Stored Procedures)或批量執行SQL 時很常見。 PHP 中的mysqli_multi_query()就支持這種形式的批量執行。
在PHP 中使用mysqli_multi_query()和next_result()處理多個結果集的基本步驟如下:
創建數據庫連接
使用mysqli_multi_query()執行多語句查詢
用store_result()獲取當前結果集
使用next_result()移動到下一個結果集
下面是一個具體示例,展示如何遍歷多個結果集並提取數據:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("連接失敗: " . $mysqli->connect_error);
}
$sql = "SELECT id, username FROM users; SELECT id, order_date FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
$result->free();
}
// 檢查是否還有更多結果集
if ($mysqli->more_results()) {
echo "<hr>下一個結果集:<br>";
}
} while ($mysqli->next_result());
} else {
echo "查詢執行失敗: " . $mysqli->error;
}
$mysqli->close();
?>
確保SQL 語句之間使用分號分隔:這對於multi_query()是必須的。
每個結果集都要用store_result()提取出來並及時釋放資源。
next_result()不返回數據,它的作用是讓store_result()能提取下一個結果集。
調試時可打印mysqli->error查看出錯信息。
批量讀取多個表的數據並展示在同一個頁面上
調用返回多個結果集的存儲過程
執行複雜的統計分析SQL 查詢時
在執行多語句查詢時,務必注意SQL 注入風險。使用prepare和bind_param方法是更安全的做法,儘管multi_query()本身不支持prepare ,但可以將邏輯拆分為多個單一查詢來規避風險。