Здравствуйте. Пишу функцию проверки доступа пользователя к админке. В БД такие таблицы: PHP: CREATE TABLE `users` ( `id` int(11) NOT NULL, `username` varchar(255) CHARACTER SET utf8mb4 NOT NULL, `passHash` varchar(255) CHARACTER SET utf8mb4 NOT NULL, `email` varchar(255) CHARACTER SET utf8mb4 NOT NULL, `emailCheck` tinyint(1) CHARACTER SET utf8mb4 NOT NULL, `regDate` int(25) NOT NULL, `regIP` varchar(25) CHARACTER SET utf8mb4 NOT NULL, `lastDate` int(25) NOT NULL, `lastIP` varchar(25) CHARACTER SET utf8mb4 NOT NULL, `groupID` int(11) NOT NULL DEFAULT '5' ) ENGINE=MyISAM DEFAULT CHARSET=utf8; и PHP: CREATE TABLE `groups` ( `id` int(2) NOT NULL, `title` varchar(255) NOT NULL, `tBefore` varchar(255) NOT NULL, `Tafter` varchar(255) NOT NULL, `permissions` varchar(255) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; В таблице пользователей хранится идентификатор группы для каждого пользователя, а в таблице групп у каждой группы есть определённые разрешения, которые хранятся в виде сериализованного массива типа: array ('adminAccess' => '1', 'editNews' => '0'...) В своих наработках ф-ции я получаю список идентификаторов групп, у которых в десериализованном массиве разрешений индекс "admin" равен 1, далее нужно сделать выборку всех пользователей, id группы которых (groupID в таблице `users`) равен одному из тех, которые в полученных мной. Вот наработки: PHP: function adminAccess ($type = false, $var = false) { global $db; $q = $db->query ("SELECT * FROM `groups`"); $groups = []; while ($item = $q->fetch_assoc ()) { if ($item['permissions'][admin] === 1) { array_push($groups, $item['id']); } } switch ($type) { case 'list': case 'id': case 'username': case 'ip': } } Как правильнее, с точки зрения быстродействия реализовать такое чудо? Или, может, подскажете как можно по другому получать разрешения?!
В общем, решил так: PHP: /*---------------------------Доступ к админпанели-----------------------------*/ function adminAccess ($type = false, $var = false) { global $db; $q = $db->query ("SELECT * FROM `groups`"); $groupsID = []; while ($item = $q->fetch_assoc ()) { $perms = unserialize($item['permissions']); if ($perms['adminAccess'] === 1) { array_push($groupsID, $item['id']); } } if ($type === false) { $type = 'id'; } switch ($type) { case 'list': $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."')"); if ($q) { if ($q->num_rows) { return $q; } else { return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.'; } } else { return false; } case 'id': if ($var === false) { if (isset ($_SESSION['id'])) { $var = $_SESSION['id']; } else { return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.'; } } $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."') AND `id` = '$var' LIMIT 1"); if ($q) { if ($q->num_rows) { return true; } else { return false; } } else { return 'dbError'; } case 'username': if ($var === false) { if (isset ($_SESSION['id'])) { $var = user ('username'); } else { return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.'; } } $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."') AND `username` = '$var' LIMIT 1"); if ($q) { if ($q->num_rows) { return true; } else { return false; } } else { return 'dbError'; } case 'ip': if ($var === false) { if (isset ($_SESSION['id'])) { $var = user ('regIP'); } else { return 'Ошибка в adminAccess()! Пользователь не авторизован. Необходимо ввести второй параметр.'; } } $q = $db->query ("SELECT * FROM `users` WHERE `groupID` IN ('".implode (',', $groupsID)."') AND `regIP` = '$var' LIMIT 1"); if ($q) { if ($q->num_rows) { return true; } else { return false; } } else { return 'dbError'; } } }
может поможет: PHP: public static $OPT = [ 'Организации и сообщества', 'Путешествия и события', 'Новости и политика', 'Фильмы и анимация', 'Наука и техника', 'Автотранспорт', 'Блоги и люди', 'Развлечения', 'Образование', 'Животные', 'Игровой', 'Бизнес', 'Музыка', 'Обзоры', 'Обжоры', 'Спорт', 'Стиль', 'Юмор', 'Прочие' ]; array_values ( array_intersect_key ( Core::$OPT, array_filter ( 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 ) ) ) ); --- Добавлено --- + $item['permissions'][admin] без кавычек так не пойдет
моя работа в переделке пхп косяков пред прогеров, но за оптимизацию БД мне никто не собирается платить. Я не троллю(с)
Яш просил в процедурном) Да и сделал уже то что нужно. Мне потом удобнее будет работать с разными функциями, каждая из которых отвечает за свой пермишен.
@SamyRed, switch внутри которого if-ы, внутри которых ещё if-ы - это трындец, что при объектно-ориентированной парадигме, что при процедурной. Разбей его на более мелкие функции.