【问题标题】:Each row of a MySQL-database stored in an object via PDO query?通过 PDO 查询存储在对象中的 MySQL 数据库的每一行?
【发布时间】:2013-06-27 16:59:25
【问题描述】:

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

【问题讨论】:

  • 您需要$dbh->query("SELECT * FROM books")->fetchAll(PDO::FETCH_ASSOC) 才能工作。 Foreach 适用于数组。你想要 foreach 一个对象(PDOStatement)。
  • @NB,您不应该将 fetchAll() 链接到 query() 之外,因为 query() 不能保证返回 PDOStatement 对象。出错时返回false
  • @BillKarwin - 这个人正在学习过程中,抛出我们现在这样的术语暂时没有帮助。我知道如何使用手册,如果我听起来很粗鲁,我很抱歉,但我个人知道。

标签: php mysql arrays pdo


【解决方案1】:

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

【讨论】:

  • 感谢您的意见和代码。当我用一个简单的赋值运算符替换第 4 行中的双箭头时,该代码绝对适合我。 (如果不更改超过 6 个字符,我无法编辑它......)。我认为这只是笔误?还是我做错了什么?你说得对,我在 PHP 方面总体上不是那么强,只是想通过工作示例学习一些 oop、mvc 和 pdo 概念……也许我必须先回到一些 PHP 基础知识。
【解决方案2】:

您可以将获取类型设置为 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;

【讨论】:

  • 非常感谢您的回答!我认为不通过单个语句返回数组是绝对有意义的。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多