Ik heb een rechtensysteem die bitwise de rechten toekent dus 1,2,4,8 enz.
Ik heb rechten die bij elkaar opgeteld max. 63 zijn (dus tm 32)
Op een pagina waar je de gebruiker kan wijzigen (en dus ook rechten) laat ik een aantal checkboxen zien die de rechten aangeven.
De huidige rechten moeten daarbij aangevinkt zijn natuurlijk.
Dit doet hij alleen op 1 of andere manier niet voor bit 1 en bit 8.
Iemand enig idee waarom niet?
Dit is de code:

$result['urID'] = de rechten die de gebruiker heeft (63 in dit geval, dus alle checkboxjes moeten aan)

<?
while($row = mysql_fetch_assoc($result1))
{
if(($result['urID'] & $row['urID']))
{
$check = ' checked = "checked"';
}
else
{
$check = '';
}
}

echo '<tr><td>' . $row['urName'] . '</td><td><input type = "checkbox" name = "rights[]" id = "rights[]" value = "' . $row['urID'] . '"' . $check . ' /></td></tr>';
}

?>

Hierbij krijg ik 6 checkboxjes (ik heb dus 6 rechten) waarbij ze bij recht 63 allemaal aangevinkt zijn behalve 1 en 8
64 is 2 tot de macht 6, zou dat toevallig zijn?
Jan Koehoorn schreef op 25.02.2006 21:17
64 is 2 tot de macht 6, zou dat toevallig zijn?


Uhm.. dus?
Hmm, nog geen geniale inval hoor, ik vond het alleen toevallig.

Welke waardes kan $row['urID'] hebben? Wat zie je als je die waarde echoot in je while loop?
Jan Koehoorn schreef op 25.02.2006 21:27
Hmm, nog geen geniale inval hoor, ik vond het alleen toevallig.

Welke waardes kan $row['urID'] hebben? Wat zie je als je die waarde echoot in je while loop?


Ok ik dacht al moet ik hier de oplossing uithalen? :P
$row['urID'] = De rechten uit de rechten tabel dus 1,2,4,8,16,32

Als ik de bitwise functie echo krijg ik een rijtje:
echo ($result['urID'] & $row['urID']);
0
2
4
0
02
22
Ja, maar zijn in beide gevallen dus maar zes waarden en daar kun je geen acht checkboxen mee vullen.
Let op dat de bitwise-operators "echte" integers verwachten, ik heb al rare dingen meegemaakt doordat variabelen als variants / strings werden gezien.

Zelf controleer ik altijd op de volgende wijze:

<?php
if( $iBaseRights & $iModule === $iModule )
{
// Er zijn rechten
}
?>
Remco van Arkelen schreef op 25.02.2006 22:06
Let op dat de bitwise-operators "echte" integers verwachten, ik heb al rare dingen meegemaakt doordat variabelen als variants / strings werden gezien.

Zelf controleer ik altijd op de volgende wijze:

<?php
if( $iBaseRights & $iModule === $iModule )
{
// Er zijn rechten
}
?>


Daar heb je een punt! Is even proberen..
En ik heb ook geen 8 checkboxjes?
Misschien dat PHP die variabelen wel parsed als octale getallen, gezien het feit dat het bij 1 en 8 misgaat.
Ik zou de rechtentabel uitbreiden met 64 en 128. Net even gekeken en dit:

<?php
echo 255 & 1;
echo '<br />';
echo 255 & 2;
echo '<br />';
echo 255 & 4;
echo '<br />';
echo 255 & 8;
echo '<br />';
echo 255 & 16;
echo '<br />';
echo 255 & 32;
echo '<br />';
echo 255 & 64;
echo '<br />';
echo 255 & 128;
?>

Levert dit op:

1
2
4
8
16
32
64
128

Stel dat iemand als recht nu 129 heeft, dan krijg je dit:

<?php
echo 129 & 1;
echo '<br />';
echo 129 & 2;
echo '<br />';
echo 129 & 4;
echo '<br />';
echo 129 & 8;
echo '<br />';
echo 129 & 16;
echo '<br />';
echo 129 & 32;
echo '<br />';
echo 129 & 64;
echo '<br />';
echo 129 & 128;
?>

en dat levert op:

1
0
0
0
0
0
0
128

Wat klopt want 129 = 128 + 1.
Remco van Arkelen schreef op 25.02.2006 22:09
Misschien dat PHP die variabelen wel parsed als octale getallen, gezien het feit dat het bij 1 en 8 misgaat.


En wat doe ik daaraan om zeker te weten dat het niet zo is..?

Reageren