mysqli_fetch_all()是最直接的转换方式,可一次性将结果集转为二维数组,默认返回数字索引,支持mysqli_assoc、mysqli_num、mysqli_both三种模式,但要求结果集有效且依赖mysqlnd驱动。

mysqli_fetch_all() 是最直接的转换方式
用 mysqli_fetch_all() 一次性把结果集转成二维数组,是 PHP 原生 MySQLi 扩展里最省事的方法。它默认返回的是数字索引二维数组,加个参数还能同时带字段名。
常见错误是调用后没检查返回值:如果 SQL 执行失败或结果为空,mysqli_fetch_all() 会返回 null,直接用会导致 Warning: mysqli_fetch_all() expects parameter 1 to be mysqli_result 这类错误。
- 确保先用
mysqli_query()获取有效的mysqli_result对象,再传给mysqli_fetch_all() - 想同时要数字键和关联键?用
MYSQLI_BOTH:mysqli_fetch_all($result, MYSQLI_BOTH) - 只要关联键(即字段名作键)?用
MYSQLI_ASSOC;只要数字键?用MYSQLI_NUM(默认) - 注意内存:大结果集下,
mysqli_fetch_all()会一次性把全部数据载入内存,比逐行 fetch 更吃 RAM
PDO::fetchAll() 更灵活但要注意默认行为
PDO 的 fetchAll() 看起来更通用,但默认返回的是数字索引数组——不是你直觉以为的“按字段名自动映射”的二维数组,除非显式指定。
典型误用:只写 $pdo->query($sql)->fetchAll(),结果发现每行是 [0 => 'value1', 1 => 'value2'],而不是 ['name' => 'value1', 'age' => 'value2']。
- 要关联键?必须传
PDO::FETCH_ASSOC:$stmt->fetchAll(PDO::FETCH_ASSOC) - 想混用数字+关联?用
PDO::FETCH_BOTH - 如果用了预处理语句(
prepare()+execute()),记得在execute()成功后再调fetchAll() -
fetchAll()不会自动释放结果集,大数据量时建议及时 unset 或复用$stmt
手写 while + fetch_row/fetch_assoc 容易漏判空结果
有人习惯用 while ($row = mysqli_fetch_assoc($result)) { ... } 自己 push 到数组里,逻辑可控,但容易在边界上出错。
最常踩的坑是:没初始化目标数组,或者在结果为空时忘记处理,导致最终变量未定义。
- 务必提前声明空数组:
$data = []; - 别跳过对
$result的有效性判断:if (!$result) { /* 处理查询失败 */ } -
mysqli_fetch_row()返回数字索引,mysqli_fetch_assoc()返回关联索引——选错就得不到想要的键名 - 循环结束后,
$result内部指针已到底,再次调mysqli_fetch_assoc($result)会返回false,不是空数组
注意字符集和 NULL 值在数组里的表现
转成数组后,MySQL 的 NULL 字段会变成 PHP 的 null,不是字符串 'NULL',这点在 JSON 输出或前端渲染时容易引发意外。
另一个隐形问题:如果连接字符集没设对(比如 MySQL 服务端是 utf8mb4,PHP 连接没执行 SET NAMES utf8mb4),中文字段转成数组后可能出现乱码,但数组结构本身完全正常,很难第一时间定位。
- 确认连接层字符集:用
mysqli_set_charset($conn, 'utf8mb4')或 PDO DSN 加;charset=utf8mb4 - 对可能为
null的字段,用isset()或array_key_exists()判断,别直接用empty() - 调试时用
var_dump($array[0])看第一行结构,比print_r更清楚类型和 null 标记
实际项目里,多数情况直接用 mysqli_fetch_all($result, MYSQLI_ASSOC) 或 $stmt->fetchAll(PDO::FETCH_ASSOC) 就够了。真正麻烦的往往不是转换动作本身,而是查完之后没检查 $result 是否有效、字符集是否一致、以及 NULL 值怎么参与后续逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











