Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Простейший древовидный форум
 
 автор: Loki   (28.03.2005 в 16:17)   письмо автору
 
 

Есть у меня сабж. Уж не знаю что курил автор в процессе его написания, но на его доведения до ума я убил времени больше чем на весь остальной сайт:) Но так и не довел. Решил что чем ловить чужие баги, лучше переписывать фрагменты кода, которыми я недоволен, заново. Естественно, начать хочу со структуры БД, так как все нанизывается на нее. В связи с этим вопрос: как обычно организована подобная таблица? Имеется ввиду, как сообщения ветвей связаны между собой и с помощью чего задается порядок следования записей?

   
 
 автор: Akira   (28.03.2005 в 16:32)   письмо автору
 
   для: Loki   (28.03.2005 в 16:17)
 

Например этот форум использует такую структуру

forums => Название и порядковые номера всех форумов.
themes => Название и порядковые номера всех тем.
posts => Название и порядковые номера всех постов.

Ну думаю более детально рассматривать не надо...
На мой взгляд не очень удобно, но это на мой взгляд (я пока лучше не придумал)

   
 
 автор: Loki   (28.03.2005 в 16:41)   письмо автору
 
   для: Akira   (28.03.2005 в 16:32)
 

Собственно, возникает вопрос: каким образом определяется, что эти три сообщения относятся к данной теме, а так же их порядок следования, а так же что это ответ на второе сообщение, а не на первое?
Я именно про это спрашивал:)

   
 
 автор: Akira   (28.03.2005 в 16:46)   письмо автору
 
   для: Loki   (28.03.2005 в 16:41)
 

В таблице posts есть

parent_post => Порядковый номер сообщения

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

   
 
 автор: Loki   (28.03.2005 в 17:02)   письмо автору
 
   для: Akira   (28.03.2005 в 16:46)
 

Позор мне... надо было совсем чуть чуть напрячь извилины и сам бы до всего дошел:)
Спасибо!

   
 
 автор: Akira   (28.03.2005 в 17:18)   письмо автору
 
   для: Loki   (28.03.2005 в 17:02)
 

Да пожалуйста =) Я этот форум покусочкам разобрал =) Так , что уже не интересно самому придумывать =)

   
 
 автор: Loki   (28.03.2005 в 17:31)   письмо автору
 
   для: Akira   (28.03.2005 в 17:18)
 

Еще вопрос: как реализыется вывод сообщений?
сам алогоритм. Сначала, как я понимаю, ищется коневое сообщение, которое имеет заполненным только автоинкрементное поле, затем ищутся его наследники, а как ищутся их наследники и в каком порядке?

   
 
 автор: Akira   (28.03.2005 в 17:51)   письмо автору
 
   для: Loki   (28.03.2005 в 17:31)
 

А тут дело темное =) Все действия реализуються в utilits.php =) Есть два вида линейный и древовидный.
Вот, если древовидный То сообщения выводяться по пордяку =) Наченая от родительского (если не путаю , там давно не лазил) и до дочернего, причем по пути вычиляеться какое оно по счету , для сдвига в право ;)

   
 
 автор: Loki   (28.03.2005 в 18:02)   письмо автору
 
   для: Akira   (28.03.2005 в 17:51)
 

Э-э-э... собственно, нет у меня этого файла... и скачать не могу:)
я в данном случае теорию спрашиваю...

   
 
 автор: Akira   (28.03.2005 в 18:33)   письмо автору
 
   для: Loki   (28.03.2005 в 18:02)
 

Думаю cheops лучше опишет =)

   
 
 автор: cheops   (28.03.2005 в 22:52)   письмо автору
 
   для: Loki   (28.03.2005 в 17:31)
 

В отличие от линейного форума, где сообщения выводятся в порядке поступления и где их можно пометить как принадлежащие одной теме здесь следует следует разворачивать цепочку сообщений. Мы не придумали ничего лучшего как рекурсивный спуск.
Самый первый пост имеет поле id_parent = 0, ответы на этот пост в качестве значения этого поля принимают первичный ключ поста-родителя. Рекурсивная функция принимает в качестве одного из аргументов поле id_parent - в её задачи входит вывод сообщения и повторный вызов самой себя столько раз, сколько ответов было на первое сообщение, для каждого сообщения ситуация повторяется и так до тех пор, пока не дойдём до постов на которые нет ответов и для которых нет постов-потомков.

   
 
 автор: Loki   (29.03.2005 в 09:18)   письмо автору
 
   для: cheops   (28.03.2005 в 22:52)
 

Спасибо. До этого вроде дошел сам внимательно изучив фрагмент вашего форума.
Хотел еще спросить про поиск. В результате поиска выводится список тем, где встречается искомое слово. У меня была идея сделать рекурсивный подъем, от сообщения с искомой строкой, до родительского. Но у вас, как я понял, введено дополнительное поле id_theme. Именно по нему определяется первое сообщение темы? (Я не нашел этот фрагмент кода, поэтому и переспрашиваю). Кстати, как присваивается значение полю id_theme? предполагаю, что оно просто равно id_post первого сообщения?

   
 
 автор: cheops   (29.03.2005 в 09:52)   письмо автору
 
   для: Loki   (29.03.2005 в 09:18)
 

А тут как раз проще... каждый пост действительно имеет поле id_theme, с первичным ключом темы, которому принадлежит данный пост, т.е. для каждого отдельного поста можно всегда однозначно сказать какой теме он принадлежит. Поиск сводится именно к определению этих полей - полученный списко делается уникальным (удаляются повторяющиеся поля) при помощи конструкции GROUP BY - сами темы уже выводятся в штатном порядке - рекурсивным спуском.

   
 
 автор: cheops   (28.03.2005 в 22:56)   письмо автору
 
   для: Loki   (28.03.2005 в 16:17)
 

Вы можете за основу взять структуру таблиц в LiteForum http://www.softtime.ru/info/liteforum.php - не обязательно их копировать один в один - просто посмотреть как сделано.

PS Действительно большого разнообразия структурных форумов не наблюдается (открытых и не коммерческих разработок) - это было одной из причин, почему мы начали создание LiteForum.

   
 
 автор: Loki   (29.03.2005 в 15:23)   письмо автору
 
   для: cheops   (28.03.2005 в 22:56)
 

По мере осознания появляются новые вопросы:)
Если на главной странице форума выводить не дерево, а список топиков, то как лучше отслеживать последнее обновление темы? Можно завести отдельную таблицу, как это сделано у вас, можно, наверное, завести дополнительное поле, где корневому сообщению присваивать дату последнего ответа. Я мыслю в правильном направлении или есть более изящные решения?

   
 
 автор: cheops (из ННГУ)   (29.03.2005 в 17:32)
 
   для: Loki   (29.03.2005 в 15:23)
 

Лучше всё-равно создать таблицу для темы - будет проще оперировать темой - при добавлении нового поста - обновлять дату темы - она автоматически будет помещена сверху сортировкой по дате.

   
 
 автор: Loki   (30.03.2005 в 09:14)   письмо автору
 
   для: cheops (из ННГУ)   (29.03.2005 в 17:32)
 

Я пошел другим путем (чувствую, он мне еще аукнется:) - добавил в таблицу 3 столбца: идентификатор темы, последнее обновление темы, автор последнего обновления. Сразу возникла трудность: изначально, хочу присваивать идентификатору темы такое же число, как идентификатор первого сообщения в теме. Идентификатор сообщения - автоинкрементный. Можно ли сделать это в один прием? Или надо сначала создать запись, а затем, считав присвоенный идентификатор поля, присвоить его значение идентификатору темы?

   
 
 автор: cheops   (30.03.2005 в 10:07)   письмо автору
 
   для: Loki   (30.03.2005 в 09:14)
 

В один приём нельзя (вернее можно, но только в MySQL 5), но можно сразу после вставки записи при помощи SQL-оператора INSERT узнать значение только что присвоенного первичного ключа при помощи функции mysql_insert_id() http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1424

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования