За последние 24 часа нас посетили 24586 программистов и 1650 роботов. Сейчас ищут 902 программиста ...

Что-то типа in_array в SQL

Тема в разделе "PHP для новичков", создана пользователем SamyRed, 17 фев 2017.

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Здравствуйте. Пишу функцию проверки доступа пользователя к админке. В БД такие таблицы:
    PHP:
    1. CREATE TABLE `users` (
    2.   `id` int(11) NOT NULL,
    3.   `username` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
    4.   `passHash` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
    5.   `email` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
    6.   `emailCheck` tinyint(1) CHARACTER SET utf8mb4 NOT NULL,
    7.   `regDate` int(25) NOT NULL,
    8.   `regIP` varchar(25) CHARACTER SET utf8mb4 NOT NULL,
    9.   `lastDate` int(25) NOT NULL,
    10.   `lastIP` varchar(25) CHARACTER SET utf8mb4 NOT NULL,
    11.   `groupID` int(11) NOT NULL DEFAULT '5'
    12. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    и
    PHP:
    1. CREATE TABLE `groups` (
    2.   `id` int(2) NOT NULL,
    3.   `title` varchar(255) NOT NULL,
    4.   `tBefore` varchar(255) NOT NULL,
    5.   `Tafter` varchar(255) NOT NULL,
    6.   `permissions` varchar(255) NOT NULL
    7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
    В таблице пользователей хранится идентификатор группы для каждого пользователя, а в таблице групп у каждой группы есть определённые разрешения, которые хранятся в виде сериализованного массива типа: array ('adminAccess' => '1', 'editNews' => '0'...)

    В своих наработках ф-ции я получаю список идентификаторов групп, у которых в десериализованном массиве разрешений индекс "admin" равен 1, далее нужно сделать выборку всех пользователей, id группы которых (groupID в таблице `users`) равен одному из тех, которые в полученных мной. Вот наработки:
    PHP:
    1. function adminAccess ($type = false, $var = false) {
    2.     global $db;
    3.     $q = $db->query ("SELECT * FROM `groups`");
    4.     $groups = [];
    5.     while ($item = $q->fetch_assoc ()) {
    6.         if ($item['permissions'][admin] === 1) {
    7.             array_push($groups, $item['id']);
    8.         }
    9.     }
    10.     switch ($type) {
    11.         case 'list':
    12.            
    13.         case 'id':
    14.            
    15.         case 'username':
    16.            
    17.         case 'ip':
    18.            
    19.     }
    20. }
    Как правильнее, с точки зрения быстродействия реализовать такое чудо? Или, может, подскажете как можно по другому получать разрешения?!
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Да, только мне бы, пожалуйста, в процедурном стиле.
     
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    В общем, решил так:
    PHP:
    1. /*---------------------------Доступ к админпанели-----------------------------*/
    2. function adminAccess ($type = false, $var = false) {
    3.     global $db;
    4.     $q = $db->query ("SELECT * FROM `groups`");
    5.     $groupsID = [];
    6.     while ($item = $q->fetch_assoc ()) {
    7.         $perms = unserialize($item['permissions']);
    8.         if ($perms['adminAccess'] === 1) {
    9.             array_push($groupsID, $item['id']);
    10.         }
    11.     }
    12.     if ($type === false) {
    13.         $type = 'id';
    14.     }
    15.     switch ($type) {
    16.         case 'list':
    17.             $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."')");
    18.             if ($q) {
    19.                 if ($q->num_rows) {
    20.                     return $q;
    21.                 } else {
    22.                     return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.';
    23.                 }
    24.             } else {
    25.                 return false;
    26.             }
    27.         case 'id':
    28.             if ($var === false) {
    29.                 if (isset ($_SESSION['id'])) {
    30.                     $var = $_SESSION['id'];
    31.                 } else {
    32.                     return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.';
    33.                 }
    34.             }
    35.             $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."') AND `id` = '$var' LIMIT 1");
    36.             if ($q) {
    37.                 if ($q->num_rows) {
    38.                     return true;
    39.                 } else {
    40.                     return false;
    41.                 }
    42.             } else {
    43.                 return 'dbError';
    44.             }
    45.         case 'username':
    46.             if ($var === false) {
    47.                 if (isset ($_SESSION['id'])) {
    48.                     $var = user ('username');
    49.                 } else {
    50.                     return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.';
    51.                 }
    52.             }
    53.             $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."') AND `username` = '$var' LIMIT 1");
    54.             if ($q) {
    55.                 if ($q->num_rows) {
    56.                     return true;
    57.                 } else {
    58.                     return false;
    59.                 }
    60.             } else {
    61.                 return 'dbError';
    62.             }
    63.         case 'ip':
    64.             if ($var === false) {
    65.                 if (isset ($_SESSION['id'])) {
    66.                     $var = user ('regIP');
    67.                 } else {
    68.                     return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.';
    69.                 }
    70.             }
    71.             $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."') AND `regIP` = '$var' LIMIT 1");
    72.             if ($q) {
    73.                 if ($q->num_rows) {
    74.                     return true;
    75.                 } else {
    76.                     return false;
    77.                 }
    78.             } else {
    79.                 return 'dbError';
    80.             }
    81.     }
    82. }
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    может поможет:
    PHP:
    1. public static $OPT = [
    2.      'Организации и сообщества',
    3.      'Путешествия и события',
    4.      'Новости и политика',
    5.      'Фильмы и анимация',
    6.      'Наука и техника',
    7.      'Автотранспорт',
    8.      'Блоги и люди',
    9.      'Развлечения',
    10.      'Образование',
    11.      'Животные',
    12.      'Игровой',
    13.      'Бизнес',
    14.      'Музыка',
    15.      'Обзоры',
    16.      'Обжоры',
    17.      'Спорт',
    18.      'Стиль',
    19.      'Юмор',
    20.      'Прочие'
    21.    ];
    22.  
    23.      Core::$OPT,
    24.      array_filter (
    25.        SQL::P( "SELECT opt1, opt2, opt3, opt4, opt5, opt6, opt7, opt8, opt9, opt10, opt11, opt12, opt13, opt14, opt15, opt16, opt17, opt18, opt19 FROM opts WHERE id = ?", [ $res['idopts'] ] ) -> fetch( PDO::FETCH_NUM )
    26.      )
    27.    )
    28. );
    [​IMG]
    --- Добавлено ---
    + $item['permissions'][admin]
    без кавычек так не пойдет
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @MouseZver троляка :eek:
    Нет, господа, с такими структурами БД вы далеко не пойдете :cool:
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    моя работа в переделке пхп косяков пред прогеров, но за оптимизацию БД мне никто не собирается платить. Я не троллю(с)
     
  7. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Агонь !
     
  8. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Яш просил в процедурном) Да и сделал уже то что нужно. Мне потом удобнее будет работать с разными функциями, каждая из которых отвечает за свой пермишен.
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    @SamyRed, switch внутри которого if-ы, внутри которых ещё if-ы - это трындец, что при объектно-ориентированной парадигме, что при процедурной. Разбей его на более мелкие функции.
     
  10. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    @mkramer может быть и так. Как нибудь займусь.