За последние 24 часа нас посетили 22285 программистов и 1082 робота. Сейчас ищут 645 программистов ...

MySQL версия форумного движка ExBB

Тема в разделе "Прочие вопросы по PHP", создана пользователем Николай12, 14 апр 2014.

  1. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    А как делать такую проверку? Форумы хранятся в одной таблице, права доступа в другой.
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну что нужно выбрать в данном случае? - ФОрумы которые текущий юзер имеет право - ЧИТАТЬ. чтобы показать ему список доступных. так?
    получается что через LEFT JOIN exbb_access ON (exbb_access.forum_id=exbb_forums.forum_id AND exbb_access.access_name='read' )
    тут смотря как у вас хранятся связи. групп и типов доступа.
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Николай12, может я чего-то не понял, но всех движках есть система прав и права, ясный пень, в отдельных таблицах. достаточно одного запроса с джойном чтобы права были учтены.

    например punbb/fluxbb (и вероятно phpbb от которого они идейно набрались):
    выбрать все форумы, на которые есть право чтения (forum_perms.read_forum = 1 или такая запись отсутствует, т.е. по умолчанию право есть)
    Код (Text):
    1. SELECT
    2.   c.id AS cid, c.cat_name,
    3.   f.id AS fid, f.forum_name
    4. FROM
    5.   categories AS c INNER JOIN
    6.   forums AS f ON c.id=f.cat_id LEFT JOIN
    7.   forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=:g_id)
    8. WHERE
    9.   fp.read_forum IS NULL OR fp.read_forum=1
    10. ORDER BY
    11.   c.disp_position, c.id, f.disp_position
     
  4. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Теперь использую вот такую конструкцию:
    Код (Text):
    1.  
    2.     public function getForums($cat_id=false) {
    3.         $where = ($cat_id != false) ? db::parse('WHERE cat_id=?i', $cat_id) : '';
    4.  
    5.         $allForums = db::getInd('id', 'SELECT exbb_forums.*, exbb_access.access_value FROM exbb_forums
    6.         LEFT JOIN exbb_access ON
    7.         (exbb_access.forum_id=exbb_forums.id AND exbb_access.access_name="view_forum"
    8.         AND exbb_access.group_id=?i)
    9.         ?p
    10.         ORDER BY position', core::$user->getGroupId(), $where);
    11.        
    12.         $this->subForums = array();
    13.  
    14.         foreach ($allForums as $id => $forum) {
    15.             if ((is_null($forum['access_value']) && Rights::$default['view_forum'] != 1) || $forum['access_value'] == 0) unset($allForums[$id]);
    16.  
    17.             if ($forum['parent_id'] != -1) {
    18.                 $this->subForums[$forum['parent_id']][$id] = $forum;
    19.                 unset($allForums[$id]);
    20.             }
    21.         }
    22.        
    23.         return $allForums;
    24.     }
    Сам SQL-запрос:
    Код (Text):
    1.  
    2. SELECT exbb_forums.*, exbb_access.access_value FROM exbb_forums
    3.         LEFT JOIN exbb_access ON
    4.         (exbb_access.forum_id=exbb_forums.id AND exbb_access.access_name="view_forum"
    5.         AND exbb_access.group_id=ID_группы)
    6.                 тут WHERE (если выбирается только одна категория)
    7.         ORDER BY position
    С 33запросов уменьшилось до 18.

    Добавлено спустя 5 минут 58 секунд:
    если кому интересно, можно скачать полный модуль главной страницы (где выводятся все категории и форумы) отдельно.
    http://exbb.pw/index.php?a=topic/getattach&id=1

    Добавлено спустя 2 минуты 44 секунды:
    Может так делать неправильно, но у меня есть возможность указать, будет ли доступ если запись отсутствует для конкретного форума. Т.е. права по умолчанию. Хранятся тоже в таблице exbb_access но в поле forum_id у них стоит 0
     
  5. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    таблица exbb_access - в таблице хранятся права доступа для групп
    таблица exbb_groups - в таблице хранится информация о группах пользователей.
    - поле admin_access - имеет ли доступ в админ-панель (0 - нет, 1 - да)

    зачем это поле(admin_access) сделано отдельным? ведь есть таблица для описания всех видов доступа. может логичнее там описать права доступа в админ панель?


    exbb_forums - в таблице хранится информация о форумах
    поле read_data - массив пользователей, которые прочитали форум.
    WHAT? тоесть там лежат айдишники ВСЕХ кто прочитал форум? ужасть
     
  7. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    это временно. Пока не найду более правильного и быстрого способа. При добавлении сообщения или создания новой темы в форуме поле очищается
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    В поле массивы хранить не стоит, если они используются в логике запросов. Храни в таблице.
     
  9. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Теперь при нажатии на цифру с количеством SQL запросов ( SQL Queries: Цифра - внизу страницы) открывается такое окно со статистикой запросов:
    [​IMG]

    Добавлено спустя 6 минут 26 секунд:
    На exbb.pw почему-то неверно считается время выполнения SQL запроса
    вот так
    Код (Text):
    1. $start = microtime(true);
    2. $res = mysqli_query(self::$conn, $query);
    3. $end = microtime(true);
    4. $time = $end - $start;
    выходят такие результаты:
    Код (Text):
    1.  
    2. [2] => Array
    3.         (
    4.             [query] => SELECT option_value FROM exbb_options WHERE option_name='forum_title'
    5.             [time] => 7.1048736572266E-5
    6.             [t] => 1401891227.5286 - 1401891227.5285
    7.         )
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А что не верно-то? Почитай про микротайм :)
     
  11. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Почему не 0.0001 получается, а 7.1048736572266E-5
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    printf('Затрачено %.5f сек.', ($time));
     
  13. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Спасибо) Помогло!
    Код (Text):
    1.  
    2.     [1] => Array
    3.         (
    4.             [query] => SELECT option_value FROM exbb_options WHERE option_name='url'
    5.             [time] => 0.00007 сек.
    6.             [t] => 1401900019.235 - 1401900019.235
    7.         )
    8.  
    9.     [2] => Array
    10.         (
    11.             [query] => SELECT option_value FROM exbb_options WHERE option_name='forum_title'
    12.             [time] => 0.00008 сек.
    13.             [t] => 1401900019.2357 - 1401900019.2356
    14.         )
    15.  
    16.     [3] => Array
    17.         (
    18.             [query] => SELECT option_value FROM exbb_options WHERE option_name='default_template'
    19.             [time] => 0.00006 сек.
    20.             [t] => 1401900019.2358 - 1401900019.2357
    21.         )
    22.  
    23.     [4] => Array
    24.         (
    25.             [query] => SELECT * FROM exbb_users WHERE id=0
    26.             [time] => 0.00008 сек.
    27.             [t] => 1401900019.2367 - 1401900019.2366
    28.         )
    29.  
    30.     [5] => Array
    31.         (
    32.             [query] => SELECT * FROM exbb_groups WHERE id=1
    33.             [time] => 0.00007 сек.
    34.             [t] => 1401900019.2373 - 1401900019.2372
    35.         )
    только время какое-то слишком маленькое получается. На самом деле запросы так быстро выполняются?
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну а ты думал. Коннект к базе открывается "дорого", а запросы, тем более такие как у тебя, считай бесплатны.
     
  15. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Сделал нормальный профиль пользователя, исправил несколько багов, сделал модуль "Объявления на форуме"
     
  16. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Сделал новый Bootstrap шаблон админки, который теперь будет использоваться по-умолчанию. Возможна смена цветовых тем оформления.
    Скрины здесь: http://exbb.pw/index.php?a=announcements/index&
     
  17. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
  18. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    За прошедшее время сделал в своём движке много всего нового!

    http://exbb.pw/topics/10-page1.html
    А сегодня выложил новую версию, там огромное количество изменений! :)
     
  19. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Выложил новую версию движка и 2 плагина к ней: новый редактор BB кодов и мульти-загрузку файлов
    оба устанавливаются без правки кода