Benutzerverwaltung (User-Klasse mit MySQLi)

  • [Edit]
    Klassen-Beschreibung im 2. Post begonnen

    Kleinen Fehler in der Methode registerUser behoben, der dazu führte, dass neue User im mit isActive=0 registriert wurden, auch wenn durch Übergabe des Parameters $requiresActivation=false festgelegt wurde, dass keine Aktivierung nötig ist.
    [/Edit]


    Hier habe ich mal eine kleine User-Klasse mit ein paar Grundfunktionalitäten. Ist jetzt nicht besonders umfangreich, kann aber recht problemlos erweitert werden (weiter User-Felder z.B.).

    Benötigt:
    PHP5
    MySQLi (OOP-Stil)


    User können sich registrieren, hierbei kann per Parameter festgelegt werden, ob eine Aktivierung erforderlich ist oder der User direkt freigeschaltet wird.
    Ist eine Aktivierung erforderlich wird beim registrieren ein Aktivierungscode erstellt und zurückgegeben. Mit diesem Aktivierungscode und der id des soeben angelegten Users kann der User dann freigeschaltet werden, bzw ein Link generiert werden den man dem User per Email schickt, wie ihr das macht ist eure Sache. :)
    Für das User-Login kann festgelegt werden, ob IP-Adressen nach einer bestimmten Anzahl fehlgeschlagener Login-Versuche in einem bestimmten Zeitraum für einen bestimmten Zeitraum gesperrt werden sollen.
    Die entsprechende Anzahl und der entsprechende Zeitraum können in den Klassen-Konstanten angepasst werden.


    User.class.php

    tables.sql


    Desweiteren habe ich hier noch einen kleinen Beispielcode zur Verwendung. Man kann sich damit registrieren, der Aktivierungslink wird nicht verschickt sondern direkt ausgegeben. Man kann sich einloggen und ausloggen. Ist aber alles eher schlampig auf die schnelle runtergehackt. Zum testen reicht es aber :)
    Die Dateien müssen so benannt werden wie hier und im gleichen Verzeichnis wie die User.class.php abgelegt werden. Natürlich müssen vorher die MySQL-Tabellen angelegt werden.
    In der test.php müssen außerdem die Daten für die DB-Verbindung angepasst werden.

    test.php

    loginForm.tpl.php

    registerForm.tpl.php

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    3 Mal editiert, zuletzt von SinnlosS (14. September 2010 um 20:38)

  • Da ich gerade etwas Zeit hatte, mal noch eine Beschreibung der Klasse. Die restlichen Methoden folgen noch.

    Konstanten
    In den Konstanten werden einige Einstellungen für Registrierung und Login festgelegt. Im Einzelnen sind dies:

    const activationExpires
    Hier wird die Anzahl der Tage festgelegt, nach denen ein Aktivierungscode ungültig wird. Wird nur benötigt wenn registrierte User nicht direkt nach der Registrierung freigeschaltet werden, sondern ihre Email-Adresse durch einen Aktivierungslink der ihnen zugeschickt wird verifizieren müssen.
    Kann beliebig festgelegt werden, Default-Wert ist 14.

    const IP_maxLoginTries
    Hier wird die maximale Anzahl fehlgeschlagener Logins festgelegt, nach denen die Anmeldung von dieser IP aus für einen bestimmten Zeitraum gesperrt wird.
    Kann beliebig festgelegt werden, Default-Wert ist 5.

    const IP_blockDuration
    Hier wird die Dauer in Minuten festgelegt, für die eine IP-Adresse gesperrt wird, nachdem sie eine bestimmte Anzahl fehlgeschlagener Login-Versuche hatte (festgelegt in const IP_maxLoginTries).
    Kann beliebig festgelegt werden, Default-Wert ist 15.


    Eigenschaften
    private $db
    Selbsterklärend (hoffentlich). Hier wird das Datenbank-Objekt abgelegt.

    private $cache
    In diesem Array werden User-Daten gecached um sie bei mehrmaliger Abfrage nicht jedesmal aufs neue aus der Datenbank holen zu müssen. Weiteres siehe bei der Beschreibung der Eigenschaft $fields und den Beschreibungen der magischen Methoden __set und __get.

    private $fields
    In diesem Array werden die Spaltennamen der User-Tabelle abgelegt, deren Werte für den aktuellen User aus der Datenbank gelesen und in der Datenbank geupdated werden dürfen. Für weiteres siehe die Beschreibungen der magischen Methoden __set und __get.
    Kann beliebig um weitere Felder der eigenen User-Tabelle erweitert werden.

    private $id
    Hier wird die ID des Users abgelegt.


    Magische Methoden
    Für diejenigen die den Begriff magische Methoden nicht kennen: Damit werden Methoden bezeichnet, die nicht explizit aufgerufen werden, sondern automatisch beim Eintreten gewisser Umstände. Ein Beispiel ist der Konstruktor einer Klasse, die magische Methode __construct. Diese wird automatisch aufgerufen, wenn via new ein neues Objekt einer Klasse erzeugt wird. Weiterhin verwendet werden von mir __get und __set.
    __get wird automatisch aufgerufen, wenn lesend auf eine Objekt-Eigenschaft zugegriffen wird, die nicht gesetzt ist.
    __set wird automatisch aufgerufen, wenn schreibend auf eine Objekt-Eigenschaft zugegriffen wird, die nicht gesetzt ist.

    __get


    Wird lesend auf eine Eigenschaft eines User-Objektes zugegriffen die nicht gesetzt ist, so wird überprüft ob diese Eigenschaft in den als verfügbar festgelegten Feldern des Arrays $fields enthalten ist. Wenn dem so ist wird überprüft, ob der Wert dieser Eigenschaft bereits im Array $cache abgelegt ist. Falls nicht, wird das Feld aus der Datenbank ausgelesen und im Array $cache abgelegt. Anschließend wird der entsprechende Wert zurückgegeben.
    Beispiel:

    PHP
    <?php
    // ...code blabla code...
    $user = new User($db,$user_id);
    echo $user->name;
    ?>


    name ist keine gesetzte Eigenschaft in dem User-Objekt, also wird auf die magische Methode __get zugegriffen. Diese sieht, dass "name" durch den Array fields zugelassen (=enthalten) ist, liest das entsprechende Feld aus der Datenbank, schreibt es in den Array cache und gibt den Wert zurück. Beim nächsten Zugriff auf $user->name wird in diesem Scriptdurchlauf nicht mehr die Datenbank abgefragt, sondern auf den Wert aus dem Array cache zurückgegriffen.

    __set


    Wird schreibend auf eine Eigenschaft eines User-Objektes zugegriffen die nicht gesetzt ist (auch wenn sie nur nicht im Sichtbarkeitsbereich liegt, aufgrund von private/protected), so wird überprüft ob diese Eigenschaft in den als verfügbar festgelegten Feldern des Arrays fields enthalten ist. Wenn dem so ist wird ein Datenbank-Query ausgeführt, der das entsprechende Feld für den aktuellen User updated, und der neue Wert dann in den Array cache geschrieben (ein eventuell bereits vorhandener Eintrag für diese Eigenschaft wird überschrieben, klar).
    Beispiel:

    PHP
    <?php
    // ...code blabla code...
    $user = new User($db,$user_id);
    $user->name = "Peter";
    ?>


    name ist keine gesetzte Eigenschaft in dem User-Objekt, also wird auf die magische Methode __get zugegriffen. Diese sieht, dass "name" durch den Array fields zugelassen (=enthalten) ist, aktualisiert das entsprechende Feld in der Datenbank und schreibt den neuen Wert in den Array cache. Der Name für unseren User wird also auf "Peter" gesetzt.

    Die Idee zu dieser Verwendung von __set und __get habe ich in einem Tutorial gefunden, für gut befunden, und dreist assimiliert.
    Hier die Quelle:
    http://professionelle-softwareentwicklung-mit-php5.de/oop.interceptors.set.html
    Beispiel 2.5: Virtuelle Instanzvariablen im Einsatz

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Schöner ist das ganze wenn du sowas auf MVC-Prinzip aufbaust und nicht eine Klasse für alles hast mfg

  • Schöner ist das ganze wenn du sowas auf MVC-Prinzip aufbaust und nicht eine Klasse für alles hast mfg



    Klar, große Projekte sind bei mir auch anders aufgebaut.
    Das hier ist halt ne simple Klasse die ich mir privat mal für kleinere Projekte geschrieben habe. Da finde ich sie ausreichend und bequem zu handhaben.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook