Intereting Posts
403 Запрещено, если вход содержит «скрипт», Smarty: как ссылаться на индекс ассоциативного массива Как обрабатывать запросы API с помощью PHP Значения массива сохраняются и исчезают в php? Вырезать flv-видео с помощью php Многопоточный запрос PHP PDO, последовательно отбрасывающий последний набор строк Программно определить, следует ли описывать объект с помощью «a» или «an»? изменить начальный массив внутри цикла foreach? есть ли способ в PHP перезапустить цикл в foreach или изменить тестовое значение в коммутаторе? PHP Передача по исходной ошибке после использования того же var API API Analytics: неверный запрос – invalid_grant Неустранимая ошибка: допустимый размер памяти удалять переменные сеанса, когда идентификатор сеанса известен, но не может запускать сеанс Странная проблема, при которой session_start () заставляет страницы не загружаться php timeout – set_time_limit (0); – не работают

Какой тип данных подходит для хранения этой ситуации?

Например, у меня есть пользователь, и у пользователя есть другое право пользователя, например, пользователь может иметь

-create file -read file -update file -delete file 

4, я могу использовать 4 BOOL, чтобы найти пользователя правильно, но если у пользователя больше прав, мне нужно создать все больше и больше BOOL для сохранения права. Я не думаю, что это хорошая идея. И я думаю о том, чтобы получить длинное целое для этого … например, пользователь может сделать все, что составляет 1111. Создавать файл 1000, читать файл 100, обновление – 10, delete – 1. Итак, если только пользователь get read file right – 0100.

Есть ли лучшие идеи? Спасибо.

Я предлагаю преобразовать привилегии (права) в двоичном состоянии, а затем хранить его в базе данных как длинную целую или шестнадцатеричную строку (VARCHAR; для хранения большого количества прав).

пример

 $privileges_list = array( 0 => 'create_file', 1 => 'read_file', 2 => 'update_file', 3 => 'delete_file', 4 => 'create_pool', 5 => 'vote_in_pool', 6 => 'create_gallery', 7 => 'upload_images', 8 => 'view_statistics' ); 

Поэтому, если вы хотите установить create file , update file и view statistics права view statistics для пользователя, просто поместите 1 в соответствующие позиции в строке (0, 2, 8) и 0 для остальной части

 $binary_string = "100000101"; 

Последним символом в этой строке является позиция 0, сначала позиция 8.

Теперь вы можете преобразовать эту строку в целое число (261) или шестнадцатеричное число (105) и поместить его в базу данных в качестве набора привилегий для этого пользователя (я предпочитаю hex).

Чтобы преобразовать это значение обратно в список привилегий, вы можете использовать что-то вроде этого

 function hexvalue2privileges($hexvalue, $plist) { $res = array(); $res_assoc = array(); for ($i = strlen($hexvalue) - 1; $i >= 0; $i--) { $bin = str_pad(decbin(hexdec(substr($hexvalue, $i, 1))), 4, '0', STR_PAD_LEFT); $bin_array = array_reverse(str_split($bin, 1)); foreach ($bin_array as $bitstate) $res[] = $bitstate == '1' ? true : false; } foreach ($plist as $key => $id) { $res_assoc[$id] = $res[$key]; } return $res_assoc; } 

и вызовите эту функцию

 print_r(hexvalue2privileges('105', $privileges_list)); 

Выход будет

 Array ( [create_file] => 1 // true [read_file] => // false [update_file] => 1 // true [delete_file] => // false [create_pool] => // false [vote_in_pool] => // false [create_gallery] => // false [upload_images] => // false [view_statistics] => 1 // true ) 

С каждым шестнадцатеричным символом вы можете хранить 4 права, поэтому для вычисления количества символов необходимо использовать эту формулу

 $chars_needed = floor((count($privileges_list)-1) / 4) + 1; // result 3 

Чтобы получить общую длину двоичной строки

 $binary_length = $chars_needed * 4; // result 12 

Чтобы установить длину установленных привилегий

 $binary_string = "100000101"; $binary_string = str_pad($binary_string, $binary_length, '0', STR_PAD_LEFT); // result '000100000101' 

Чтобы преобразовать $ binary_string в hex

 $binary_string = "000100000101"; $hexvalue = ""; $groups = str_split($binary_string, 4); foreach ($groups as $group) $hexvalue .= dechex(bindec($group)); // result $hexvalue='105' (1=0001, 0=0000, 5=0101) 

Также вы можете создавать группы привилегий и назначать их пользователям, создавая привилегии для каждой группы (администраторы, модераторы, гости, vip и т. Д.).

Надеюсь это поможет

Используйте [flags CHAR(10) default '0000000000'] Всякий раз, когда вам нужна какая-либо цифра, вы можете использовать ее как

1-я цифра – новая
Вторая цифра – Изменить и т. Д.

Во время хранения вам просто нужно изменить этот бит и сохранить как этот 1100000000. Вот и все.