You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何$stmt->fetch(PDO::FETCH_NUM)返回同时带数字索引和列名的数组

问题原因

你代码的问题出在两点:

  1. 单独调用的$stmt->fetch(PDO::FETCH_NUM)仅会读取结果集的第一行,且返回值才是符合FETCH_NUM规则的数组,你没有接收这个返回值,这行代码执行后没有产生你预期的全局配置效果,反而会移动结果集的游标,导致后续遍历$stmt时丢失第一行数据。
  2. 直接对PDOStatement对象做foreach遍历时,PDO会使用全局默认的提取模式读取结果集的剩余行,PHP默认的PDO提取模式就是PDO::FETCH_BOTH,所以返回的行同时带有数字索引和关联索引,和你之前单次调用fetch时传入的参数无关。

解决方法

  • 方案1:为当前查询结果设置统一提取模式
    在execute执行后,先调用setFetchMode方法设置当前结果集的默认提取规则,再遍历即可:
$sql = "SELECT * from resumenes";
$stmt = $db->prepare($sql);
$stmt->execute();
// 新增这行,设置当前结果集默认返回数字索引数组
$stmt->setFetchMode(PDO::FETCH_NUM);
foreach ($stmt as $row) {
    print_r($row);
}
  • 方案2:循环调用fetch方法读取每一行
    每次调用fetch时显式传入PDO::FETCH_NUM参数,不需要依赖全局默认配置:
$sql = "SELECT * from resumenes";
$stmt = $db->prepare($sql);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
    print_r($row);
}
  • 方案3:全局配置默认提取模式
    如果业务中所有查询都默认需要数字索引数组,可以在初始化PDO连接时直接配置全局默认规则,后续所有查询不需要单独设置:
// 初始化PDO时添加配置项
$db = new PDO($dsn, $db_user, $db_pass, [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_NUM
]);

内容的提问来源于stack exchange,提问作者Carlos Curiá

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:45:07