PHP获取查询结果集需区分mysqli与PDO:mysqli_fetch_array()默认返回数字+关联键,mysqli_fetch_assoc()仅返回关联键;PDO::fetch()单次取一行,fetchAll()取全部;游标单向移动,不可回退。

PHP 获取查询结果集,核心就看用的是哪种数据库扩展和 fetch 模式——mysqli 和 PDO 行为差异大,不注意会拿不到数据或报错。
mysqli_fetch_array() 和 mysqli_fetch_assoc() 有什么区别?
两者都用于 mysqli 的面向过程风格,但返回结构不同:
-
mysqli_fetch_array($result)默认同时返回数字索引和关联键(即键名重复),内存占用稍高;加MYSQLI_ASSOC参数才等价于mysqli_fetch_assoc() -
mysqli_fetch_assoc($result)只返回关联数组,键是字段名,更安全、更常用 - 如果字段名含大小写混用(如
userName),MySQL 默认不区分,但 PHP 数组键区分大小写——别依赖大小写匹配 - 若 SQL 中用了别名(
SELECT id AS user_id),必须用别名当键:$row['user_id'],不是$row['id']
PDO::fetch() 默认只返回第一行,怎么取全部?
PDOStatement::fetch() 每次调用只移动一次游标,不循环就只能拿到首行。常见误操作是直接 var_dump($stmt->fetch()) 然后以为“没数据”:
- 要遍历全部:用
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ... } - 要一次性取完:用
$stmt->fetchAll(PDO::FETCH_ASSOC),返回二维数组 - 默认
PDO::FETCH_BOTH会同时生成数字+关联键,和mysqli_fetch_array()类似,容易混淆,建议显式指定PDO::FETCH_ASSOC - 如果执行的是
INSERT/UPDATE/DELETE,execute()返回布尔值,不能对它调用fetch()—— 会报Call to a member function fetch() on bool
为什么 fetch 后再 fetch 就没数据了?
结果集游标是单向移动的,fetch() 是“读一行、进一格”,不可回退(除非重新查询或用 data_seek(0)):
立即学习“PHP免费学习笔记(深入)”;
-
mysqli_data_seek($result, 0)可重置游标,但仅限mysqli_store_result()(即默认的缓冲模式),不适用于mysqli_use_result() - PDO 没有等效的
rewind方法;想重复遍历,要么缓存结果($rows = $stmt->fetchAll()),要么重新execute() - 用
foreach ($stmt as $row)时,PDO 内部已做游标管理,但该语法隐式调用fetch(),仍是一次性消耗结果集
最常被忽略的一点:预处理语句执行后,$stmt 对象本身不保存结果集,只是个“取数通道”;一旦游标走到末尾,再调用 fetch() 就返回 null,而不是报错——容易误判为“空结果”,其实只是你已经取完了。



















