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

Php 如何在PDO中简单地返回对象?,php,object,pdo,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; }

第一次尝试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()
返回具有一个全局设置的对象。

也许您可以尝试扩展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; } 类myPDO扩展了PDO { 函数animalQuery($sql) { $result=parent::query($sql); $result->setFetchMode(PDO::FETCH_INTO,新动物); 返回$result; } ////如果您有不同的类,则很有用 //函数vegetableQuery($sql) // { //$result=parent::query($sql); //$result->setFetchMode(PDO::FETCH_INTO,新蔬菜); //返回$result; // } } $dbh=newmypdo(“mysql:host=$hostname;dbname=animals”,$username,$password); $stmt=$dbh->animalQuery(“选择*来自动物”); foreach($stmtas$动物) { echo$动物->名称; }
由于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);
}

如果查看查询函数,可以通过传递额外参数来更改某些选项: 我还没有测试过它,但它看起来能让你接近你想要的东西

你可以这样尝试:

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

一般来说,谈到获取对象,PDO对此任务有六种不同的模式。我不得不写一篇专门的文章来列出所有这些

关于你的特殊问题

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

只需使用
PDO::FETCH_OBJ
模式

有没有办法设置默认的FetchMode

视情况而定。
如果您关心的只是语法问题,并且您只想使用
$animal->name
而不是
$animal['name']
,那么您可以要求PDO在默认情况下创建
stdClass()的实例。要做到这一点,只需添加

PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
到您的列表(链接到我编写的另一个示例,我强烈建议您查看,因为连接到PDO是一项复杂的业务,与您的示例完全不同)

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

$stmt = $dbh->query("SELECT * FROM animals");
foreach($stmt as $animal)
{
    echo $animal->name;
}
如果需要提取到特定的类中,则对于对象列表,请使用当前方法与
setFetchMode()
/
foreach
或者您可以将
fetchAll()
与专用的
PDO::FETCH_类一起使用
FETCH模式:

$herd = $pdo->query('SELECT name FROM animals')->fetchAll(PDO::FETCH_CLASS, 'Animal');
这就是您所能拥有的一切,只是因为您需要告诉PDO,您将需要哪个特定类的实例

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