mysqli_fetch_array() 默认返回同时含数字和关联索引的数组(MYSQLI_BOTH),而 mysqli_fetch_assoc() 仅返回关联数组,更安全、语义清晰;二者在字段名相同时行为一致,但前者易因字段顺序变动引发错误。

mysqli_fetch_array() 和 mysqli_fetch_assoc() 的区别在哪
直接用 mysqli_fetch_array() 容易拿到重复键名的数组(数字索引 + 关联索引各一份),而 mysqli_fetch_assoc() 只返回关联数组,更符合日常使用预期。如果后续要 json_encode() 或遍历字段名,选后者更安全。
常见错误是默认不传参数,结果发现 $row[0] 和 $row['id'] 都存在,但字段顺序一变就出错;或者在循环中混用两种访问方式,导致逻辑混乱。
-
mysqli_fetch_array($result, MYSQLI_ASSOC)等价于mysqli_fetch_assoc($result) - 避免用
MYSQLI_BOTH(默认值),除非明确需要双份索引 - 若数据库字段含大小写混合(如
userName),PHP 数组键名会原样保留,注意大小写敏感
PDO 查询结果怎么转成纯关联数组
PDO 默认返回的是 stdClass 对象,不是数组。想转成数组得靠 fetch() 的 fetch_style 参数,而不是事后用 (array) 强转——后者会把私有/受保护属性丢掉,且对象嵌套时不可靠。
正确做法是在 fetch() 或 fetchAll() 里指定 PDO::FETCH_ASSOC:
立即学习“PHP免费学习笔记(深入)”;
$stmt = $pdo->query("SELECT id, name FROM users");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // 直接得到二维关联数组
-
PDO::FETCH_NUM得到数字索引数组,PDO::FETCH_BOTH是两份都返回(同 mysqli 默认) - 不要用
json_decode(json_encode($obj), true)转 PDO 对象——性能差、丢失类型(如NULL变空字符串)、不处理资源句柄 - 批量查询时优先用
fetchAll()+PDO::FETCH_ASSOC,比循环调fetch()略快
用 foreach 遍历 mysqli_result 对象时为什么报错“Invalid argument”
因为 mysqli_result 对象本身不可直接遍历,PHP 不支持对它用 foreach。必须先用 fetch_* 系列函数逐行取数据。
典型错误写法:foreach ($result as $row) { ... },会触发警告并中断执行。
- 正确流程:先
while ($row = mysqli_fetch_assoc($result)) { ... } - 如果真想用
foreach,得先把所有行读进数组:$rows = [];<br>while ($row = mysqli_fetch_assoc($result)) $rows[] = $row;
,再foreach ($rows as $row) - 注意内存:大结果集别一次性全读进数组,否则可能 OOM;流式处理更稳妥
从对象转数组时 NULL 值和空字符串怎么保持原样
用 (array) 强转对象,或某些 JSON 编解码绕过方式,容易让数据库里的 NULL 变成空数组、空字符串,或干脆被过滤掉。这不是转换方法的问题,而是中间环节做了隐式类型转换。
真正可控的方式,是始终用数据库扩展原生的 fetch 方法,并确认字段类型在 PHP 层未被干扰:
-
mysqli_fetch_assoc()和PDO::FETCH_ASSOC会如实保留NULL、0、''、'0'等值,无需额外处理 - 避免在 fetch 后做
array_filter()或empty()判断再删键——这会误杀合法的空值 - 如果用了 ORM(如 Laravel Eloquent),记得查文档确认其
toArray()是否对NULL字段做归一化(有些版本会转成"")
mysqli_query() 失败返回 false,接着传给 mysqli_fetch_assoc() 就会报 Warning:expects parameter 1 to be mysqli_result。



















