我试图通过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);