Недавно ко мне обратился читатель с вопросом по скрипту комментариев. Смысл состоял в том, что необходимо показать массовость данного скрипта.
Представьте, что у вас на блоге 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

Новый столбец создан. Теперь понятно, что, например, комментарий Петра был добавлен для статьи с номером 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 - добавился новый файл.
Попытался объяснить самым максимально доступным способом, но чувствую, что для многих какие-то мелочи останутся за кулисами. Комментируйте. Будем разбираться.

Рубрика:
Просмотров: 3280
Дата: 31.10.09


2.03.10
3.02.10
12.01.10
28.11.09
22.11.09
22.10.09
27.09.09
18.09.09
18.08.09
6.08.09