首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP PDO的Master-Detail

使用PHP PDO的Master-Detail
EN

Stack Overflow用户
提问于 2011-06-28 23:00:05
回答 1查看 2K关注 0票数 0

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

这里有一个示例问题。

下面列出了三个表:

代码语言:javascript
复制
Book (id, title)
Author (id, name)
BookAuthors (bookID, authorID)

我希望生成一个类似以下内容的列表:

代码语言:javascript
复制
Book Title 1
  Author 1
  Author 2
Book Title 2
  Author 3
Book Title 3
  Author 1
  Author 4

诸若此类。

我希望使用PHP PDO来实现这一点。

更新了更多详细信息

我遇到的问题更多的是,当嵌套预准备语句不可能时,如何遍历PDO的结果……

我希望将查询嵌套在查询中,并使用第一个查询的结果。我已经扩展了查询,以包括对图书标题的筛选,但这可能是空的,因此返回整个集合

代码语言:javascript
复制
select id as idBook,title from book where title like %:title%

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

代码语言:javascript
复制
select name from author, bookauthors 
  where bookauthor.authorid = author.id 
    AND bookauthor.bookid = :idBook:

其中:idBook:是来自第一个查询的结果集中的下一个图书id。

由于在第一个查询中检索到的图书数量可能很大,我希望尽可能不使用fetchall…

有没有人有这个的指针/示例解决方案代码?

首先要感谢大家!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-28 23:45:04

我宁愿在php变量中存储一些状态,而不是多个查询。在这种情况下,你所需要知道的就是:书“变了”了吗?也就是说,脚本必须打印出书名吗?

代码语言:javascript
复制
<?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)");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6508544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档