Я пытаюсь немного оптимизировать таблицу 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
Потому как :
Вы считали, что сохраняете свои разрешения как целое число, с каждым разрешением двоичное значение (т. Е. 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!'; }
Это дает вам одно простое поле базы данных, такое же расширяемое, как вам реально нужно, и простые в использовании проверки и изменения. Вы также можете захотеть сохранить уровни разрешений в другой таблице и т. Д., В зависимости от того, какой уровень настройки вам может понадобиться.