【问题标题】:Master-Detail using PHP PDO使用 PHP PDO 的主从细节
【发布时间】:2011-06-28 15:00:05
【问题描述】:

我一直在尝试创建一个列出基于一系列大师的详细信息的结果页面。

这是一个示例问题...

如下图所示的三个表:

Book (id, title)
Author (id, name)
BookAuthors (bookID, authorID)

我希望生成一个类似这样的列表:

Book Title 1
  Author 1
  Author 2
Book Title 2
  Author 3
Book Title 3
  Author 1
  Author 4

等等。

我希望使用 PHP PDO 来实现。

[更新更详细]

我遇到的问题更多是关于如何在无法嵌套准备好的语句时从 PDO 遍历结果...

我希望在查询中嵌套查询并使用第一个查询的结果 [我已扩展查询以包括对书名的过滤器,但这可能是空白的,因此返回整个集合]:

select id as idBook,title from book where title like %:title%

然后为每本书创建作者列表

select name from author, bookauthors 
  where bookauthor.authorid = author.id 
    AND bookauthor.bookid = :idBook:

其中 :idBook: 是第一次查询结果集中的下一本书 ID。

由于第一次查询中检索到的书籍数量可能很大,我希望尽可能不要使用 fetchall...

任何人对此有指针/示例解决方案代码?

非常感谢!

【问题讨论】:

  • 我没有示例代码,但我把爱和幸福送给你 Ady!您正在寻找join
  • @hakre 我知道我将使用 Joins,我遇到的问题是遍历结果。我希望在查询中嵌套一个查询并使用第一个查询的结果(选择 id 作为 idBook,书名)然后为每本书创建作者列表(从作者中选择姓名,bookauthors where bookauthor.authorid = author.id AND bookauthor.bookid = :idBook:)。
  • Mike S - 我不需要 lastinsertid 来解决这个问题。我不是在添加新记录,而是在做主-细节-子细节显示。

标签: php mysql pdo master-detail


【解决方案1】:

我宁愿将一些状态存储在 php 变量中,而不是多个查询。在这种情况下,您只需要知道:这本书是否“改变”了,即脚本必须打印标题吗?

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
foo($pdo);  // add test data

$r = $pdo->query('
  SELECT
    l.bookID, b.title, a.name
  FROM
    BookAuthor as l
  JOIN
    Author as a
  ON
    a.id=l.authorID 
  JOIN
    Book as b
  ON
    b.id=l.bookID
  ORDER BY
    l.bookID,
    l.authorID
');
$currentBook = null;
foreach($r as $row) {
  if ( $currentBook!=$row['bookID'] ) {
    echo $row['title'], "\n";
    $currentBook=$row['bookID'];
  }
  echo '  ', $row['name'], "\n";
}

function foo($pdo) {
  $pdo->exec('create temporary table Book (id int auto_increment, title varchar(48), primary key(id))');
  $pdo->exec('create temporary table Author (id int auto_increment, name varchar(48), primary key(id))');
  $pdo->exec('create temporary table BookAuthor (bookID int, authorID int)');

  $pdo->exec("INSERT INTO Author (id,name) VALUES (1,'Author1'),(2,'Author2'),(3,'Author3'),(4,'Author4')");
  $pdo->exec("INSERT INTO Book (id,title) VALUES (1,'Book Title 1'),(2,'Book Title 2'),(3,'Book Title 3')");
  $pdo->exec("INSERT INTO BookAuthor (bookID,authorID) VALUES (1,1),(1,2),(2,3),(3,1),(3,4)");
}

【讨论】:

  • 这是我的下一个想法,但如果可能的话想避免它......我一直在玩 fetchall() 的想法,但也会实现你的想法并进行比较。谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多