1

我尝试通过 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/我现在正尝试用以下代码替换静态书籍列表正在使用真实的数据库。

4

3 回答 3

3

您可以将获取类型设置为 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;
于 2013-06-27T17:09:45.333 回答
3

这个问题实际上与 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 为您提供了语法糖,但在我看来,您必须首先学习底层的基本语句。

于 2013-06-27T17:10:45.853 回答
0

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

return $dbh->query("SELECT * FROM books")->fetchAll(PDO::FETCH_ASSOC);
于 2013-06-27T17:11:06.667 回答