如何在PHP中查询相关数组中的值并在HTML表中显示它们

时间:2012-12-20 11:06:35

标签: sql select multidimensional-array foreach html-table

以下二维数组存储书籍信息(1.ID,2.Name,3.Author ID,4.Author Name,5.Publisher ID,6。Publisher Name,7。Publisher Reputation):

$books = array(array('book_id'=>1, 'book_name'=>"BookA", 'author_id'=1, 
                     'author_name'=>"AuthorA", 'publisher_id'=>1,   
                     'publisher_name'=>"PublisherA", 'publisher_reputation'="good"),
               array('book_id'=>1, 'book_name'=>"BookA", 'author_id'=1, 
                     'author_name'=>"AuthorA", 'publisher_id'=>2,   
                     'publisher_name'=>"PublisherB", 'publisher_reputation'="bad")
               array('book_id'=>1, 'book_name'=>"BookA",  'author_id'=>2, 
                     'author_name'=>"AuthorB", 'publisher_id'=>1
                     'publisher_name'=>"PublisherA", 'publisher_reputation'=>"good"),
               array('book_id'=>1, 'book_name'=>"BookA",  'author_id'=>2, 
                     'author_name'=>"AuthorB", 'publisher_id'=>2
                     'publisher_name'=>"PublisherB", 'publisher_reputation'=>"bad"),

一本书可以有几位作者和几位出版商。 作者可以与几本书相关联。 出版商可以与多本书相关联。 发布商只能拥有一个声誉(来自值列表:“好”,“平均”,“坏”)。

编辑:数据存储在3个表格中。作者(author_id,author_name),book(book_id,book_name),publisher(publisher_id,publisher_name,publisher_reputation)。

我想创建一个包含以下列的HTML表:

  1. 图书名称 - 字段列出特定图书。
  2. 作者 - 字段列出与该书相关的所有作者。
  3. 发布者&信誉 - 字段列出与本书相关的所有发布者(及其声誉)。
  4. 我目前正在使用以下代码:

    <?php function transform($books) {
            $result = array();
            foreach($books as $key => $book) {
                $book_id = $book['book_id'];
                    if (!isset($result[$book_id])) {
                    $result[$book_id] = array(
                            'author_name' => array(),
                            'publisher_name'.'publisher_reputation' => array(),
                                'book_name' => $book['book_name']
                    );        
                    }
             $result[$book_id]['publisher_name'.'publisher_reputation'] = 
             array_merge($result[$book_id]['publisher_name'.'publisher_reputation'], 
             array(($book['publisher_name'].'('.$book['publisher_reputation'].')'))); 
             $result[$book_id]['author_name'] = array_merge($result[$book_id] 
             ['author_name'], array(($book['author_name'])));
             }
    
             foreach($result as $key => $data) {
             $result[$key]['publisher_name'.'publisher_reputation'] = 
             array_unique($result[$key]['publisher_name'.'publisher_reputation']);
             $result[$key]['author_name'] = array_unique($result[$key]['author_name']);
             }
             return $result;
             }
    
    $books = transform($books)
    ;?>  
    

    我创建表的html代码:

    <table>
        <tr>
            <th>Book Name</th>
            <th>Author(s)</th>
            <th>Publisher(s) & Reputation(s)</th>
        </tr>
    
    <?php foreach ($books as $book): ?>
    <tr>
        <td><?php htmlout($book['book_name']); ?></td> 
        <td><?php foreach(($book['author_name']) as $author_name): ?>
            <?php htmlout($author_name);?><br /><?php endforeach; ?></td>
        <td><?php foreach(($book['publisher_name'.'publisher_reputation']) as    
              $publisher_namereputation): ?></td>
            <?php htmlout($publisher_namereputation);?><br /><?php endforeach; ?></td>
    </tr>
    <?php endforeach; ?>
    

    结果表(表1):

    Book Name       | Author(s)        | Publisher(s) & Reputation(s)
    BookA             AuthorA            PublisherA(good)
                      AuthorB            PublisherB(bad)
    
    • 根据需要:当我通过AuthorA(WHERE author_id = 1)查询“所有书籍”时,“我得到了上述结果。
    • 根据需要:当我查询“PublisherA发布的所有图书(WHERE publisher_id = 1)时,”我得到了上述结果。
    • 问题:当我查询“声誉良好的发布商发布的所有图书(WHERE publisher_reputation =”good“)时,”我得到以下结果:

    表2。:

    Book Name       | Author(s)        | Publisher(s) & Reputation(s)
    BookA             AuthorA            PublisherA(good)
                      AuthorB            
    

    PublisherB,也与同一本书相关联(但声誉“不好”)不会显示。我确实理解这是因为声誉是从列表中选择的(“好”,“平均”,“坏”),其值与任何单个publisher_id无关(多个发布者可以具有相同的声誉)。我尝试通过以下方式准备信誉列表来解决问题:

    try
    {
        $result = $pdo->query('SELECT publisher_id, publisher_reputation FROM publisher');
    }
    catch (PDOException $e)
    {
        $error = 'Error fetching publisher reputation information!';
        include 'error.html.php';
        exit();
    }
    foreach ($result as $row)
    {
        $reputations[] = array('publisher_id' => $row['publisher_id'],
        'publisher_reputation' => $row['publisher_reputation']);
    }
    (...) 
    

    但是,这给了我一个带有重复值的信誉列表(当数个数据库中有几个具有相同信誉的发布者时)。

    问题:当我搜索与publisher_reputation = good的publisher_name关联的所有book_names时,如何设计返回表1的查询? 任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

我没有全面了解。当我环顾你发布的任何内容时,我遇到了一个你错过的东西,在“$ result = $ pdo-&gt; query(....”

这一行中关闭一个paranthesis

答案 1 :(得分:0)

我假设你的数据库中有3个表是 -
1)书籍 - &gt;用外键存储书籍相关信息作为publisherId
2)发布者 - &gt;存储发布者相关信息,其中publisherId是PK
3)声誉 - &gt; HREF表b / w书和出版商,两个表PK为FK。

如果我猜对了,你可以考虑以下查询 -

  

SELECT * FROM books为B.   INNER JOIN发布者为P on P.publisherId = B.publisherId   INNER JOIN声誉为R on(R.publisherId = B.publisherId AND R.publisherId =   P.publisherId)WHERE R.Reputation =“GOOD”