2011-06-28 63 views
0

我一直在試圖創建一個結果頁面,該頁面列出了一系列主人的詳細信息。使用PHP PDO的主 - 細節

下面是一個示例問題...

三個表如下面所示:

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 ...

任何人有三分球/樣品溶液的代碼呢?

非常感謝提前!

+0

我沒有示例代碼,但我送你愛和幸福阿迪!你正在尋找一個'join'。 – hakre

+0

可能重複的[PHP的JOIN查詢結果](http://stackoverflow.com/questions/1380691/php-pdo-result-of-join-query) – hakre

+0

@hakre我明白,我將使用連接,我有的問題是遍歷結果。我希望在查詢中嵌套查詢並使用第一個查詢的結果(選擇id作爲idBook,書中的標題),然後爲每本書創建作者列表(從作者選擇名稱,bookauthors,其中bookauthor.authorid = author.id AND bookauthor.bookid =:idBook :)。 – Ady

回答

0

而不是多個查詢我寧願將一些狀態存儲在一個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)"); 
} 
+0

這是我的下一個想法,但要儘可能避免它......我一直在玩fetchall()的想法,但也會實現你的想法,並進行比較。謝謝 – Ady