Интеграция комментариев в сайт | SelkinVitaly.RU
Интеграция комментариев в сайт | SelkinVitaly.RU

Интеграция комментариев в блог

Рубрика: PHP

Просмотров: 3280

Недавно ко мне обратился читатель с вопросом по скрипту комментариев. Смысл состоял в том, что необходимо показать массовость данного скрипта.

Представьте, что у вас на блоге 50 статей и 30 комментариев, добавленных к данным статьям. Если мы обратимся к любой их них [статей], то наш скрипт будет выводить все комментария, которые находятся в таблице:

Неправильный пример работы скрипта
Вывод всех комментариев

Но нам нужно чтобы выводились лишь те, комментария, которые были добавлены именно для данной статьи:

Правильный пример работы скрипта
Вывод комментариев, принадлежащих статье

Именно про эту особенность я и хочу вам рассказать.

Скачать скрипт

Предыдущие статьи по скрипту

Принцип реализации

Допустим, что у нас на блоге имеются следующие три статьи:

Массовость в работе скрипта

Видим по колонке id, что каждая статья имеет свой уникальный номер. Благодаря данному номеру пользователь обращается к той или иной статье на блоге. Например, при вводе post.php?id=1 отображается первая запись, post.php?id=3 - третья и тд.

Все комментарии у нас хранятся в табличке comment:

Массовость в работе скрипта

Теперь представьте, что комментарий Виктора принадлежит статье с номером 3, Виталия - с номером 2 и Петра - с номером 1. Но как это будет понимать скрипт, что первый комментарий пренадлежит именно статьи с номером 3? Никак, для этого необходимо добавить новый столбец, в котором мы будем указывать номер статьи, к которой принадлежит данный комментарий. То есть мы должны получить такой результат:

Массовость в работе скрипта

Для того чтобы создать данный столбец нужно вставить следующий SQL-запрос:

ALTER TABLE `comment` ADD `num` INT( 9 ) NOT NULL AFTER `id`;
UPDATE `comment` SET `num` = '3' WHERE `id` =1 LIMIT 1 ;
UPDATE `comment` SET `num` = '2' WHERE `id` =2 LIMIT 1 ;
UPDATE `comment` SET `num` = '1' WHERE `id` =4 LIMIT 1
Вставка SQL-запроса

Новый столбец создан. Теперь понятно, что, например, комментарий Петра был добавлен для статьи с номером 1. Каким будет наш следующий шаг?

Теперь давайте откроем файл (index.php) скрипта, на котором выводятся сами комментария и подробно рассмотрим вторую строку:

$res = mysql_query ("SELECT * FROM ".$tbl." ORDER BY id DESC",$db);

Данную запись можно перевести так:

"Вытащи (SELECT) мне все поля (*) из таблицы comment ($tbl), отсортировав по id в обратном порядке (ORDER BY id DESC)".

Что у нас произойдёт при таком запросе? У нас на данной странице выведутся все комментария, даже те, которые были добавлены к другой статье. Ну как сделать так, чтобы выводились лишь комментария, принадлежащие именно этой статье. Для этого мы меняем запрос на следующий:

$res = mysql_query ("SELECT * FROM ".$tbl." WHERE num='$_GET[id]' ORDER BY id DESC",$db);

Теперь в нашем запросе появилась строчка WHERE num='$_GET[id]', поэтому полученный изменённый запрос можно перевести так:

"Вытащи (SELECT) мне все поля (*) из таблицы comment ($tbl), где поле NUM равно номеру в адресной строке (WHERE num='$_GET[id]'), отсортировав по id в обратном порядке (ORDER BY id DESC)".

Например, пользователь обращается к статье по адресу post.php?id=3 (тройка - это и есть $_GET[id]), и скрипт выводит на страницу все комментарии, поле NUM которых равно трём. У нас только один комментарий имеет поле NUM, равный трём, это комментарий Виктора, поэтому только он и окажется на странице.

Остался ещё один шаг. Комментария теперь у нас выводятся корректно, но вот при добавлении нового скрипт не поймёт какой номер присваивать полю NUM, ведь у нас раньше этого поля не было, поэтому обработчик (файл submit.php) тоже надо оповестить. Для этого мы добавляем строки:

$num = trim ($_POST["num"]);
$num = htmlspecialchars ($num);

if (!isset($num) or empty ($num)) {echo "<meta http-equiv='refresh' content='3;URL=$_SERVER[HTTP_REFERER]'>";exit ("<div align='center'><div class='alert'>Отсутствует переменная NUM!</div></div>");}

$insert = mysql_query ("INSERT INTO ".$tbl." (num,name,date,email,text) VALUES ('$num','$name','$date','$email','$text')",$db);

Новые строки отмечены на скрине:

Изменение кода файла-обработчика

Изменение кода файла-обработчика

И осталось лишь добавить новое скрытое поле в форму, расположенную в index.php. На данный момент код таков:

<form name="comment_f" class="comment-form" method="post" action="submit.php">
<p>Имя:<br/><input name="name" type="text"/></p>
<p>Email:<br/><input name="email" type="text"/></p>
<p>Текст:<br/><textarea name="text" rows="5" cols="30"></textarea></p>
<p><input class="button" name="button" type="submit" value="Добавить"/></p>

После добавления скрытого поля код станет таким:

<form name="comment_f" class="comment-form" method="post" action="submit.php">
<p>Имя:<br/><input name="name" type="text"/></p>
<p>Email:<br/><input name="email" type="text"/></p>
<p>Текст:<br/><textarea name="text" rows="5" cols="30"></textarea></p>
<input name="num" type="hidden" value="<?php echo $_GET[id]; ?>"/>
<p><input class="button" name="button" type="submit" value="Добавить"/></p>

Готово. Предлагаю составить план, согласно которому мы вносили изменения:

  • 1. Добавляем новое поле, в котором будет храниться номер статьи, к которой принадлежит комментарий.
  • 2. Меняем запрос в файле index.php.
  • 3. Добавляем новое скрытое поле в форму и редактируем обработчик (submit.php).

Естественно, что вместо статей, могут быть и какие-то заметки, и фотоальбом, то есть любой контент, находящийся в базе.

Файлы, которые подверглись изменению

  • index.php - страница, на которой выводятся комментария.
  • submit.php - файл, отвечающий за обработку нового комментария.
  • post.php - добавился новый файл.

Попытался объяснить самым максимально доступным способом, но чувствую, что для многих какие-то мелочи останутся за кулисами. Комментируйте. Будем разбираться.

Комментарии:

Добавил: Андрей (16-Feb 2011 9:46:37)

проверка. посмотрим как работает

Добавил: Андрей (30-Jan 2011 19:31:43)

Не подскажете? Когда добавляю коментарий в базе данных во всех строках NUM = 0. Если я его меняю на id страницы - все работает. Что я не так сделал?

Добавил: Сергей (02-Jan 2011 22:00:49)

При добавлении комментария, у меня пишет "отсутствует переменная NUM",что я не так сделал?

Добавил: kaban (16-Oct 2010 3:14:33)

Чуть не забыл: переменная $id должна находиться перед строкой: $res = mysql_query ("SELECT * FROM ".$tbl." WHERE num='$id' ORDER BY id DESC",$db); в индексовом файле, и так для каждого цикла. Это я для новичков изголяюсь, коим был. Всем приятного кодинга ... Ваш КАБАН.

Добавил: kaban (16-Oct 2010 3:07:33)

В дополнение к этому и к article29.html могу сообщить: если нету в глобале [id] , то можно присвоить каждой статье (в теле) идентификатор <?php $id=XXXX;?> где ХХХХ Вами присвоеный идентификатор, а вместо глобальной $_GET[id] пишем ~Цитирую строку целиком~ файла index.php -$res = mysql_query ("SELECT * FROM ".$tbl." WHERE num='$id' ORDER BY id DESC",$db); ну и собственно надо убрать : $row["email"] и один %s в том же файле, дабы не палить ИМЕЙЛЫ кАментаторов. Ну и для окончания добавляем стрчку: <input name="num" type="hidden" value="<?php echo $id ?>"/> в индексовом файле . все. Я у себя сделал 35 разных камментов на одной странице, для проверки =) все работает. Если есть вопосы пишите 9416312.ru/out/ Кста: Афтару - РЕСПЕКТ и УВАЖУХА, сюда б еще капчу, но это дело каждого из нас =) Капчей полным-полно, адин болт все ломаются, так было и так будет !!! se la Vi

Добавил: mkden (30-May 2010 9:51:08)

Спасибо автору за его труд все заработоло!

Добавил: mkden (30-May 2010 0:30:00)

А если у меня страница выводиться в таком виде ?s=2 мне везде вместо $_GET[id] ставить $_GET[s] скажите пожалуйста!

Добавил: Гость (01-May 2010 19:31:46)

Спасибо за Ваш труд! Скрипт пришёлся очень кстати.

Добавил: Mike (09-Apr 2010 0:08:37)

Скажите пожалуйста, как быть если у меня статьи распологаются не по адресу post.php?id=3 а например file-3

Добавил: Андрей (17-Feb 2010 3:25:56)

Спасибо большое, все отлично работает и устанавливается за минуту.


Добавление комментария:

Имя *:

Email:

Текст *:

Символы на картинке *:

RSS-подписка
RSS-подписка на статьи по основам сайтостроения RSS-подписка на полезные уроки по web-языкам
Разделы статьй
Каталог товаров
Разделы уроков
Последние статьи
Последние уроки