За последние 24 часа нас посетили 22009 программистов и 1113 роботов. Сейчас ищут 677 программистов ...

Создание дерева ответов для форума

Тема в разделе "Прочие вопросы по PHP", создана пользователем Storm57, 19 фев 2019.

Метки:
  1. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Сделал простой форум
    Ну темы по категориям, страница темы, далее поль-ль добавляет свой коммент/ответ, и далее хотел сделать чтобы пользователю могли отвечать другие не на тему, а вот конкретному пользователю ну вы поняли короче)). Все делал на обычном РНР своими руками и столкнулся что я не понимаю как выводить эти ответы для конкретного пользователя )).
    Ну то есть можно кончено сделать ну типа будет написано Для такого то пользователя, но это не удобно и не красиво. Так не делают. А делаю как , вот есть ответ и под ни список ответов к этому ответу.
    Так вот как это сделать мозгов не хватает.
    Подскажите мастера как ??
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Либо юзать nested sets, либо хранить коменты в xml.
     
  3. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Проще всего собирать дерево рекурсивно по parent_id.
     
    SProx нравится это.
  4. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Ребят а попроще сделать никто не знает как?
    Нутипа выводим в цикле
    while(mysqli_fetch_arraay($query))
    {
    echo ' ЗДЕСЬ ВЫВОД ОВТЕТА И ДАННЫХ О ПОЛЬЗОЫВАТЕЛЕ ';
    while(mysqli_fetch_array($query2)) {
    echo ' ЗДЕСЬ ОВТЕТ К ЭТОМУ ПОЛЬЗОВАТИЕЛЮ ';
    }
    }
    и вот так вот я сделал но получаться что ID то уних как бы одинаковые получаются
     
  5. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    В таблице с комментариями в таком случае хранят не id пользователя, а id комментария, которому предназначен ответ. Единственная проблема - что хранить в этом поле, когда комментарий адресован теме, а не другому комментарию. Вывод через единственный цикл врятли получится. Данные запроса сначала лучше разобрать и построить дерево, а потом выводить на страницу.
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Storm57, тебе как раз этот вариант посоветовал @ElisDN. Только там не просто цикл в цикле, а рекурсия. На каждый комент отдельный запрос к бд. Но есть один нюанс. Запросы в цикле, это удавка на собственную шею. И чем дольше будет работать твой форум, тем сильнее она будет давить.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @Storm57, чем тебя «сигнальные» обращение и цитирование не устраивают? Тем более на форуме. Меня лично даже в комментах деревья раздражают.
     
    artoodetoo нравится это.
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @miketomlin если делать только одну вложенность, то это ещё нормально, а когда их очень много, то тоже сильно раздражает.
    --- Добавлено ---
    @Valick надо выводить рекурсией не из базы, а формировать рекурсией вёрстку из готового массива.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    для конкретного комментария, а не для пользователя.

    здесь говорят "nested set", не поясняя, что эта технология плохо работает для частых обновлений - а это как раз про комментрирование. она скорее для статичных рубрик, категорий контента.
    смотри "adjacency list". это простая ссылка на parent_id.

    p.s. п.м.с.м. вложенные комментарии не лучшее решение для форума. иногда тема разрастается на тысячи комментариев. если бы она была деревом, неудобно было бы искать свежие комментарии. и неочевидно как дерево разбивать на страницы. а если грузить всё сразу, это может быть напряжно для мобильного клиента.
    лента сообщений в календарном порядке выглядит более естественно, как по мне. а для указания контекста ответа подходит цитирование + обращение в стиле @username.

    читать:
    https://www.slideshare.net/ehildebrandt/trees-and-hierarchies-in-sql
    https://phpbuilder.com/handling-hierarchical-data-in-mysql-and-php/
     
    miketomlin нравится это.
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Dimon2x, а готовый массив Пушкин на досуге гусиным пером начеркает?
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    p.p.s. посмотри ещё как организован пользовательский интерфейс на stackoverflow: есть ответы и комментарии. ответ это то, что претендует на звание "решения" для заданного вопроса. получается разумный компромис между иерархией и доступностью.
     
  12. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    о да... конечно же я не понимаю, что в единицу времени комент пишет один человек, а читают сотни
    ТС спросил про дерево, про дерево я ему и ответил
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @Valick это что, был сарказм? :) добавлять ноду во вложенные множества это дорогая операция. она может потребовать изменения чуть меньше чем всех существующих записей. об этом написано во всех руководствах по иерархическим структурам данных.
    --- Добавлено ---
    ты молодец, что ответил ТСу. я только дополнил твой ответ.
     
    miketomlin нравится это.
  14. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Всем спасибо ребят!
    Думаю остановлюсь на варианте самом простом.
    То есть просто будет помечаться что это ответ для такого то пользователя и все, без вложенных циклов. Ну типа как здесь, цитата добавляется и понятно для кого ответ.
    Так и проще и правильнее наверное, чтобы не напрягать сервер.
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @Valick, ну это же известный факт, что вложенные множества хорошо подходят для редко изменяемых и/структур. Да и самому должно быть понятно, если знаешь принципы реализации основных действий над в/множествами, – при добавлении узла в среднем нужно половину узлов обновить.
    --- Добавлено ---
    Посты с «решениями» можно просто выделять особым образом, например фон подкрашивать или яркую шапку добавлять.
     
  16. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, не надо выдавать желаемое за действительное, я прекрасно знаю плюсы и минусы nested sets (уже наверно лет 10).
    Другой вопрос с чего вы с @artoodetoo взяли, что на форумы пишут гораздо чаще, чем читают, мне доподлинно не известно.
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    ??? Наоборот я сильно удивился, услышав такой совет от тебя.

    :D Да, с таким аргументом трудно спорить.
    --- Добавлено ---
    Хотя все же рискну предположить, что пишут чаще, чем «раз в сто лет» :)
     
  18. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, это примерно так же как пострелять из палки :)
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Это ты почему-то решил так за нас. Приписываешь свои мысли.

    Медленную отдачу страниц довольно просто ускорить кешированием.
    --- Добавлено ---
    А вот как ускорить запись, при которой надо апдейтить все узлы выше по иерархии и все узлы правее? Никак.
    --- Добавлено ---
    Предположим у нас есть кеш для ускорения чтения тем.
    Если "дерево комментариев" реализовано через AL, новый комментарий должен инвалидиповать только текущую тему. А если через NS, то новый комментарий должен сбросить кеш для множества тем, как следствие того что обновятся ключи туевой хучи узлов.