【问题标题】:How to force PDOStatement->fetchAll to return array of objects?如何强制 PDOStatement->fetchAll 返回对象数组?
【发布时间】:2012-01-12 07:51:48
【问题描述】:

我正在使用 PDO 编写自己的简单 ORM。我的问题是您是否可以强制PDOStatement::fetchAll() 方法返回stdClass 的对象数组?例如:

$result = $q->fetch_all(/* some magic here */);
print_r($result);

应该打印如下内容:

Array
(
    [0] => stdClass Object
        (
            [NAME] => pear
            [COLOUR] => green
        )

    [1] => stdClass Object
        (
            [NAME] => watermelon
            [COLOUR] => pink
        )

)

这可能吗? NAME 和 COLOR 当然是列的名称。我阅读了文档,但没有发现任何有趣的内容。

【问题讨论】:

  • 我认为您没有足够清楚地阅读文档:“PDO::FETCH_OBJ: 返回一个匿名对象,其属性名称对应于结果集中返回的列名”

标签: php object pdo


【解决方案1】:

使用$result = $q->fetchAll(PDO::FETCH_OBJ);

【讨论】:

  • 天哪。我在文档中错过了这一点。我认为这只是第一级(在我的例子中是数组)。谢谢。
  • 没什么,但是 PDO 有几种模式,甚至定义了一个定义 getter 的对象的名称,参见 PDO::FETCH_CLASS
  • 在演示文档功能(例如函数参数的标志)时,最好将链接添加到提及此标志的文档页面,或者复制并粘贴文档本身的必要位。
  • PDO::FETCH_OBJ 记录在 PDOStatement::fetch 中,而在 PDOStatement::fetchAll 中未提及,这可能会增加混乱。
  • 根据我对PDO::FETCH_CLASS fetchAll 的经验,它返回 php 5.6 中的对象数组和 php 5.4 中的数组数组。这也助长了混乱。有没有可以修改的php.ini设置?
【解决方案2】:

这样就可以了:

 <?php
 $sth = $dbh->prepare("SELECT name, colour FROM fruit");
 $sth->execute();

 $result = $q->fetchAll(PDO::FETCH_OBJ);
 //$result contains an array of stdObjects
 ?>

不过更酷的方法是让 PDO 实例化您自己的类并为您填充属性:

示例 #4 为每个结果实例化一个类

以下示例演示了 PDO::FETCH_CLASS 获取样式。

 <?php
 class fruit {
     public $name;
     public $colour;
 }

 $sth = $dbh->prepare("SELECT name, colour FROM fruit");
 $sth->execute();

 $result = $sth->fetchAll(PDO::FETCH_CLASS, "fruit");
 //$result contains an array of fruit objects
 ?>

来源:http://www.php.net/manual/en/pdostatement.fetchall.php

【讨论】:

    【解决方案3】:

    您还应该能够执行以下操作:

    $stmt->setFetchMode(PDO::FETCH_OBJ); //set the mode for all fetch request
    

    对于任何后续的fetch 请求,您可以省略明确指定模式。

    $stmt->setFetchAll(); //returns an array of objects
    

    【讨论】:

      猜你喜欢
      • 2018-07-30
      • 2013-09-22
      • 2013-01-07
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2018-11-12
      • 2011-07-08
      • 2012-06-21
      相关资源
      最近更新 更多