Web Developer On1x.com Игры как увлечение Видео–игры как хобби и увлечение. Новости игровой индустрии. Блог про видео–игры.
Diablo 3 Reaper of Souls рецензия, стоит ли вернуться в игрувидео-трансляции по играмУтиные истории возвращаются

Поиск новых сообщений

Привет всем. Решил написать пост про поиск новых сообщений, условно — на форуме.
Года 3 назад — это казалось жутко сложным, прошло время — и понимание механизма работы подобного поиска — уже сформировалось.
Для примера разберем форум с разделами и темами внутри него.

Структура(таблицы в бд):
Раздел — йд, йд родителя(для ветвления), actiontime(основной показатель — когда был обновлен раздел, в формате unixtime).
Тема — йд, йд раздела(в котором он размещен), actiontime.
Комментарий — йд, йд темы, time(время создания комментария).

Данный пример — непосредственно для объяснения принципа работы подобного поиска. Само собой и раздел и тема, и комментарий — содержат название, йд создателя(пользователя) и сам текст.
Просто для объяснения механизма — решил опустить неважные детали.

Итак — когда кто-то пишет или тему, или комментарий — у текущего элемента обновляется actiontime, и он же — записывается родителю. Таким образом если мы напишем комментарий — у самой темы обновится actiontime — и у раздела этой темы он тоже обновится на текущее время.

Все. Форум живой — там общаются, и есть заполненные данные для тестов. Теперь перед нами стоит задача — как-то решать, читал текущий пользователь раздел / тему или нет. Если читает сейчас — то сохраняем эту информацию в отдельную табличку:
йд пользователя, путь(допустим: "раздел_5" или "тема_12"), время прочтения.

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

Также можно уже сверять — время посещения пользователя больше или меньше времени последнего обновления элемента. Если меньше — то можно это отобразить графически в виде иконки, либо выделить название темы жирным текстом.

В современных форумах сейчас создан механизм поиска новых сообщений во всем форуме. Он работает по принципу выборки всех тем, и проверки времени их обновления с временем их прочтения конкретным пользователем.
Передо мной стояла другая задача — создать поиск в любом разделе форума, включая подразделы.
Задача сводилась к похожей, но есть пару нюансов касательно производительности, и вот к чему я пришел в итоге:

Формируем массив — $parent_arr. Записываем в него сначала йд раздела, в котором пользователь хочет найти что-то новое. Запускаем рекурсивную функцию — по поиску подразделов к данному разделу — если нашли, пополняем $parent_arr.

После того как получили дополнительный массив всех подразделов — формируем запрос для выборки тем, только среди этих разделов.
Выбираем всю информацию, вместе с йд и actiontime. Проверяем у каждой темы факт "новая" она или нет для текущего пользователя, если она содержит новые комментарии — заносим ее в отдельный массив, допустим $search_result.
И вот на данном этапе — самое интересное, чтобы не повторять подобный поиск — правильней будет сохранить результаты в отдельную таблицу.
В таблице храним — йд поиска, пользователь(который активировал поиск), номер раздела(в котором происходил поиск), и результат с временем поиска.
В качестве результата — пишем строку serialize($search_result). Все!
Теперь при повторном поиске можно проверять время поиска, и если он был недавно — выводить для данного пользователя — уже готовые данные, предварительно сделав $search_result=unserialize($row['result']).
Теперь в стандартном режиме — можем выполнить обход данного массива, и сформировать результаты поиска для пользователя.
Подобным образом реализован поиск на форуме Веб-форумы.рф
Дата записи: 18.02.2011 16:31
On1x blog
my ip