MySQL数据库的每一行都通过PDO查询存储在一个对象中


Each row of a MySQL-database stored in an object via PDO query?

我试图通过PHP和PDO查询从MySQL数据库中获得这样的东西:

return array(
    "Jungle Book" => new Book("Jungle Book", "R. Kipling", "A classic book."),
    "Moonwalker" => new Book("Moonwalker", "J. Walker", ""),
    "PHP for Dummies" => new Book("PHP for Dummies", "Some Smart Guy", "")
);

数据库的每一行都应该存储在一个对象中。有人能帮我吗?

我试过这个:

return array(
    foreach ($dbh->query("SELECT * FROM books") as $row) {
        $row['name'] => new Book($row['name'], $row['author'], $row['description']);
    }
)

但是数组中不允许使用foreach。。。

背景:出于学习目的,我遵循本教程:http://php-html.net/tutorials/model-view-controller-in-php/我现在正试图用使用真实数据库的代码来替换静态的图书列表。

这个问题实际上与mvc或pdo无关,而是与PHP语法有关。

您的任务相当简单,只需要避免将所有代码都包含在一个操作符中:

$data = array();
$stmt = $dbh->query("SELECT * FROM books");
foreach ($stmt->fetchAll() as $row) {
    $data[$row['name']] = new Book($row['name'], $row['author'], $row['description']);
}
return $data;

尽管PDO为您提供了语法糖,但在我看来,您必须首先学习底层的基本语句。

您可以将提取类型设置为fetch_class。

在单个语句中创建和返回数组是人为的、不必要的要求。我不会这么做,这会使代码难以调试、测试和维护。此外,query()方法可能会在出错时返回false,因此如果您试图在foreach语句中使用它,这将是一个致命的错误。

$stmt = $dbh->query("SELECT * FROM books");
if ($stmt === false) { /* do something to handle the error */ }
$results = $stmt->fetchAll(PDO::FETCH_CLASS, 'Book');
return $results;

或者,如果您想要按名称索引的结果数组:

$stmt = $dbh->query("SELECT * FROM books");
if ($stmt === false) { /* do something to handle the error */ }
$results = array();
while ($book = $stmt->fetch(PDO::FETCH_CLASS, 'Book')) {
  $results[$book->name] = $book;
}
return $results;

您可能想要返回关联数组值。在当前代码中,不能在数组中运行foreach。但你可以这样做:

return $dbh->query("SELECT * FROM books")->fetchAll(PDO::FETCH_ASSOC);