Теперь мы знаем, как вводить комментарии в систему. А как их оттуда извлекать? В предыдущих разделах уже обсуждался механизм подключения комментариев к определенной статье (с помощью столбцов из обеих таблиц) и друг к другу (с помощью поля creply в таблице comments, которое используется для идентификации порождающей ветви определенного комментария). Итак, теперь необходимо превратить эту логическую связь в визуальную.
Для этого нам нужна функция build_tree() . Это рекурсивная функция, запрограммированная специально для решения задачи итерации по набору узлов "родитель-потомок" и установления связи между ними. В качестве аргументов эта функция требует идентификатор статьи и начальный комментарий. Она использует эту информацию для создания иерархического дерева комментариев по определенной статье. Рассмотрим пример.
Листинг 20.37.
# это рекурсивная функция
# построения дерева комментариев sub build_tree()
{
# получить идентификатор начального комментария и статьи
# в качестве входных параметров $cid = shift; $aid = shift;
# подключиться с базе данных
my $dbh = DBI->connect("DBI:mysql:database=dbl;host=localhost", "root", "pass",
('RaiseError' => 1));
# выполнить запрос
my $sth = $dbh->prepare("SELECT cid, csubject FROM comments where aid = '$aid' AND creply = '$cid'"); $sth->execute();
# если получен результат
# распечатать строку темы комментария
# в противном случае - сообщение, констатирующее отсутствие комментариев
if ($sth->rows() <; 0 && $cid ;; 0)
{
print "<font face;Verdana size;2 color;Black><b>Нет коммента-риев</b></font>"; }
else {
# просмотр результирующего набора while($ref; $sth->fetchrow_hashref())
{
# распечатать комментарии в виде списка
# построить иерархическое дерево с применением рекурсии print "<ul>";
print "<li><a href;"details.cgi?cid;$ref->{'cid'}&aid;$aid"><font
face;Verdana size;2 ;color;Black><b>$ref->{'csubject'}</b></a> </li>n"
build_tree($ref->{'cid'}, $aid);
print "</ul>";
}
}
}
Эта функция сначала открывает соединение с базой данных, используя для этого уже известный метод connect(). Для него также требуются переменные: уровень, с которого необходимо начинать построение структуры дерева, и идентификатор статьи (передаются в виде параметров).
Функция build_tree() выполняет оператор SELECT, получает список комментариев "нулевого уровня" и распечатывает его. Таким образом, для каждой возвращенной записи функция build_tree() вызывает себя рекурсивно с номером записи, снова подключается к базе данных и отображает комментарии уровня 1. Этот процесс продолжается до достижения конца дерева. Для обеспечения правильной идентификации различных уровней используется HTML-конструкция печати списков <ul>. Если на уровне 0 комментариев не обнаружено, отображается сообщение, которое отражает это же самое.
Каждый элемент отображенного списка в конечном итоге ссылается на страницу de-tails.cgi, которая отображает полное содержание комментария. Сама функция build_tree() вызывается описанным выше сценарием article.cgi по ссылке, размещенной под текстом статьи и отделенной от текста парой горизонтальных линий. Предлагаем вашему вниманию доработанный сценарий article.cgi, в который добавлена новая функциональность.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Создание древовидного оглавления комментариев
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Добавление комментариев | Все о MySQL. Создание древовидного оглавления комментариев. Напечатать или умереть |