Layout

Lektion 13 - Login Funktion II

Überarbeiten wir nun noch einmal unsere Loginfunktion. Beim Einloggen soll das Passwort überprüft werden. Außerdem werden wir eine User-Online Funktion einbauen.

 

13.1 Passwort Vergleich

Erweiter das Login Formular in deiner index.php um das Feld Passwort. Der Type ist 'password' und der Name 'Passwort'. Lösche die erste Einlogg Funktion ersteinmal. Statt der direkten Session Zuweisung des Namens müssen wir das Passwort aus der Datenbank auslesen und vergleichen. Dafür müssen wir wissen, aus welchem Eintrag das Passwort genommen werden muss. Das machen wir mit der MySQL Anweisung WHERE.

// Die Seite index.php

if ($_GET['action'] == "login") {

    $sql = "SELECT
                     ID,
                     Name,
                     Passwort
                FROM
                     Mitglieder
               WHERE
                     Name = '"
.$_POST['Name']."'";

    $result = mysql_query($sql) OR die(mysql_error());

    while($row = mysql_fetch_assoc($result)) {

        if ($_POST['Passwort'] == $row['Passwort']) {

            $_SESSION['Mitglied'] = $row['Name'];
            $_SESSION['ID'] = $row['ID'];

            $Eingeloggt = 1;
       }

    }

    if ($Eingeloggt != 1) {

        echo "<script language='JavaScript'>alert('Falsche Eingaben.');</script>";

    }

}

Auf diese Weise prüfen wir gleich zweierlei:

  • Wenn der Name, der im Login Formular angegeben wurde, in der Datenbank nicht existiert, wird auch nichts aus der MySQL Tabelle ausgelesen. mysql_fetch_assoc() liefert false zurück, bevor die while-Schleife durchlaufen wird. Die Hilfsvariable $Eingeloggt kann nicht den Wert 1 annehmen und es wird die Fehlermeldung "Falsche Eingaben" ausgegeben.

  • Existiert der Name in der Datenbank, wird in der while-Schleife das Passwort überprüft. Wenn es nicht das gleiche ist, wie das, das eingegeben wurde, wird $Eingeloggt wieder nicht zu 1 und die Fehlermeldung wird ausgegeben.

Stimmen Name und Passwort mit dem Eintrag in der Datenbank überein, werden den Sessions 'Name' und 'ID' die Werte Name und ID des Mitglieds zugewiesen. Doch wofür brauchen wir eigentlich eine ID, wenn wir doch einen Namen haben, und du bei den Aufgaben gleich sicherstellen wirst, dass niemand mehr den gleichen Namen bekommt?

Eine ID besteht nur aus Zahlen. Ein Name kann mit einer Menge Sonderzeichen, wie mit einem 'ö', 'ß' oder einem Leerzeichen ' ' aufgebaut sein. Wenn du nun eine Seite für Mitglieder erstellst, auf der z. B. ihre persönlichen Trading Cards angezeigt werden, übergibst du der URL, was mit WHERE aus der Datenbank ausgelesen soll. Würdest du das über dem Namen tun - url.php?Name=".$row['Name']." - würde die URL diese Sonderzeichen enthalten, und nicht alle Browser können damit etwas anfangen.
Ein noch größeres Problem gibt es, wenn du Dateien, wie z. B. Bilder, unter dem Namen auf deinem Server laden lässt. Der viel genutzt Internet Explorer würde nur noch rote Kreuze anzeigen bei Bildern von Mitgliedern, die Sonderzeichen enthalten.

 

13.2 User Online Tabelle anlegen

Öffne dein phpMyAdmin und füge eine neue Tabelle mit dem Namen 'Online' hinzu:

Feld
Typ
Länge
     
ID
int
11
Name
varchar
25
Zeit
int
10

In diese Tabelle sollen die ID und der Name der Mitglieder, die gerade auf deiner Seite online sind. In dem Feld Zeit kommt ein Timestamp hinein. Ein Timestamp (Sekunden seit dem 1.1.1970) ist immer 10 Zeichen lang, und da wir mit ihm rechnen wollen, ist der Typ int.

 

13.3 Eingeloggte Mitglieder einfügen

Wenn ein Mitglied eingeloggt ist, existiert seine Session ID.

if (isset($_SESSION['ID'])) {

    $Zeit = time();

    $sql = "INSERT INTO Online
                       (ID, Name, Zeit)
                VALUES
                       ('"
.$_SESSION['ID']."',
                        '"
.$_SESSION['Mitglied']."',
                        '"
.$Zeit."')";

    mysql_query($sql) OR die(mysql_error());

}

Wenn seine Session ID existiert, fügen wir es also in die User Online Tabelle ein. Auf diese Weise passiert das jedoch jedesmal, wenn dein Mitglied eine neue Seite läd. Also müssen wir feststellen, ob es bereits in der Tabelle drin steht. Nur, wenn das nicht der Fall ist, fügen wir es hinzu.

if (isset($_SESSION['ID'])) {

    $sql = "SELECT
                     ID
                FROM
                     Online
               WHERE
                     ID = '"
.$_SESSION['ID']."'";

    $result = mysql_query($sql) OR die(mysql_error());

    while($row = mysql_fetch_assoc($result)) {

        $StehtDrin = 1;

    }

    if ($StehtDrin != 1) {

       $Zeit = time();

       $sql = "INSERT INTO Online
                           (ID, Name, Zeit)
                    VALUES
                           ('"
.$_SESSION['ID']."',
                           '"
.$_SESSION['Name']."',
                           '"
.$Zeit."')";

       mysql_query($sql) OR die(mysql_error());

    }

}

Das gleiche Phänomen wie bei unserer Login Funktion. Wenn etwas in einer Tabelle ausgelesen werden soll, das nicht existiert, wird die while-Schleife nicht durchlaufen. $StehtDrin wird nicht zu 1 und das Mitglied kann in die Online Tabelle eingefügt werden. Läd es nun die nächste Seite, kann etwas aus der Online Tabelle ausgelesen werden und $StehtDrin wird zu 1. Die Abfrage ($StehtDrin != 1) wird false und die Anweisung wird nicht ausgeführt.

Füge diese User Online Funktion unterhalb deiner Login Funktion, aber überhalb deines HTML Grundgerüsts ein.

 

13.4 Eingeloggte Mitglieder auslesen

Suche einen passenden Platz in deiner index.php, um die Online Tabelle auszulesen. Zum Beispiel unterhalb deines Linkmenüs. Damit deine Mitglieder nicht leer im Raum stehen, wollen wir sie zählen lassen und die Anzahl mit ausgeben.

    $sql = "SELECT
                     ID,
                     Name
                FROM
                     Online
               ORDER BY
                     Name ASC
";

    $result = mysql_query($sql) OR die(mysql_error());

    echo "User Online<br>";
    echo "- ".mysql_num_rows($result)." -<br><br>";

    while($row = mysql_fetch_assoc($result)) {

        echo $row['Name']."<br>";

    }

Die Funktion mysql_num_rows() liefert die Anzahl der Einträge in einer MySQL Tabelle. Als Parameter wird ihr das Ergenbis der Funktion mysql_query() übergeben, was wir hier $result zugewiesen haben.

Die ID des Mitglieds bräuchten wir hier nicht auslesen. Doch da du bei den Aufgaben gleich individuelle Profile erstellen wirst, die du in der User Online Liste verlinkst, sorgen wir dafür schon einmal vor.

echo "<a href='index.php?Seite=profil.php&Mitglied=".$row['ID']."'>".$row['Name']."</a><br>";

 

13.5 Ausloggende Mitglieder löschen

Wenn dein Mitglied für den Moment genug von deiner Seite hat und sich ausloggt, soll es aus der Online Tabelle gelöscht werden. Dies funktioniert mit der Anweisung DELETE.

if ($_GET['action'] == "logout") {

    $sql = "DELETE FROM
                       Online
               WHERE
                       ID = '"
.$_SESSION['ID']."'";

    mysql_query($sql) OR die(mysql_error());

    session_destroy();

}

Füge die Lösch Anweisung in deine bestehende Logout Funktion ein. Doch achte darauf, dass diese Funktion unterhalb der Funktion steht, die die Namen in die Online Tabelle einfügt, denn sonst wird der Name erst gelöscht und steht dann gleich wieder drin.

 

13.6 Nicht ausgeloggte Mitglieder löschen

Viele Mitglieder loggen sich nicht aus, wenn sie die Seite verlassen. Da die Lösch Funktion aber nur aufgerufen wird, wenn man den Link 'Ausloggen' klickt, würden sie ewig in der Online Liste stehen bleiben. Dafür haben wir nun unseren Timestamp. Wenn ein Mitglied 6 Minuten (wahllos gewählt) nicht mehr auf deiner Seite aktiv war, soll es aus der Online Liste gelöscht werden. Aktiv ist es, wenn es auf Links klickt und damit Seiten neu aufruft. Mit dem Timestamp haben wir die Zeit gespeichert, wann das Mitglied der Online Tabelle hinzugefügt wurde.
Nun müsen wir erst einmal sicher stellen, dass diese Zeit auf den neusten Stand gebracht wird, wenn dein Mitglied eine Seite läd. Dies geschieht mit der Anweisung Update.

if (isset($_SESSION['ID'])) {

    $Zeit = time();

    $sql = "UPDATE
                      Online
                SET
                      Zeit = '"
.$Zeit."'
                WHERE
                      ID = '"
.$_SESSION['ID']."'";

    mysql_query($sql) OR die(mysql_error());

}

Unter SET schreibst du, was aktualisiert werden soll. Unser Timestamp in dem Feld Zeit wird nun durch den aktuellen Timestamp ersetzt. Möchtest du mehrere Felder aktualisieren, musst du die Zuweisungen durch ein Komma trennen. Das werden wir in der nächsten Lektion aber auch noch tun.
Anstatt den Timestamp jedesmal neu in einer Variablen zu speichern, kannst du die Zuweisung auch einmal ohne jegliche if-Anweisung über deine HTML Grundgerüst der index.php schreiben. Das muss aber sehr weit oben passieren, damit die ganzen darunterliegenden Funktionen sie auslesen können.

 

13.6.1 Mitglieder nach 6 Minuten Inaktivität löschen

Liegt der zuletzt aktualisierte Timestamp 6 Minuten zurück, soll das inaktive Mitglied nun automatisch aus der Online Tabelle gelöscht werden.

$OnlineLoeschen = time() - 60*6;

$sql = "DELETE FROM
                 Online
            WHERE
                 Zeit < "
.$OnlineLoeschen."";

mysql_query($sql) OR die(mysql_error());

Zunächst bestimmen wir dafür, welcher Timestamp vom jetztigen Augenblick aus gesehen vor 6 Minuten vorherrschte. 60*6, also 60 Sekunden * 6 genommen, macht 6 Minuten. Du kannst natürlich auch gleich 600 Sekunden nehmen. Ist der Timestamp in der Tabelle noch kleiner als der, der 6 Minuten her ist, wird der Eintrag gelöscht.

Wenn du anstelle des Gleichheitszeichen in der WHERE Anweisung einen größer/kleiner Vergleich setzt, achte darauf, dass der zu vergleichende Wert nicht in den Anführungszeichen ' und ' eingebettet ist.

Füge diese Löschfunktion ebenfalls über dein HTMLGrundgerüst ein.


hr

13.7 Übungen

13.7.1 Baue das neue Login System samt der User Online Liste auf deine Übungsseite ein.

13.7.2 Wenn kein Mitglied eingeloggt ist, soll anstelle der Namen ein Stich '-' erscheinen.

13.7.3 Du weißt nun, wie du überprüfen kannst, ob ein Eintrag in einem Feld in der Datenbank bereits vorhanden ist. Füge deiner Anmeldung nun eine weitere Abfrage hinzu: Prüfe, ob der Name bereits in einem der Felder 'Name' der Tabelle 'Mitglieder' vorhanden ist. Ist das der Fall, gib eine Fehlermeldung aus.

13.7.4 Mit Hilfe der Anweisung WHERE kannst du in einer SELECT Anweisung einen bestimmten Eintrag auslesen. Schreibe eine Seite profil.php, in der nur die Tabelle eines einzelnen Mitglieds ausgelesen wird. Füge den Link zu dieser speziellen Profilseite dem entsprechenden Namen in der User Online Liste hinzu.

« zurück Inhalt | Fragen       Kurs weiter »
Layout