Как запрашивать значения из связанных массивов в PHP и отображать их в таблице HTML

109
6

Следующий двумерный массив хранит информацию для книг (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"),

В книге могут быть несколько авторов и несколько издателей. Автор может быть связан с несколькими книгами. Издатель может быть связан с несколькими книгами. У издателя может быть только одна репутация (из списка значений: "хороший", "средний", "плохой").

EDIT: данные хранятся в 3 таблицах. author (author_id, author_name), book (book_id, book_name), издатель (publisher_id, publisher_name, publisher_reputation).

Я хотел бы создать таблицу HTML со следующими столбцами:

Название книги - полевые списки конкретной книги. Автор - В поле перечислены все авторы, связанные с книгой. Publisher & Reputation - Field публикует все издатели (и их репутацию), связанные с этой книгой.

В настоящее время я использую следующий код:

<?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']);
}
(...)

Однако это дает мне список репутаций с повторяющимися значениями (когда несколько издателей с одинаковой репутацией находятся в базе данных).

Вопрос: Как я могу спроектировать запрос, который возвращает таблицу 1, когда я ищу все имена book_names, связанные с именем publisher, с publisher_reputation = good? Любая помощь будет оценена по достоинству.

спросил(а) 2021-01-27T17:15:07+03:00 5 месяцев, 4 недели назад
1
Решение
63

Я не вижу полного представления. Когда я просматриваю все, что вы разместили, я сталкивался с тем, что вы пропустили, чтобы закрыть paranthesis в строке "$ result = $pdo-> query (..."

ответил(а) 2021-01-27T17:15:07+03:00 5 месяцев, 4 недели назад
45

Я предполагаю, что в вашей базе данных есть 3 таблицы, которые -
1) Книги → хранит информацию, связанную с книгами, с иностранным ключом как publisherId
2) Издатель → хранит информацию, связанную с издателем, где publisherId PK
3) Репутация → вид HREF таблицы b/w книг и издателей с обеими таблицами PK как FK.

Если я догадываюсь, что вы можете рассмотреть следующий запрос -


SELECT * FROM books as B INNER JOIN издатель как P на P.publisherId = B.publisherId INNER JOIN репутация как R on (R.publisherId = B.publisherId AND R.publisherId = P.publisherId) WHERE R.Reputation = "GOOD"

ответил(а) 2021-01-27T17:15:07+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема