Sergey |
|
---|---|
Давайте рассмотрим мой вариант нашей функции sed_auth_getvalue из модуля functions.admin.php
function mobil_auth_getvalue($mask)
{
$mn['0'] = 0;
$mn['R'] = 1;
$mn['W'] = 2;
$mn['L'] = 2;
$mn['1'] = 4;
$mn['2'] = 8;
$mn['3'] = 16;
$mn['4'] = 32;
$mn['5'] = 64;
$mn['A'] = 128;
$masks = str_split($mask);
foreach($mn as $k => $v)
{
if (in_array($k, $masks)) { $res += $mn[$k]; }
}
return($res);
} Теперь давайте выстроим массив $mn так: бит 1 $mn['R'] = 1; бит 2 $mn['W'] = 2; бит 3 $mn['1'] = 4; бит 4 $mn['2'] = 8; бит 5 $mn['3'] = 16; бит 6 $mn['4'] = 32; бит 7 $mn['5'] = 64; бит 8 $mn['A'] = 128; Для того, чтобы получить значение бита из сгруппированного кода прав (записываемого в поле таблице для строки) необходимо проделать следующую операцию: $бит = (($код_прав & $маска_бита(ов)) == $маска_бита(ов)); $бит будет иметь, в такой операции два состояния: FALSE или TRUE. Следовательно если маска_бита (например) равна 2, то мы сразу выясним. может ли в данную строку что-либо записано т.е. если W в е правах. Однако можно проверить и сумму прав, достаточно сложить нужные биты. Например RA (имеем право читать и администрировать) этот код будет = 1+128=129. В MySQL имеется и соответственная функция (6.3.6.1 Битовые функции) функция побитового сложения т.е. & которая, как раз и предназначена для этих целей: выборке строк соответствующих функции побитового сложения, в нашем случае поиску строк с определенными правами. Эта функция выполняется на самом низком операционном уровне процессора, практически мгновенно. В 3 шага микропроцессора. Придумывать другой механизм, это значит увеличивать количество машинных кодов в сотни (тысячи раз) вместо 3. (я так гипотически, может и 2 шага, все в особенностях куда маска на какой регистр улетела, но это уже не нашего ума дела) www.cotonti.mobi
|