Новичок здесь, будьте нежны, пожалуйста. У меня есть таблица, в которой один столбец - это названия книг, а другой - их соответствующие авторы. Я использую PDO для подключения к базе данных и отображения результатов запроса на веб-странице. По сути, я хочу, чтобы каждый УНИКАЛЬНЫЙ автор отображался один раз, а затем список названий каждой книги, которую автор написал ниже, например:
Author 1
title1
title2
Author 2
title3
title4
Запрос для получения списка отдельных авторов:
<?php try {
$connection = new PDO($dsn, $username, $password, $options);
$sql = "SELECT DISTINCT author FROM booktable;"
$statement = $connection->prepare($sql);
$result = $statement->fetchAll();
} ?>
Цикл Foreach для отображения каждого автора:
<?php foreach ($result as $row) { ?>
<p><?php echo ($row["author"]); ?></p>
<?php } ?>
Пока все хорошо, это дает мне список уникальных авторов. Для заголовков я пытался сделать еще один цикл foreach, вложенный в первый, чтобы отобразить второй запрос, но я не могу понять, как получить только автора, в котором цикл находится в данный момент. Я попытался установить переменную внутри цикла следующим образом:
<?php foreach ($result as $row) { ?>
<p><?php echo ($row["author"]); ?></p>
<?php $currentauthor = ($row["author"]); ?>
<?php foreach ($result2 as $row2) { ?>
<p><?php echo ($row2["title"]); ?></p>
<?php } ?>
<?php } ?>
А затем добавить еще один запрос в мой исходный TRY (вместе с соответствующим новым оператором подключения и выборки):
$sql2 = "SELECT * FROM booktable WHERE author = '$currentauthor'";)
Но это ничего не возвращает, потому что переменная $currentauthor не существует вне цикла foreach. Итак, моя проблема. Я иду об этом неправильно?
Я понятия не имею, что такое соединение, если честно. Я очень новичок в этом.
Я действительно думаю, что любая вводная книга или учебник по MySQL (и MySQL, и PHP) будут чрезвычайно полезны.
Разве это не объединение двух или более таблиц? У меня только один стол.
Нет. Соединения предназначены для соединения экземпляров таблиц, будь то 1, 2 или 1000.
Похоже, вы должны иметь возможность делать то, что пытаетесь, с помощью одного запроса без соединения. Вы можете использовать SELECT * FROM booktable ORDER BY author
и прокручивать его результаты, выводя данные об авторе только тогда, когда вы обнаружите, что текущая запись имеет другого автора, чем предыдущая (и, очевидно, для первой записи).
Примечание, поскольку вы новичок: *
в SELECT *
обычно считается плохой формой для окончательных развернутых запросов; Я просто использовал его здесь как заполнитель, так как я не знаю всех полей, из которых вам нужны данные. Лучше всего указать все поля, которые вы будете использовать, так как это: (1) документирует используемые данные без необходимости проверки всего кода, который работает с данными, (2) делает запрос менее уязвимым, не зависящим от определения таблицы. для порядка столбцов (3) прерывает запрос, если используемое поле удаляется из таблицы, а не более поздний код, который предполагает, что значение будет там (которое затем должно быть отслежено до запроса), (4) сохраняет количество данных, которые необходимо собрать вместе и передать только то, что необходимо, и (5) больше...
На самом деле я просто пробовал что-то подобное, и это ДЕЙСТВИТЕЛЬНО работало (в основном создавало пустую переменную для автора, записывало в нее каждый цикл и проверяло ее против себя), но я не мог понять, как разбить результаты на страницы на основе автора вместо количества книг. Но это совсем другой вопрос, я думаю.
Я использую * в большинстве своих запросов, потому что мне буквально нужны все столбцы для проекта, который я делаю. Так что все же было бы лучше перечислить столбцы, которые я хочу?
Если это всего лишь небольшой проект по самообучению, над которым вы и только вы когда-либо будете работать и, вероятно, никогда не вернетесь к нему; это, наверное, хорошо. Это больше проблема больших систем с несколькими разработчиками или долгосрочной разработки, когда это становится действительно важным. В качестве крайнего примера представьте, что у вас есть таблица «продукты». Начиная с проекта, у него есть немного больше, чем идентификатор, имя и цена; поэтому вы выбираете *, чтобы получить список продуктов... позже кто-то добавил идентификатор поля большого двоичного объекта для фотографии с высоким разрешением для каждого продукта; теперь ваши текстовые списки загружают множество файлов, которые они на самом деле не используют.
Спасибо за помощь.
Что не так с соединениями?