Добавить/показать комментарий к посту в блоге на PHP/MySql?

629
05 февраля 2017, 14:34

Здравствуйте! Учу 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   
Answer 1

В целом вы на правильном пути, критерий выборки у вас действительно должен сравнивать 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, уделите немного времени изучению баз данных. Прочитайте какую-нибудь небольшую книжку, которая вам даст понимание основ их использования. И вам будет легче продолжить изучение.

READ ALSO
Как в yii2-images выводить изображение по name?

Как в yii2-images выводить изображение по name?

ЗдравствуйтеПытаюсь использовать CostaRico yii2-images

748
скрипт работает в не по очереди

скрипт работает в не по очереди

есть скрипт он выполняет одно условие раньше другого , суть такая выбираю чекбоксы и изменяю значения или удаляю вот html формаПролема в том...

548
Xamarin.Forms, как передать json в php?

Xamarin.Forms, как передать json в php?

Доброго времени сутокПомогите разобраться в том как передать json из Xamarin

615
отсутствие default в switch

отсутствие default в switch

Я сделал калькулятор

473