【问题标题】:How can I simply return objects in PDO?如何在 PDO 中简单地返回对象?
【发布时间】:2010-10-19 08:53:48
【问题描述】:

第一次尝试 PDO。

$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);

$stmt = $dbh->query("SELECT * FROM animals");
$stmt->setFetchMode(PDO::FETCH_INTO, new animals);

foreach($stmt as $animals)
{
    echo $animals->name;
}

如果我跳过setFetchMode() 方法,那么我需要调用我不想要的$animals["name"]

但我不想为我所做的每个查询调用setFetchMode()

有没有办法设置默认的 FetchMode ?或其他一些方法使 query() 返回具有一个全局设置的对象。

【问题讨论】:

    标签: php object pdo


    【解决方案1】:

    也许您可以尝试扩展 PDO 类以自动为您调用该函数...简而言之:

    myPDO 类扩展 PDO { 函数动物查询($ sql) { $result = parent::query($sql); $result->setFetchMode(PDO::FETCH_INTO, 新动物); 返回$结果; } // // 如果你有不同的类很有用 // 函数蔬菜查询($sql) // { // $result = parent::query($sql); // $result->setFetchMode(PDO::FETCH_INTO, 新蔬菜); //返回$结果; // } } $dbh = new myPDO("mysql:host=$hostname;dbname=animals", $username, $password); $stmt = $dbh->animalQuery("SELECT * FROM animals"); foreach($stmt 作为 $animals) { 回声$动物->名称; }

    【讨论】:

      【解决方案2】:

      由于 PDO 需要知道您想要获取的对象,因此您需要手动指定它。 但是您只想使用对象来检索数据而不是数组并且不在乎它是否不是动物对象,当您在连接字符串之后设置属性时,您可以默认使用匿名对象,这可以在封装的构造函数

        $connection = new PDO($connection_string);
        //PDO::FETCH_OBJ: returns an anonymous object with property names that correspond to the column names returned in your result set 
        $connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 
      

      那么所有的查询都会返回对象。虽然它并不是你想要的。


      您也可以将数据注入到您的动物类中:

      while($dataObj = ...) {
       $animal = new Animal($dataObj);
      }
      

      如果您查看查询函数,则可以通过传递额外参数来更改一些选项: http://www.php.net/manual/en/pdo.query.php 我还没有测试过,但它看起来可以让你接近你想要的

      【讨论】:

        【解决方案3】:

        说到一般的获取对象,PDO 有六种不同的模式来完成这项任务。我必须写一篇关于fetching objects with PDO 的专门文章来列出它们。

        关于您的具体问题,

        如何在 PDO 中简单地返回对象?

        只需使用PDO::FETCH_OBJ 模式

        有没有办法设置默认的 FetchMode?​​p>

        这取决于。
        如果您关心的只是语法,并且您只想使用$animal->name 而不是$animal['name'],那么您可以要求PDO 默认创建stdClass() 的实例。为此,只需添加

        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
        

        到您的PDO connection options 列表(该链接指向我编写的另一个示例,我强烈建议您查看该示例,因为与 PDO 的连接是一项复杂的业务,与您的示例中的一行无关)。

        设置此选项后,您可以立即使用对象语法:

        $stmt = $dbh->query("SELECT * FROM animals");
        foreach($stmt as $animal)
        {
            echo $animal->name;
        }
        

        如果您需要获取特定类,对于对象列表,请使用您当前的方法与setFetchMode() / foreach 或者您可以使用 fetchAll() 和专用的 PDO::FETCH_CLASS 获取模式:

        $herd = $pdo->query('SELECT name FROM animals')->fetchAll(PDO::FETCH_CLASS, 'Animal');
        

        这就是你所能拥有的,只是因为你需要告诉 PDO,你需要哪个特定类的实例。

        还有其他选项,例如提供构造函数参数等。您可以在上面链接的文章中查看它们。

        【讨论】:

          【解决方案4】:

          你可以试试这个方法:

          $dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
          
          $stmt = $dbh->query("SELECT * FROM animals");
          $stmt->setFetchMode(PDO::FETCH_CLASS, animals::class);
          
          foreach($stmt as $animals)
          {
              echo $animals->name;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-25
            • 1970-01-01
            • 1970-01-01
            • 2012-06-30
            相关资源
            最近更新 更多