mysqli_fetch_assoc一次只取一行,适合逐行处理;mysqli_fetch_all一次性加载全部结果,适合小数据量且需多次访问的场景。
mysqli_fetch_assoc 每次调用只返回结果集中的
下一行数据,以关联数组形式(键为字段名),指针自动后移。它不一次性加载全部数据到内存,对大数据量更友好。
常见错误是误以为调用一次就能拿到所有行,实际必须配合 while 循环使用:
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_assoc()) {
echo $row['id'] . ': ' . $row['name'] . "\n";
}注意点:
fetch_assoc 返回 false 表示已无更多行,不能直接 var_dump 整个结果集break 或 return,后续行不会被读取,但结果集仍占用资源,建议显式 $result->free()
data_seek(0) 后再用 fetch_assoc 重来(除非重新执行查询)mysqli_fetch_all 一次性把整个结果集读入 PHP 数组,返回值结构取决于第二个参数:MYSQLI_ASSOC 得关联数组,MYSQLI_NUM 得数字索引,不传参默认是 MYSQLI_BOTH(含两套键)。
典型用法:
$result = $mysqli->query("SELECT id, name FROM users");
$all = $result->fetch_all(MYSQLI_ASSOC); // 注意:不是 MYSQLI_ASSOC(),是常量
// $all 是 array[0]['id'], array[0]['name'], ...
foreach ($all as $row) {
echo $row['id'] . ': ' . $row['name'] . "\n";
}关键区别与风险:
$all 不影响原始 $result,但也不能再用 fetch_assoc 继续读fetch_all 返回空数组 [],不是 false;而 fetch_assoc 在无数据时返回 false,类型判断要区分核心看数据规模和使用模式:
fetch_assoc + while
fetch_all(MYSQLI_ASSOC)
fetch_all 拿全表再 array_slice——应直接在 SQL 用 LIMIT 和 OFFSET
fetch(PDO::FETCH_ASSOC) 和 fetchAll(PDO::FETCH_ASSOC),行为逻辑一致,只是 API 不同很多人忽略前置校验:mysqli_query 失败时返回 false,此时调用任何 fetch_* 方法都会触发警告(“Trying to get property 'fetch_assoc' of non-object”之类)。
务必检查:
$result = $mysqli->query("SELECT * FROM users");
if ($result === false) {
die('Query failed: ' . $mysqli->error);
}
// 然后再调 fetch_assoc 或 fetch_all另外注意:
mysqli_error($mysqli) 和 $mysqli->error 等价,但后者更常用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT),失败会直接抛异常,这时不用手动判 false,但需用 try/catch
fetch_all 对空结果集返回 [],但若 $result 本身是 false,调用它会报致命错误实际写的时候,多数列表页用 fetch_assoc 更稳;只有确认数据极小、且真需要数组形态时,才换 fetch_all。别为了少写几行循环,把内存和可维护性搭进去。