Problem mit meinem Rechtesystem

fanste

Erfahrenes Mitglied
Hi,

Ich habe für meine Seite ein kleines Rechtesystem entworfen. Nun habe ich aber beim löschen von Rechten ein kleines Probelm:

PHP:
//Momentane Rechte(binär)
$rights = 60;

//Rechte "4" abziehen
$new_rights = $rights^pow(2, 4);

Ist das Recht vorhanden, ist es kein Probelm. Ist es jedoch vorhanden, wird es auf einmal hinzugefügt. Kann man das nich umgehen, ohne, dass ich das ganze erst in die einzelnen Rechte aufteilen muss, um dann zu prüfen, ob es überhaupt vorhanden ist?

Danke schonmal für die kommende Hilfe.

EDIT:
Schön wäre es, wenn es diese Lösung auch direkt für MySQL gibt.
 
Zuletzt bearbeitet:
Man kann ihm Adminpanel beliebig viele Rechte erstellen und diese dann den jeweilgen Benutzer zuteilen. Das gleich bein den einzelnen Bereichen.

Wird nun aber so ein Recht gelöscht, muss es auch bei den Usern bzw. den Bereichen gelöscht werden. Das Problem ist nur, wenn ich es lösche und der User/Bereich hat das Recht gar nicht, dann wird es gesetzt.
 
Probier mal Folgendes:
PHP:
$new_rights = $rights & ~ pow(2, 4);
Aber wenn ein Privileg nicht mehr existiert, ist es doch irrelevant, ob ein Benutzer dieses noch hat.
 
Der Gedanke kam mir auch schon. Andererseits, was soll es dann noch in der DB?^^


Aber ich bin soeben fündig geworden.

http://forum.de.selfhtml.org/archiv/2002/12/t32298/ hat gesagt.:
bitmask = bitmask & ~bit

Es wird also das unaere Komplement erstellt und dann per AND
verknuepft.

Das sähe dann so aus
PHP:
//Momentane Rechte(binär)
$rights = 30;

//Rechte "5" abziehen
$new_rights = $rights&~(pow(2, 5));

Um so mehrere Rechte abzuziehn, dann man diese erst noch mit | verbinden und dann in einem Rutsch komplimentieren.

EDIT:
Da hab ich wohl zu lange zum Tippen gebraucht :-P

Danke Gumbo
 
Zuletzt bearbeitet:
Die Frage ist etwas missverständlich gestellt, aber wenn man sich den Code ansieht, erkennt man das Problem. Du möchtest nicht das Recht aus dem System löschen, sondern nur jemandem das Recht nehmen und dabei wird es bisher wenn es nicht existiert wieder neu gesetzt durch den Operator ^. Hier die Lösung dazu:

$new_rights = $rights & ~(1 << 4)

Das geht auch genauso in MySQL

UPDATE a SET rights = rights & ~(1 << 4)

Zweierpotenzen kannst du mit << wesentlich performanter berechnen, dafür brauchst du kein pow(). Meinst du sowas?

EDIT: Ok, auch zu langsam... Da stand aber eben noch was anderes bei Gumbo ;)
 
Zurück