Intereting Posts
Введите ключ для отправки формы Ajax Как ? Формирование сообщения в нескольких местах PHP: move_uploaded_file () не удалось открыть поток: нет такого файла или каталога Установите SQLite в качестве базы данных для модульного тестирования в Laravel 5.1 Получить конечное значение многомерного массива Выделение слов в Javascript – Почему они не будут выделены после полной загрузки страницы? PHP. Внешний класс / библиотека доступен из apache, но не из phpunit Разрешены ли зарезервированные ключевые слова PHP в пространстве имен? (открытый, закрытый, дефолт) Проверьте, является ли возвращенный файл XML или нет. Как отображать обычную цену и цену продажи на страницах одного продукта и цикла? в php, почему empty ("0") возвращает true? Работает среда Symfony2, среда prod дает ошибку 404 Выбирать реализацию пользовательского платежного шлюза Переадресация Slim Framework с параметрами PHP: цикл через многомерный массив

Бит-манипуляция и восстановление MySQL в PHP

Я пытаюсь немного оптимизировать таблицу mysql, чтобы иметь немного более управляемую таблицу. Я хотел бы сохранить права пользователя в поле бит.

Например, разрешения пользователей могут быть 0110 (у меня есть все больше разрешений пользователей, поэтому длина этого может быть немного длиннее)

Пример может соответствовать следующему:

0: Пользователь не может размещать новости на веб-сайте 1: Пользователь может публиковать новые статьи на веб-сайте 1: Пользователь может редактировать любую статью на веб-сайте 0: Пользователь не может удалять статьи с веб-сайта и т. Д. (Для других разрешений)

Если у меня это есть, то в поле бит mysql. Как я могу манипулировать этим в PHP?

Например, в PHP есть простой способ получить 3-й бит и посмотреть, является ли это 0 или 1?

Есть ли простой способ установить третий бит как 0 или 1?

Вы можете использовать побитовые операторы .

Например :

$bits = bindec('0110'); var_dump($bits & bindec('0100')); 

Вы получите «4» (т. Е. Ненулевое значение, которое вы можете считать «нормально») , поскольку установлен третий бит в $bits .

А также :

 $bits = bindec('0010'); var_dump($bits & bindec('0100')); 

Вы получите 0 – поскольку третий бит в $bits не установлен.

Конечно, не нужно каждый раз называть bindec – я просто использовал его здесь, чтобы упростить чтение; мой первый пример можно переписать как нечто подобное:

 $bits = bindec('0110'); var_dump($bits & 1<<2); 

И чтобы сделать код более понятным, не используйте такие магические значения, но используйте некоторые константы; например :

 define('PERMISSION_TO_DO_X', 1); define('PERMISSION_TO_DO_Y', 1<<1); define('PERMISSION_TO_DO_Z', 1<<2); 

И использовать их:

 $bits = bindec('0110'); if ($bits & PERMISSION_TO_DO_X) { echo "OK to do X<br />"; } if ($bits & PERMISSION_TO_DO_Y) { echo "OK to do Y<br />"; } if ($bits & PERMISSION_TO_DO_Z) { echo "OK to do Z<br />"; } 

Который здесь дает вам такую ​​продукцию:

 OK to do Y OK to do Z 

Потому как :

  • самый правый бит равен 0 (разрешение X не предоставлено)
  • второй бит (начиная с правой) равен 1: разрешено разрешение Y
  • третий бит (по-прежнему и всегда начинающийся справа) равен 1: разрешение Z предоставлено

Вы считали, что сохраняете свои разрешения как целое число, с каждым разрешением двоичное значение (т. Е. 1,2,4,8,16), и вы объединяете все их разрешения. Затем вы можете проверить, получили ли они данное разрешение с помощью оператора &

Вот так:

 if ($accessLevel & $userPermissions) 

Это дает вам гораздо более удобную систему, чем сохранение двоичного числа


По просьбе в комментариях, немного больше информации.

Вы должны настроить таблицу своих пользователей, чтобы иметь целые поля для хранения ваших разрешений. Каждый из уровней разрешений будет иметь двоичный множественный (не знаю здесь правильный термин), который соответствует значению бинарного бита. Например:

 Read - 1 Edit - 2 Create - 4 Delete - 8 

И так далее, сколько угодно. Чтобы создать уровень разрешений пользователей, вы ИЛИ значения вместе. Предположим, что вышеуказанные уровни хранятся в классе как статические значения, вы должны создать его так:

 $newUser->Permissions = Permissions::Read | Permissions::Create; 

Это дает пользователю, который может читать и создавать, но не редактировать или удалять.

Чтобы проверить, имеет ли пользователь разрешение на выполнение действия, вы используете AND:

 if ($newUser->Permissions & Permissions::Read) { echo 'You can do this!'; } else { echo 'You can't this!'; } 

Это дает вам одно простое поле базы данных, такое же расширяемое, как вам реально нужно, и простые в использовании проверки и изменения. Вы также можете захотеть сохранить уровни разрешений в другой таблице и т. Д., В зависимости от того, какой уровень настройки вам может понадобиться.