能否在PDO的fetchAll()中同时结合FETCH_OBJ与FETCH_ASSOC?
解决PDO同时支持对象和数组访问字段的问题
1. 用PDO::FETCH_LAZY实现双访问模式
PDO的FETCH_LAZY模式会返回一个PDORow对象,它同时实现了数组访问接口,所以既可以用对象属性的方式$row->Username,也可以用数组下标$row['Username']访问字段值。
使用示例:
// 设置全局默认fetch模式(推荐,不用每次调用都重复指定) $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_LAZY); // 执行查询 $stmt = $pdo->query("SELECT Username FROM users"); $rows = $stmt->fetchAll(); // 两种访问方式都能正常工作 foreach ($rows as $row) { echo $row->Username; // 对象属性方式 echo $row['Username']; // 数组下标方式 }
如果不想全局设置,也可以在单次查询时指定模式:
$rows = $stmt->fetchAll(PDO::FETCH_LAZY);
2. 排查“non-object”错误的原因
你遇到的trying to get property 'Username' of non-object错误,和fetch模式本身关系不大,通常是以下场景导致:
- 查询无数据返回时,
fetchAll()返回空数组,若代码没做空判断就直接访问$rows[0]->Username会报错; - 使用
fetch()而非fetchAll()时,无数据会返回false,此时尝试访问$row->Username会触发错误。
修复示例:
$stmt = $pdo->prepare("SELECT Username FROM users WHERE id = ?"); $stmt->execute([$userId]); $row = $stmt->fetch(PDO::FETCH_LAZY); // 先判断是否获取到有效数据 if ($row) { echo $row->Username; echo $row['Username']; } else { echo "未找到对应用户"; }
3. 为什么之前的尝试无效?
PDO::FETCH_ASSOC | PDO::FETCH_OBJ是错误用法:PDO的fetch常量不能通过按位或组合,这种写法不会生成同时支持两种访问方式的结构,反而会导致返回结果异常;PDO::FETCH_BOTH返回的是索引+关联数组,本质仍是数组类型,无法用对象属性的方式访问,所以$row->Username会报错。
内容的提问来源于stack exchange,提问作者WIVINA ISILIMURA
相关产品推荐
相关产品推荐

