6

第一次尝试 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

4 回答 4

7

也许您可以尝试扩展 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)
{
    回声$动物->名称;
}
于 2009-04-14T15:12:12.357 回答
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 我还没有测试它,但它看起来像你接近你想要的

于 2011-03-04T20:37:29.900 回答
1

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

关于您的具体问题,

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

只需使用PDO::FETCH_OBJ模式

有没有办法设置默认的 FetchMode?

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

PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ

到您的PDO 连接选项列表(该链接指向我编写的另一个示例,我强烈建议您查看该示例,因为与 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,您将需要哪个特定类的实例。

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

于 2020-01-24T09:20:26.153 回答
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;
}
于 2020-01-24T09:06:04.173 回答