代码之家  ›  专栏  ›  技术社区  ›  Ólafur Waage

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

  •  4
  • Ólafur Waage  · 技术社区  · 15 年前

    首次尝试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"] 我不想要。

    但我不想打电话给 StFETCHCHMODE() 我做的每一个查询。

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

    2 回复  |  直到 13 年前
        1
  •  7
  •   Martin    15 年前

    也许您可以尝试扩展pdo类来自动调用函数…简言之:

    class myPDO extends PDO
    {
       function animalQuery($sql)
       {
         $result = parent::query($sql);
         $result->setFetchMode(PDO::FETCH_INTO, new animals);
         return $result;
       }
    
    //   // useful if you have different classes
    //   function vegetableQuery($sql)
    //   {
    //     $result = parent::query($sql);
    //     $result->setFetchMode(PDO::FETCH_INTO, new vegetables);
    //     return $result;
    //   }
    }
    
    $dbh = new myPDO("mysql:host=$hostname;dbname=animals", $username, $password);
    
    $stmt = $dbh->animalQuery("SELECT * FROM animals");
    
    foreach($stmt as $animals)
    {
        echo $animals->name;
    }
    
        2
  •  4
  •   SeanDowney    13 年前

    因为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 我还没有测试过,但看起来它能让你接近你想要的