PDO默认返回对象时,如何用预处理语句+遍历接口获取数组结果?
解决方案:修改PDOStatement的fetch模式
你只需要针对当前的PDOStatement对象设置单独的fetch模式,就能覆盖全局PDO连接的默认设置,这样遍历的时候就能得到数组,完全不需要类型转换。这里有两种简单的实现方式:
方法1:执行后设置fetch模式
在execute()之后,调用setFetchMode()指定PDO::FETCH_ASSOC,遍历statement时就会返回关联数组:
$stmt = $this->pdo->prepare($sql); $stmt->execute($arr); $stmt->setFetchMode(PDO::FETCH_ASSOC); // 为当前statement设置fetch模式 foreach($stmt as $rs) { // $rs现在是关联数组,而非stdObject }
方法2:预处理时指定fetch模式
你也可以在调用prepare()时,通过第三个参数传入属性数组,直接设置当前statement的默认fetch模式:
$stmt = $this->pdo->prepare( $sql, [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); $stmt->execute($arr); foreach($stmt as $rs) { // $rs同样是关联数组 }
原理说明
PDO的全局连接配置是默认的fetch模式,但每个PDOStatement对象都可以拥有自己独立的fetch模式设置,优先级高于全局配置。当你遍历PDOStatement时,内部会自动调用fetch()方法,而这个方法会使用当前statement的fetch模式——这和你用query()方法时指定第二个参数的原理是完全一致的,只是预处理语句需要手动显式设置而已。
这样既保留了全局连接的默认设置,又能让当前的遍历得到数组,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user1032531
相关产品推荐
相关产品推荐

