rechtesystem; bitweise; nicht dringend ;)

ohio

Erfahrenes Mitglied
guden,

ein problem über das ich nicht allzu viel hier finden konnte, es dreht sich um ein rechtesystem.

ich zähle die zahlen auf, bla blub, alles geschehen wie nach anleitung, jedoch schmeißt er mir wilde ergebnisse raus. am besten hier mal die schneipsel:

zunächst mal ein auszug aus der tabelle das rechtesystem mit seinen bitzahlen..

<b>id - bit - action</b>

1 - 1 - thema_add
2 - 2 - thema_change
3 - 4 - thema_del
4 - 8 - rubrik_add
5 - 16 - rubrik_change
6 - 32 - rubrik_del

der user hat meinet wegen die rechte 1(id) und 4(id), macht zusammengerechnet ne <b>9</b> als bitoperator, oder wie auch immer ;)

das script schaut demnach so aus:

PHP:
function out_recht($recht_id , $user_rechte) {

    $res_rechte = mysql_query("SELECT * FROM braukmann_help_admin_rechte WHERE recht_id = '$recht_id'");
    $recht_bit = mysql_result($res_rechte, 0, "recht_bit");
    $recht_name = mysql_result($res_rechte, 0, "recht_name");
    $link = mysql_result($res_rechte, 0, "link");

    if ($user_rechte & $recht_bit) {
       $out = "<a href='index.php?page=" . $link . "' onfocus='if(this.blur)this.blur()'>" . $recht_name . "</a>";
    } else {
       $out = $recht_name;
    }

    echo "<li>";
    echo "<p>".$out;
    echo "</li>";

}

nun denn, das ergib ist nicht nachzuvollziehen, mal stimmts mal nicht, mal sind zuviele, mal zu wenig die übereinstimmen..

wer hat rat? :)
 
Naja das wird daran liegen, das du die Bits falsch angegeben hast, das sind ganz normale Integer Werte und keine Bits!
 
Also wenn du Bits per & miteinander vergleichst und das ganze in einer if Abfrage abhandelst (wo man ja true oder false als Ergebnis braucht), darf bei einem der Variablen nur ein Bit gesetzt sein. Wenn du in beiden Variablen mehrere Bits gesetzt hast, bekommst du mit & die Schnittmenge beider Bit Paletten (also die Bits die in beiden Variablen enthalten sind).

Wenn in beiden Paletten ein Bit übereinstimmt, dann bekommst du einen bestimmten Integer Wert zurück. Ist ein Wert gesetzt, interpretiert das PHP als true. Wenn keine Bits übereinstimmen, dann kommt 0 bei raus und das ist in PHP false.

Du kannst zum Beispiel alle Bits in Konstanten speichern:

define("THEMA_ADD" , 1 << 0);

Dann kannst du mit

if($user_rechte & THEMA_ADD) {

}

das ganze abfragen.

mowl: Naja das wird daran liegen, das du die Bits falsch angegeben hast, das sind ganz normale Integer Werte und keine Bits!

Naja, intern rechnet PHP bei Bit Operatoren mit Integer Werten. Du kannst also so was wie if($rechte & 2) { } machen. Das klappt.
Was ist schon ein Bit? Eine Potenz von 2. 2^0 = 1, 2^1 = 2, 2^2 = 4, 2^3 = 8 usw.

wenn also das Nullte und das Dritte Bit gesetzt sind kommt 1 + 8 = 9 raus und so rechnet auch PHP. Wenn du 1 << 3 machst kommt also als Ergebnis 8 bei raus.

Ich hoffe, ich konnte bei dem Thema helfen

Ciao, Jörg
 
Zurück