Здравствуйте! Учу php, делаю блог, пытаюсь связать комментарии к постам. То есть, сделать так, чтоб каждый комментарий был связан со своим постом. Проблема в том, что не могу сообразить как правильно query реализовать, чтоб показывать именно связанные комменты с постами, а не все сразу. Вот query, до которого я мучительно додумался, но он все-же не выводит ничего, явно составлен неверно:
SELECT `commentID`, `name`, `content`, `post_id`, `date`
FROM `blog_comments`
WHERE `post_id` = `commentID`'
Я так понял, мне надо связать postID с post_id в таблице blog_comments. До всего этого додумался, но как правильно в коде реализовать не могу, знание синтаксиса еще слишком слабое :)
Буду очень благодарен за любую помощь и направление, спасибо большое!
Также мои таблицы:
blog_posts:
postID (Primary) int(11) No
postTitle varchar(255) Yes NULL
postDesc text Yes NULL
postCont text Yes NULL
postDate datetime Yes NULL
blog_comments
commentID (Primary) int(11) No
name varchar(55) No
content varchar(255) No
post_id int(11) No blog_posts -> postID
date timestamp No CURRENT_TIMESTAMP
В целом вы на правильном пути, критерий выборки у вас действительно должен сравнивать blog_comments.post_id и blog_posts.postId, но в условии вы почему то сравниваете другие поля.
Как бы то ни было. На некоторой странице вы показываете пост и его комменты. Для показа нужного поста, у вас видимо в параметрах URL есть его Id, который в php-коде вы получаете, например, в виде $_GET['post_id'].
Далее вам необходимо выбрать всю информацию о посте. Для этого вы должны написать запрос вида:
SELECT * FROM blog_posts WHERE postId = :id
Возьмите за правило хорошего тона сразу никогда не подставлять переданные параметры напрямую в запрос, по крайней мере без предварительной проверки. Если вы напишите код вида $sql = "select * from blog_posts where postId = ${_GET['id]}", то при передаче в качестве id строки вида 1; delete from posts; приведет к удалению ваших данных. Если вы хотите подставить значение напрямую в запрос, то по крайней мере проверьте его с помощью is_numeric() или intval(). Не забудьте почитать про SQL-инъекции
Для работы с БД используйте современные расширения, например, PDO. Читая старые книги, вы часто можете встретить использование функций mysql_* (не путать с mysqli_). Они уже устарели.
Учитывая вышеизложенное, ваш код выборки должен выглядеть примерно следующим образом:
$sth = $dbh->prepare('SELECT * FROM blog_posts WHERE postID = :id');
$sth->bindParam(':id', $id, PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_ASSOC);
Теперь вы хотите загрузить связанные комментарии. Используйте для этого второй запрос. В целом связывать таблицы здесь и не надо:
$sql = "SELECT * FROM blog_comments WHERE post_id = :id ORDER BY date DESC";
$sth = $dbh->prepare($sql);
$sth->bindParam(':id', $id, PDO::PARAM_INT);
$sth->execute();
$result['comments'] = $sth->fetchAll();
Теперь в переменной $result будут содержаться данные поста и комментарии. Осталось показать их пользователю. Многие мешают вместе в одном файле логику работы (php-код) и отображение данных (представление, html). Это плохой подход, так что лучше сразу глянуть в сторону движков шаблонов как smarty, twig и т.п.
Так то теперь останется оформить html-код и вывести данные.
И на заметку по именование полей ваших таблиц. Первичный ключ обычно именуют просто id. Нет никакого смысла называть их postId или commentId, так чаще именуют поля внешних ключей (postId или post_id). То есть первичный ключ просто id, а внешний ключ обычно содержит имя внешней таблицы и суффикс id, _id, _ID и т.п.
Ну а на последок, если вы дочитали до этих строк, то прежде чем начинать изучать php, уделите немного времени изучению баз данных. Прочитайте какую-нибудь небольшую книжку, которая вам даст понимание основ их использования. И вам будет легче продолжить изучение.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей