如何在 PHP 中从相关数组中查询值并将其显示在 HTML 表格中

问题描述 投票:0回答:2

以下二维数组存储书籍信息(1.ID、2.名称、3.作者 ID、4.作者姓名、5.出版商 ID、6.出版商名称、7.出版商信誉):

$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_id,book_name),出版商(publisher_id,publisher_name,publisher_reputation)。

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

  1. 书籍名称 - 字段列出特定书籍。
  2. 作者 - 字段列出了与本书相关的所有作者。
  3. 出版商和声誉 - 字段列出了与本书相关的所有出版商(及其声誉)。

我目前正在使用以下代码:

<?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(WHEREauthor_id=1)的所有书籍”时,我得到了上述结果。
  • 如愿:当我查询“PublisherA(WHEREpublisher_id=1)出版的所有书籍”时,我得到了上述结果。
  • 问题:当我查询“由声誉=良好的出版商出版的所有书籍(WHEREpublisher_reputation=“good”)”时,我得到以下结果:

表2:

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

出版商 B,也与同一本书相关联(但声誉“不好”)不会显示。我确实明白这是因为声誉是从列表(“好”、“平均”、“坏”)中选择的,其值与任何单独的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_name(publisher_reputation = good)关联的所有book_names时,如何设计一个返回表1的查询? 任何帮助,将不胜感激。

php sql select multidimensional-array html-table
2个回答
1
投票

我看不到完整的视图。当我查看您发布的所有内容时,我发现您错过了在“$result = $pdo->query(....”行中关闭括号的事情。


0
投票
我假设您的数据库中有 3 个表,它们是 -

1) Books -> 存储书籍相关信息,外键为publisherId
2) Publisher -> 存储与publisher相关的信息,其中publisherId是PK
3) 声誉 -> HREF 表黑白书籍和出版商,两个表 PK 均为 FK。

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

从书籍中选择 * 作为 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"

© www.soinside.com 2019 - 2024. All rights reserved.