
本文详解如何将两个不同数据库连接(如跨主机)返回的 MySQL 查询结果合并为一个统一数组,并安全遍历渲染,避免直接 array_merge() 原生 mysqli_result 对象导致的错误。
本文详解如何将两个不同数据库连接(如跨主机)返回的 mysql 查询结果合并为一个统一数组,并安全遍历渲染,避免直接 `array_merge()` 原生 `mysqli_result` 对象导致的错误。
在 PHP 中使用 MySQLi 时,$stmt->get_result() 返回的是 mysqli_result 对象(非数组),不能直接参与 array_merge() 或 count() 操作。当你从两个独立数据库连接(例如 $conn_1 和 $conn_2)分别执行相同结构的查询后,必须先将每个 mysqli_result 显式转换为 PHP 数组,再进行合并与处理。
✅ 正确做法是:使用 mysqli_fetch_all($result, MYSQLI_ASSOC) 将结果集转为关联数组(推荐),或 MYSQLI_NUM 转为数字索引数组。若需按字段名(如 'ts', 'number')访问,务必选用 MYSQLI_ASSOC:
// 获取两个结果集并转为关联数组 $rows_ch = mysqli_fetch_all($result_ch, MYSQLI_ASSOC); $rows_ch2 = mysqli_fetch_all($result_ch2, MYSQLI_ASSOC); // 合并为单个二维数组 $result_ch_com = array_merge($rows_ch, $rows_ch2);
⚠️ 注意事项:
-
mysqli_fetch_all()会消耗结果集指针,调用后原$result_ch不可重复遍历; - 确保两表字段名完全一致(如都含
ts和number),否则合并后字段访问会出错; - 若任一查询失败(如
$result_ch === false),需提前检查,避免mysqli_fetch_all(false, ...)触发警告; - 推荐添加空值保护:
$rows_ch = is_object($result_ch) ? mysqli_fetch_all($result_ch, MYSQLI_ASSOC) : [];
完整安全示例(含错误处理与 HTML 渲染):
// 执行查询(已省略 prepare/bind/execute)
$result_ch = $stmt_ch->get_result();
$result_ch2 = $stmt_ch2->get_result();
// 安全提取数据
$rows_ch = is_object($result_ch) ? mysqli_fetch_all($result_ch, MYSQLI_ASSOC) : [];
$rows_ch2 = is_object($result_ch2) ? mysqli_fetch_all($result_ch2, MYSQLI_ASSOC) : [];
$result_ch_com = array_merge($rows_ch, $rows_ch2);
// 渲染表格
if (!empty($result_ch_com)) {
$output = '<table class="table table-bordered">
<thead>
<tr>
<th width="25%" style="text-align:center">Blocked Time</th>
<th width="20%" style="text-align:center">Blocked Number</th>
</tr>
</thead>
<tbody>';
foreach ($result_ch_com as $row) {
$output .= sprintf(
'<tr><td style="text-align:center">%s</td><td style="text-align:center">%s</td></tr>',
htmlspecialchars($row['ts'] ?? ''),
htmlspecialchars($row['number'] ?? '')
);
}
$output .= '</tbody></table>';
echo $output;
} else {
echo '<p class="text-muted">No records found across both servers.</p>';
}? 提示:如需去重(例如相同号码在两库中均存在),可在合并后使用 array_unique($result_ch_com, SORT_REGULAR);若需按时间倒序统一排序,可用 usort($result_ch_com, fn($a, $b) => strtotime($b['ts']) strtotime($a['ts']));。最终方案兼顾可读性、健壮性与安全性,适用于生产环境多源数据聚合场景。


















