在使用 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,但可以将逻辑拆分为多个单一查询来规避风险。