Вопрос по php – Установить разрешения в двоичном

4

Я видел в школе систему, которая устанавливает разрешения с использованием двоичной строки.

Скажем 101001 = 41

Так :

1 can be permission to page 1 2 can be permission to page 2 4 can be permission to page 3 8 can be permission to page 4 16 can be permission to page 5 32 can be permission to page 6

Итак, скажем, я получил вышеуказанную двоичную строку (101001). У меня есть доступ к страницам 1, 4 и 6.

Как я могу сделать это в PHP? Допустим, я получил поле в MySQL с именемperms хранится в декабре, поэтому 101001 будет 41.How can I know that 41 is equal to 1, 8 and 32 in PHP ?

Благодарю.

Ваш Ответ

5   ответов
3

& operator и проверить против этих флагов.

$READ = 8;
$WRITE = 1;
$EXECUTE = 32;
$permissions = 41;
if ($permissions & $READ) {
   // do smth
}
if ($permissions & $WRITE ) {
   // do smth
}
if ($permissions & $EXECUTE ) {
   // do smth
}

Позвольте мне объяснить это. Если у вас есть биты 1001 (9). Вы просто проверяете бит (1000) на 1001. Вы просто умножаете КАЖДЫЙ бит переменной $ permissions и номера бита. Результат будет 1000. Он может быть преобразован вtrue значение. Итак, у вас есть флаг здесь. Если проверить третий бит (0100), это приведет к 0000, и этоfalse значение. Таким образом, у вас нет разрешений здесь.

Error: User Rate Limit Exceeded David Bélanger
0

на комбинация единиц и нулей.

Функция из комментариев PHP дляdecbin:

function bindecValues($decimal, $reverse=false, $inverse=false) {
/*
1. This function takes a decimal, converts it to binary and returns the
     decimal values of each individual binary value (a 1) in the binary string.
     You can use larger decimal values if you pass them to the function as a string!
2. The second optional parameter reverses the output.
3. The third optional parameter inverses the binary string, eg 101 becomes 010.
-- darkshad3 at yahoo dot com
*/

    $bin = decbin($decimal);
    if ($inverse) {
        $bin = str_replace("0", "x", $bin);
        $bin = str_replace("1", "0", $bin);
        $bin = str_replace("x", "1", $bin);
    }
    $total = strlen($bin);

    $stock = array();

    for ($i = 0; $i < $total; $i++) {
        if ($bin{$i} != 0) {
            $bin_2 = str_pad($bin{$i}, $total - $i, 0);
            array_push($stock, bindec($bin_2));
        }
    }

    $reverse ? rsort($stock):sort($stock);
    return implode(", ", $stock);
}

использование

$binary_array = bindecValues(41);

Это сделало быbinary_array:

array(1, 8, 32);
0

десятичный вы можете преобразовать его обратно & amp; вперед сdecbin а такжеbindec, Это просто другая база для подсчета ...

EDIT: поразительно сладко, сделай это ^ _ ^

10

вы говорите о битах и побитовых операторах. Самый простой способ установить это - определить константы для каждого разрешения.

const POST   = 1;
const DELETE = 2;
const UPDATE = 4;
const READ   = 8;

После того, как вы определили это, легко сделать сравнения с помощью побитовых операторов:

$userValue = '1101';

if ($userValue & self::POST) {
  echo 'Can Post';
}

if ($userValue & self::DELETE) {
  echo 'Can Delete';
}

if ($userValue & self::UPDATE) {
  echo 'Can Update';
}

if ($userValue & self::READ) {
  echo 'Can Read';
}

Это то, сколько собственных констант PHP работает. Если вы когда-либо устанавливали сообщение об ошибке, используя что-то вродеE_ALL & E_DEPRECATED Вы на самом деле работаете с двоичными числами.

Error: User Rate Limit Exceeded David Bélanger
2

http://www.litfuel.net/tutorials/bitwise.htm

<?php
$read = 1;
$write = 2;
$readwrite = 16;
$local_admin = 32;
$global_admin = 64;

$jim = 96;
$mike = 16;

echo "Is Mike Allowed to edit? he has an access level of 16<BR>";
if ($mike & 32) {
    echo 'YES MIKE CAN EDIT';
} else {
    echo 'NO HE CANNOT';
}

echo "<BR><BR>Is Jim Allowed to edit? he has an access level of 96<BR>";
if ($jim & 32) {
    echo 'YES JIM CAN EDIT';
} else {
    echo 'NO HE CANNOT';
}
?>

Похожие вопросы