为何$stmt->fetch(PDO::FETCH_NUM)返回同时带数字索引和列名的数组
问题原因
你代码的问题出在两点:
- 单独调用的
$stmt->fetch(PDO::FETCH_NUM)仅会读取结果集的第一行,且返回值才是符合FETCH_NUM规则的数组,你没有接收这个返回值,这行代码执行后没有产生你预期的全局配置效果,反而会移动结果集的游标,导致后续遍历$stmt时丢失第一行数据。 - 直接对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á
相关产品推荐
相关产品推荐

