Hi Christian,
Ich verwende PEAR::DB - da habe ich einfach die Klasse "manipuliert", dass sie bei jeder Anfrage ein "A" ausspuckt und die Anzahl der "A" habe ich dann per Hand gezählt. :-)
Wenn es Dir auf Performance ankommt - IMHO kann PEAR::DB ne ganz schöne Bremse darstellen.
Ich habe für das Projekt insgesamt ein Rechtesystem entworfen, das im Prinzip Zugriffskontrolllisten (ACL) umsetzt. Man kann da ziemlich genau festlegen, was jeder tun und lassen darf. Ich habe eine Funktion has_right. Diese Funktion hatte bei jedem Aufruf eine DB-Anfrage produziert.
Mal eine andere Frage. Ich bin auch gerade dabei für ein Projekt global Rechte zu vergeben, und entsprechend für Funktionalitäten... zu prüfen. Ich will wirklich nichts großes, ich muss nicht jede Kleinigkeit festlegen können, ich habe nur 4 Verschiedene Benutzer-Level, die sich wie folgt unterscheiden:
a) Web-Frontend hat andere/weniger Funktionen(andere Navigation...)
b) Bestimmte PHP-Funktionen können nur ausgeführt werden wenn der Benutzer in einem bestimmten der 4 Benutzer-Level ist.
Dazu habe ich noch verschiedene Benutzergruppen - die etwa den Abteilungen innerhalb eines Unternehmens entsprechen, darin gibt es zwar auch Benutzer mit verschiedenem Benutzer-Level, aber alle Benutzer dieser Gruppe haben für sich eigene Daten, also eigene Kundendaten, eigene Projekte... die nur Benutzer dieser Gruppe sehen und von denen wiederum nur Benutzer in dem entsprechenden Level bearbeiten können.
Aber ich weiß nicht so recht wie ich das jetzt einfach und gut implementiere. Ich habe 3 Benutzer-Level:
Level 1: Admin -> kann Benutzer anlegen, kann auf alle Daten schreibend zugreifen...
Level 2: 0815-Benutzer -> kann nur noch auf bestimmte Daten innerhalb seiner Abteilung schreibend zugreifen
Level 3: Gast -> kann nur seine eigenen Einstellungen für die Software verändern und sonst nur lesend auf Daten innerhalb seiner Abteilung zugreifen.
So, das ist es im Prinzip was ich abbilden will. Der "gast" soll jetzt z.B. in der Oberfläche gar keinen Menüpunkt wie "neuer Kunde" mehr bekommen, und beim Anlegen eines neuen Kunden soll trotzdem zur Sicherheit noch die Rechte geprüft werden.
Naja, bisher code ich das ganze eigentlich fest mit ein, ich habe halt eine Tabelle user, in der ich das Benutzerlevel zu einem "user" speichere, und eine Tabelle "groups", in der ich die Zuordnung der User zu den Benutzergruppen speichere. Bei einem Datensatz in der Tabelle "kunde" speichere ich dann die Benutzergruppe desjenigen der ihn angelegt habe, so kann ich bei Zugriff auf diesen Kunden prüfen ob der user in der richtigen Gruppe ist. Bis dahin war es nicht schwer. Schwerer ist das mit den Leveln. Die code ich wie gesagt immer direkt mit ein, also ich schreibe z.B. vor ein UPDATE der Kundentabelle: if($userlevel = 1 || serlevel = 2)...
Halt solche Sachen, aber da bin ich nicht wirklich glücklich mit. Auf der anderen Seite finde ich es übertrieben für jede noch so kleine Aktion Rechte festzulegen und zu prüfen, das wäre IMHO ein ganz schöner overhead, oder?
Die andere genau so blöde Sache ist die Oberfläche. An allen möglichen Stellen sowas wie:
if($userlevel = 1 || serlevel = 2) {
echo "<a href="neuer_kunde.php">neuer Kunde</a>";
}
das ist nicht wirklich schön. Hat jemand vielleicht einen Tipp wie ich zum einen Die Rechteprüfung bei Aktionen vernünftig automatisieren kann, und vielleicht auch wie ich mir die Oberfläche entsprechend den Rechten zusammenbasteln kann? Ich brauche wohl eine Tabelle in die ich alle Aktionen schreiben die beschränkt werden sollen, und da schreibe ich dann die Level rein, also sowas:
aktion | level 1 | level 2 | level 3
------------+---------+---------+--------
neuer_kunde | yes | yes | no
del_kunde | yes | no | no
(ich weiß nicht schön, aber zweckmäßig, oder? So genaue Rechte wie in einem Unix-Filesystem oder sowas brauche ich nicht wirklich)
und dann frage ich halt "select $userlevel from table where aktion = del_kunde", und reagiere entsprechend.
Aber was mache ich mit der Oberfläche? Vielleicht eine extra-Tabelle dafür?
Naja, bin für jeden Tipp dankbar!
Viele Grüße
Andreas
PS: Sorry für diesen vielleicht etwas rabiaten Threrad-Drift ;-)