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

问题描述 投票:5回答:4

第一次尝试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
4个回答
7
投票

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

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 = new myPDO(“ mysql:host = $ hostname; dbname = animals”,$ username,$ password);$ stmt = $ dbh-> animalQuery(“ SELECT * FROM animals”);foreach($ stmt as $ animals){echo $ animals-> name;}

5
投票

由于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我尚未测试过,但看起来它使您接近所需的状态


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

0
投票

我写了整篇关于fetching objects with PDO的文章。实际上,在大多数情况下,调用setFetchMode()是多余的,可以避免。

是否可以设置默认的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您将需要哪个特定类的实例。

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

© www.soinside.com 2019 - 2024. All rights reserved.