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

时间:2009-04-14 14:26:16

标签: php object pdo

第一次尝试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()返回对象的其他方法。

4 个答案:

答案 0 :(得分:7)

也许您可以尝试扩展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;
}

答案 1 :(得分:4)

由于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 我没有对它进行过测试,但看起来它让你接近你想要的东西

答案 2 :(得分:1)

一般来讲,获取对象时,PDO有六种不同的模式用于此任务。我不得不写一篇有关fetching objects with PDO的专门文章来列出它们。

关于您的特定问题,

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

只需使用PDO::FETCH_OBJ模式

是否可以设置默认的FetchMode?

要视情况而定。
如果您只关心语法,而只想使用$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您需要哪个特定类的实例。

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

答案 3 :(得分:0)

您可以尝试这种方式:

$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;
}