Tandil: Doppelte Aufrufe von Funktionen vermeiden

Guten Tag,

ich habe vor, den Code auf meiner Seiten mit Klassen auf den neusten Stand zu bringen und somit auch schneller zu machen.

Als Beispiel möchte ich Berechtigungen auf der Homepage verwenden.
So soll überprüft werden, ob ein Nutzer über die nötige Berechtigung verfügt, um einen Newsbeitrag zu schreiben. Diese Berechtigung habe ich vor, anhand von Bits zu speichern.

Bisher habe bin ich immer folgendermaßen vorgegangen:

  
function userHasPermission() {  
   $query = mysql_query("SELECT permission FROM permissions WHERE userid = '".$_SESSION['userid']."' AND permission > 0 LIMIT 1");  
if (mysql_num_rows($query) > 0)  
 return true;  
else return false;  
}  
  
if (userHasPermission()) {  
   // ... Eingabefeld folgt hier  
}

Jetzt kann es allerdings sein, dass dieselbe Abfrage auf der selben Seite öfters durchgeführt werden muss. Nun wäre es dann aber so, dass die Funktion öfters aufgerufen würde und somit die Berechtigung öfters überprüfen würde, obwohl es ja einfacher wäre, die Abfrage einmal durchzuführen und diese dann zu speichern.

Ich hatte das Gefühl, dass dies eventuell mit Klassen realisierbar wäre. Allerdings habe ich damit noch nicht so viel Erfahrung. Kann es sein, dass __construct() dort helfen würde oder gibt es eine andere Möglichkeit, mehrfache Abfragen zu verhindern?
Theoretisch könnte man bei Berechtigungen das ganze eh schon einmal vorher abfragen und in einer Konstante speichern, was dann beim Bitvergleich ja überall klappen würde. Aber generell bei anderen Funktionen, die nicht immer gebraucht würden, wäre dies nicht praktisch.

  1. Hallo,

    du kennst Sessions in PHP?

    Gruß

    jobo

    1. Hi!

      du kennst Sessions in PHP?

      Die nützen nichts, wenn man für jeden Request die Berechtigungen erneut prüfen möchte. Speichert man solche Berechtigungen in einer Session, können während der Session-Laufzeit vorgenommene administrative Änderungen keine Wirkung zeigen - wenn man nicht alle Session-Dateien nach diesem einen Nutzer durchsuchen will.

      Lo!

      1. Hallo,

        Die nützen nichts, wenn man für jeden Request die Berechtigungen erneut prüfen möchte.

        Kapier ich nicht aber du hast sicherlich Recht, denn Du kennst Dich ja gut aus. Ich dachte eben dafür sei die Session da.

        Speichert man solche Berechtigungen in einer Session, können während der Session-Laufzeit vorgenommene administrative Änderungen keine Wirkung zeigen - wenn man nicht alle Session-Dateien nach diesem einen Nutzer durchsuchen will.

        Der Admin verändert die Berechtigungen, während ich eingelogged bin?

        if($_SESSION["group"] == "normalUser") { ...

        dacht ich jetzt zum Beispiel.

        Gruß

        jobo

        1. Hi!

          Die nützen nichts, wenn man für jeden Request die Berechtigungen erneut prüfen möchte.
          Kapier ich nicht aber du hast sicherlich Recht, denn Du kennst Dich ja gut aus. Ich dachte eben dafür sei die Session da.

          Eine Session speichert Werte über mehrere Requests hinweg. Wenn einem User die Berechtigungen geändert werden sollen - was im Falle eines Missbrauchs recht zeitnah passieren sollte - und seine Berechtigungen stehen in einer Session, wirkt sich eine Änderung in der Datenbank nicht aus, weil die Berechtigungen ja aus der Session gelesen werden, solange diese aktiv ist.

          Der Admin verändert die Berechtigungen, während ich eingelogged bin?

          Warum auch nicht, wenn er Grund dazu hat?

          if($_SESSION["group"] == "normalUser") { ...
          dacht ich jetzt zum Beispiel.

          Und?

          Lo!

      2. Hi,

        Speichert man solche Berechtigungen in einer Session, können während der Session-Laufzeit vorgenommene administrative Änderungen keine Wirkung zeigen - wenn man nicht alle Session-Dateien nach diesem einen Nutzer durchsuchen will.

        Man könnte sich aber die Session-ID, mit der der Nutzer aktuell unterwegs ist, auch irgendwo speichern.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hi!

    ich habe vor, den Code auf meiner Seiten mit Klassen auf den neusten Stand zu bringen und somit auch schneller zu machen.

    OOP statt Nicht-OOP macht keinen Code schneller.

    $query = mysql_query("SELECT permission FROM permissions WHERE userid = '".$_SESSION['userid']."' AND permission > 0 LIMIT 1");

    Kontextwechsel beachten!

    Jetzt kann es allerdings sein, dass dieselbe Abfrage auf der selben Seite öfters durchgeführt werden muss. Nun wäre es dann aber so, dass die Funktion öfters aufgerufen würde und somit die Berechtigung öfters überprüfen würde, obwohl es ja einfacher wäre, die Abfrage einmal durchzuführen und diese dann zu speichern.

    Dann solltest du das Ergebnis zwischenspeichern:
    Wenn für die gewünschte Berechtigung kein Eintrag im Array der Berechtigungen enthalten ist, frag sie aus dem DBMS ab und trag das Ergebnis in das Element ein. Gib den Elementinhalt zurück, sollte ja nun true oder false sein. Weitere Fragen überspringen die DBMS-Abfrage. Du solltest das gleich mit allen Berechtigungen am Stück machen, weil es unter anderem solche DBMS-Abfragen sind, die signifikant Zeit verbrauchen.

    Ich hatte das Gefühl, dass dies eventuell mit Klassen realisierbar wäre.

    Klassen spielen bei sowas keine besondere Rolle. Du kannst das mit und ohne Klassen gleichwertig implementieren. OOP dient der Ordnung und Strukturierung und weniger einer bestimmten fachlichen Zielerreichung.

    Theoretisch könnte man bei Berechtigungen das ganze eh schon einmal vorher abfragen und in einer Konstante speichern, was dann beim Bitvergleich ja überall klappen würde. Aber generell bei anderen Funktionen, die nicht immer gebraucht würden, wäre dies nicht praktisch.

    Ich würde keine Bits (in einem Byte, Integer, sonstwas) nehmen sondern boolesche Werte. Speicher ist heute nicht mehr so knapp. Das obige Prinzip kannst du für alle Arten von Daten nehmen.

    Lo!

    1. Hey,

      Dann solltest du das Ergebnis zwischenspeichern:
      Wenn für die gewünschte Berechtigung kein Eintrag im Array der Berechtigungen enthalten ist, frag sie aus dem DBMS ab und trag das Ergebnis in das Element ein. Gib den Elementinhalt zurück, sollte ja nun true oder false sein. Weitere Fragen überspringen die DBMS-Abfrage. Du solltest das gleich mit allen Berechtigungen am Stück machen, weil es unter anderem solche DBMS-Abfragen sind, die signifikant Zeit verbrauchen.

      Das klingt mal vernünftig! :)

      Ich würde keine Bits (in einem Byte, Integer, sonstwas) nehmen sondern boolesche Werte. Speicher ist heute nicht mehr so knapp. Das obige Prinzip kannst du für alle Arten von Daten nehmen.

      Obwohl nur eine Spalte in einer MySQL Tabelle mit der jeweiligen Berechtigung wohl einfacher abzuspeichern ist, als mehrere Spalten bzw. mehrere Datenzeilen.

      Danke für die aufschlussreiche Antwort!