Layout

Lektion 11 - Automatische Anmeldung

Nun weißt du alles über die Variablenübergabe via $_POST, $_GET und $_SESSION, kennst einige PHP Funktionen und solltest sie auch selbstständig anweden können.
Kommen wir nun zum praktischsten Teil des PHP-Kurses, zur MySQL Datenbank. Was steckt hinter einer automatisch laufenden Webseite, hinter Anmeldung in Echtzeit, hinter sofortiger Preisvergabge von Spielgewinnen.

 

11.1 MySQL Datenbank

Deine Datenbank ist Teil deines Servers, und du kannst ganz einfach über eine Webseite darauf zugreifen, dem sogenannten phpMyAdmin. Schauen wir uns das einmal genauer an. Auf der Seite deines Serveranbieters wirst du die URL zum phpMyAdmin finden, meistens musst du jedoch deine Datenbank zunächst aktivieren. Bei ohost funktioniert das z. B. über deine Loginstartseite - Webhosting-MySQL. Ein Klick und deine Datenbank ist aktiviert. Klicke dort nun auf MySQL-Daten, wo du unter phpMyAdmin - Jetzt aufrufen! in deine Datenbank gelangst.

Die Daten werden hier in Form von Tabellen gespeichert. Legen wir einmal eine an, in der alle deine Mitglieder unterkommen sollen. Links im Menüframe ist ein Link, der wie der Name deiner Datenbank, bei ohost also wie dein Account, heißt. Klicke dort drauf. Unten auf der Seite findest du ein Formular, mit dem du eine neue Tabelle in der Datenbank erstellen kannst. Du musst dort den Namen der Tabelle eingeben, und die Anzahl der Felder, d. h. der Informationen, die dort gespeichert werden sollen. Für unsere Anmeldung benötigen wir z. B. folgende Felder:

ID - Name - Passwort - eMail - Wohnort - Avatar - Geburtstag - Beitrittsdatum - Vermoegen

Trage als Name der Tabelle 'Mitglieder' ein und lasse 9 Felder hinzufügen. Anschließend klickst du auf 'ok'.

Nun öffnet sich eine neue Seite, mit einer Tabelle, die du ausfüllen musst. Die Angaben sind:

Feld Der Name der Information.
Typ Die Art der Information.
Länge Die maximale Zeichenlänge des Tabelleneintrags.
Attribute -
Null -
Standart Standartwert, der in die Tabelle eingetragen wird, wenn ein neuer Eintrag hinzugefügt wird, ohne dass spezielle Vorgaben über den Inhalt beim Einfügen gemacht werden.
Extra auto_increment zählt automatisch zu einer ID bei jedem neuen Eintrag 1 hinzu.
Primärschlüssel Unverwechselbarer Eintrag: Kein Eintrag in der Tabelle darf den gleichen Inhalt haben, wie ein anderer in diesem Feld. Wird ein weiterer Eintrag mit gleichem Feldinhalt hinzugefügt, kommt es zur Fehlermeldung.
Index -
Unique -
--- -
Volltext -

Die Angaben, die ich mit einem '-' beschrieben habe, darfst du ganz und gar ignorieren. Die Angabe der Art der Information ist wichtig. Welche du in erster Linie benötigen wirst sind:

Varchar String mit maximal 255 Zeichen.
Text String mit unbegrenzter Zeichenanzahl. Benötigt keine Längenangabe.
Int Zahl, mit der gerechnet werden kann.
Float Kommazahl, mit der gerechnet werden kann. Ein Komma in Zahlen wird immer als Punkt '.' ausgedrückt.
Date Datum, Format: Jahr-Monat-Tag
(JJJJ-MM-TT)
Datetime Datum und Uhrzeit, Format:
Jahr-Monat-Tag Stunden:Minuten:Sekunden
(JJJJ-MM-TT HH:MM:SS)

Die Art, in der du deine Angaben speichern lässt, ist entscheidend für das, was du beim Auslesen damit machen kannst. Du kannst zum Beispiel nicht mit 2 Varchar Angaben rechnen, dafür benötigst du den Typ 'int' (von Integer).
Ein Varchar-Feld benötigt weniger Speicherplatz auf deinem Server, als ein Text-Feld, deshalb solltest du bei wenigen Zeichen das Varchar-Feld wählen.
Wenn du bei einem Varchar-Feld beim Erstellen der Tabelle eine sehr kleine Länge, z. B. 2 einträgst, wird deine Tabelle automatisch den Typ 'Char' daraus machen. Er kann weniger Zeichen als ein Varchar-Feld speichern und nimmt daher noch weniger Speicherplatz in Anspruch. Genauso bei Int, aus dem ein Smallint werden kann.

Füllen wir nun aber unserer Mitglieder Tabelle aus:

Feld
Typ
Länge
Standart
Extra
Primärschlüssel
           
ID
int
11
 
auto_increment
X
Name
varchar
25
     
Passwort
varchar
12
     
eMail
varchar
100
     
Wohnort
varchar
50
     
Avatar
varchar
150
     
Geburtstag
date
     
Beitrittsdatum
date
   
Vermoegen
int
6
50
   
  • Die ID des Mitglied ist unser Primärschlüssel, durch auto-increment wird sie automatisch fortgezählt, so dass es unmöglich ist, dass es 2 gleiche Einträge an der Stelle gibt. Da gezählt wird, muss der Typ int sein, und da wir viele Mitglieder wollen, nehmen wir die maximale Anzahl einer int Länge.

  • Die Längen von den Varchar-Einträgen Name, Passwort, eMail und Wohnort solltest du großzügig bemessen, aber auch nicht unnötig groß (wie etwa 255 Zeichen). Wir wollen Avatare vorgeben, aber dem neuen Mitglied auch die Möglichkeit geben, die URL zum eigenen Avatar anzugeben. URLs zu Bildern, die eventuell in tiefen Ordnern lagern, können sehr lang sein.

  • Wenn ein Mitglied Geburtstag hat, könnten wir ihm automatisch etwas schenken. In ein Textfeld könnte jemand 27. Januar, 27.1., 27.01 oder siebenundzwanzigster Januar eingeben und wir wüssten nicht, wonach wir suchen sollten. Deshalb werden wir den Geburtstag in Dropdownlisten auswählen lassen und im Standartformat speichern.

  • Das Beitrittsdatum, an dem sich dein Mitglied angemeldet hat, wird ebenfalls im Date Format gespeichert. Es wird beim Eintrag automatisch ermittelt und in dem MySQL Standart Format gespeichert. Da wir in Deutschland aber ein anderes Datumformat haben, wählen wir das Date Format, um beim Auslesen damit als Datum Format arbeiten zu können.

  • Und zuletzt das Vermoegen deines Mitglieds, seien es Euro, Taler oder Goldmünzen, wovon es sich etwas kaufen kann. Da beim Kauf Geld abgezogen wird, wählen wir das int- Format, denn wir werden mit dem Vermögen rechnen. Als Standart geben wir 50 an. Jedes Mitglied soll bei der Anmeldung ein Startguthaben von 50 Euro, Taler, Münzen, ... bekommen.

 

11.2 Das Anmeldeformular

Die Daten, die wir in die Tabelle eintragen wollen, fragen wir über ein Formular ab.

   
Feldnamen
Name:
Name
eMail Adresse:
eMail
Passwort:
Passwort
Passwort wiederholen:
Passwort1
   
Wohnort:
Wohnort
Geburtstdatum:
Tag . Monat . Jahr
Tag Wert z.B 02, 12
Monat Wert z.B. 03, 11
   
Avatar:  
Avatar
Avatar
Avatar
Avatar
Avatar
Wert: Vollständige URL zum Bild
   
Oder URL zum eigenen Avatar:
AvatarURL

  • Erstelle dieses Formular auf der Seite anmeldung.php (und lass die Feldnamen Erläuterungen bitte raus, sie dienen nur dazu, dir mitzuteilen, wie du die Felder nennen kannst, mit denen wir gleich arbeiten).

  • Als maxlength Eigenschaft lege die maximale Anzahl der Zeichen fest, die du auch in der MySQL Tabelle angegeben hast.

  • Im Form-Tag verweise wieder auf die gleiche Seite anmeldung.php und übergib beim Senden der Variablen $action den Wert "anmelden".

  • Wenn man das Formular nicht korrekt ausfüllt und nach der Prüfung noch einmal ran muss, sollen die bisherigen Eingaben wieder als Wert in die Felder eingetragen sein. (Freiwillige Herausforderung bei den Drop Down Listen und den Radio Button. Mit if-Abfragen kannst du das mit deinem bisherigen Wissen hinbekommen.)

 

11.3 Datenbankanbindung

Um Daten aus der Datenbank auf deiner Webseite abrufen zu können, musst du samt deinem Namen und MySQL Passwort eine Verbindung herstellen. Das muss auf jeder Seite passieren, in der etwas ausgelesen werden soll. Nun wirst du unser PHP-Layout noch mehr zu schätzen wissen, denn, wie du weißt, werden die Unterseiten mittels include() in der Seite index.php eingefügt. Alles, was in der index.php steht, gehört auch zu den Unterseiten.

Die Verbindung zur Datenbank muss hergestellt werden, bevor der Server Informationen an den Browser schickt, die er übersetzt. Die erste Information, die durch den Browser übersetzt wird, ist das "<html>" des Grundgerüsts. Oberhalb davon hast du in Lektion 6 bereits die Session Funktion geschrieben. Schreibe die Verbindung zur Datenbank nun über die Loginfunktion, da wir im übernächsten Kapitel die Verbindung bereits hier brauchen werden, um das Passwort des Mitglieds zu kontrollieren.

<?php // Die Seite index.php

// Zugangsdaten
define('MYSQL_HOST', 'localhost');
define('MYSQL_USER', 'Name');
define('MYSQL_PASS', 'Passwort');
define('MYSQL_DATABASE', 'Datenbank');

// Verbindung
@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());
mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());

session_start();

...

Zunächst gibst du deine Zugangsdaten ein. Keine Sorge, man wird sie nicht sehen können, wenn man sich den Quelltext ansieht, sie bleiben geheim. Du findest die Daten auf der Seite deines Serveranbieters.

  • Der Host der Datenbank ist meistens 'localhost', das bedeutet, dass man nur von Webseiten auf die Datenbank zugreifen kann, die auf dem selben Server liegen. Manchmal fügt man hier aber auch eine URL ein.

  • Der Name ist dein Mitgliedsname und das Passwort dein MySQL Passwort

  • Database ist der Name deiner Datenbank. Bei ohost z.B. ist der Name der Datenbank der gleiche, wie dein Username.

Die Verbindung wird anschließend mit einigen MySQL Funktionen aufgebaut. Wenn die Verbindung fehlschlägt, wird auf der Seite via OR die(mysql_error()); der aufgetretene Fehler ausgegeben.

 

11.4 Formulareingaben überprüfen

Jetzt müssen wir alles überprüfen, was dein Mitglied falsch gemacht haben könnte. Genauso, wie wir es bereits beim eMail Versand gemacht haben. Die Angabe von Wohnort und dem Geburtsjahr sollen freiwillig sein.

  • Ist ein Name angegeben?
  • Ist ein Passwort eingegeben?
  • Wurde das Passwort korrekt verifiziert?
  • Wurde das Geburtstdatum ausgewählt?

// Die Seite anmeldung.php

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

    if ($_POST['Name'] == "") {
        echo "Gib einen Namen ein.";
        $Fehler = 1;
    }

    if ($_POST['eMail'] == "") {
        echo "Gib deine eMail Adresse ein.";
        $Fehler = 1;
    }

    if ($_POST['Passwort'] == "") {
        echo "Gib ein Passwort ein.";
        $Fehler = 1;
    }

    if ($_POST['Passwort'] != $_POST['Passwort1']) {
        echo "Die beiden Passwörter stimmen nicht überein.";
        $Fehler = 1;
    }

    if (($_POST['Tag'] == "Tag") OR ($_POST['Monat'] == "Monat")) {
        echo "Gib wenigstens Tag und Monat deines Geburtsdatums ein.";
        $Fehler = 1;
    }

    if ($Fehler != 1) {
        // Füge die Anmeldung in die Datenbank ein.
        $Angemeldet = 1;
    }

}

if ($Angemeldet != 1) {

    // Anmeldeformular

}

Soweit bekannt. Die Überprüfung, ob ein Avatar ausgewählt wurde, betrachten wir nun genauer. Man kann einen Avatar auswählen, oder die URL zum eigenen Bild eingeben. Nun könnte eine Überprüfung folgendermaßen aussehen:

if (($_POST['Avatar'] == "") AND ($_POST['AvatarURL'] == "")) {
    echo "Wähle deinen Avatar oder gib die URL zu deinem eigenen an.";
    $Fehler = 1;
}

Wenn keine Radio Button markiert und nichts in das Textfeld zum eigenen Avatar geschrieben wurde, können wir sicher sein, dass kein Avatar gewählt wurde. Was ist aber, wenn sich dein Besucher überlegt "Hm, die Avatare gefallen mir nicht, und ich habe gerade auch keinen, melde ich mich doch erst einmal an und kümmere mich später darum." Er markiert kein Radio Button und in das Feld AvatarURL macht er einen Strich " - "rein, weil man das gewohnheitsmäßig oft macht, wenn man etwas nicht ausfüllen möchte. Das Feld AvatarURL ist nicht mehr leer, die if-Abfrage oben kann nicht mehr feststellen, dass kein Avatar gewählt wurde.

 

11.5 Die Funktion strlen()

Eine URL hat immer eine gewisse Mindestlänge. http:// hat zum Beispiel 7 Zeichen, www. macht noch einmal 4 dabei, und auch wenn dein Besucher das alles weglässt, was man beim Aufruf von Seiten durchaus machen kann, ist die URL zu einem Bild noch immer länger als ein Strich. Die Funktion strlen() kann die Zeichlänge eines Strings zählen.

$Zeichen = strlen("Online Game Portal");

    echo $Zeichen;

    // Gibt 18 aus

$Zeichenkette = strlen($_POST['AvatarURL']);

    echo $Zeichenkette;

    // Gibt die Anzahl der Zeichen aus dem
    // Eingabefeld nach dem Abschicken aus.

Der Name eines Bildes besteht aus mindestens 1 Zeichen. Das Format aus mindestens 4, zum Beispiel "1.jpg". Das sind schon 5 Zeichen. Jede URL hat eine Endung von mindestens 3 Zeichen, wie z.B. ".de". Macht 8 Zeichen. Hinzu kommt der Name des Servers. Wir behaupten nun einmal, dass keiner aus nur 1 oder 2 Zeichen besteht. Nehmen wir einfach 3. Die kürzste URL, die man zum Avatar eingeben könnte, lautet also "abc.de/1.jpg" und besteht aus 11 Zeichen. Gegen ein "Ich will aber keinen Avatar haben *wein*"-Eintrag im URL Feld können wir damit natürlich nichts ausrichten, aber das Gewohnheitsstrich-Problem kann sehr wohl ausgeschaltet werden.
Anbei: In der nächsten Lektion werden wir sehen, wie wir herausfinden, ob ein String mit 'http://' beginnt. Auf diese Weise könnten wir das Feld auch überprüfen, allerdings ist es doch wesentlich netter vom Webmaster, seine Besucher selbst entscheiden zu lassen, wie sie ihre URLs gerne formulieren.

$Zeichenkette = strlen($_POST['AvatarURL']);

if (($_POST['Avatar'] == "") AND ($Zeichenkette < 11)) {
    echo "Wähle deinen Avatar oder gib die URL zu deinem eigenen an.";
    $Fehler = 1;
}

 

11.6 Eintrag in die Datenbank

Name, Passwort, eMail und Wohnort stehen bereits, aber beim Avatar und dem Geburtstag gibt es vor dem Eintrag noch etwas zu klären.

if ($Fehler != 1) {

   if ($_POST['Avatar'] == "") {
      $Avatarbild = $_POST['AvatarURL'];
   } else {
      $Avatarbild = $_POST['Avatar'];
   }

    // Füge die Anmeldung in die Datenbank ein.
    $Angemeldet = 1;
}

Zunächst einmal müssen wir herausfinden, ob das zukünftige Mitglied einen eigenen Avatar haben möchte oder nicht. Nach der Überprüfung, ob ein Avatarwunsch existiert, ist also entweder ein Avatar ausgewählt, oder die URL zum eignen Avatar angegeben. Wurde kein Avatar ausgewählt, wird die URL der Avatar sein, wurde ein Avatar ausgewählt, so soll der ausgewählte Avatar der Avatar sein. Welcher es schließlich ist, wird in der Hilfsvariablen $Avatarbild gespeichert. Sollte dein Besucher einen Avatar ausgewählt und die eigene URL angegeben haben, so trägt hier also der gewählte Avatar den Sieg davon.

Beim Geburtstag müssen wir uns überlegen, dass dieser im Date-Typ in der MySQL Datenbank gspeichert wird, und dass der Typ Date, wie oben bereits erwähnt, immer ein bestimmtes Format hat (JJJJ-MM-TT). Wählt man in der MySQL Datenbank beim Eintrag der Tabelle den date-Typ aus, und lässt das Feld Standart leer, so wird automatisch der Standart 0000-00-00 eingetragen. Bauen wir nun unser Geburtsdatum nach Maß zusammen.

if ($Fehler != 1) {

    // Avatarbild

    if (($_POST['Jahr'] == "") OR ($_POST['Jahr'] == "Jahr")) {
       $Geburtsjahr = "1900";
    } else {
       $Geburtsjahr = $_POST['Jahr'];
    }

    $GeburtstagEintrag = $Geburtsjahr."-".$_POST['Monat']."-".$_POST['Tag'];

    // Füge die Anmeldung in die Datenbank ein.
    $Angemeldet = 1;

}

Die Angabe des Geburtsjahres ist freiwillig. Wenn das Jahr nicht angegeben wurde, schreiben wir 1900, ansonsten das Geburtsjahr. Sollte dein Besucher als Jahr 83 und nicht 1983 angeben, so ergänzt MySQL das Jahr automatisch.
Tag und Monat waren Pflichtangeben, die haben wir. Jetzt können wir alle Teile durch Verkettung der Strings in die Formvorlage pressen. JJJJ-MM-TT.

Wenn du deine Datenbankanbindung aus 11.3 steht, kann es jetzt losgehen.

if ($Fehler != 1) {

    // Avatarbild

    // GeburtstagEintrag

   $sql = "INSERT INTO Mitglieder
                     (Name, Passwort, eMail, Wohnort, Geburtstag, Avatar, Beitrittsdatum)
              VALUES
                     ('"
.$_POST['Name']."',
                      '"
.$_POST['Passwort']."',
                      '"
.$_POST['eMail']."',
                      '"
.$_POST['Wohnort']."',
                      '"
.$GeburtstagEintrag."',
                      '"
.$Avatarbild."',
                        NOW())"
;

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

    echo "Herzlich Willkommen, ".$_POST['Name']."!";

    $Angemeldet = 1;

}

Wir weisen der Variablen $sql die MySQL Anweisung zu.

  • INSERT INTO ist eine Aufforderung, etwas in eine MySQL Tabelle einzufügen (und nicht etwa etwas auszulesen oder zu löschen). Welche Tabelle das sein soll, schreiben wir gleich dahinter. Die Tabelle, die wir oben für unserer Anmeldungen erstellt haben, haben wir 'Mitglieder' genannt.

  • Anschließend geben wir an, in welche Felder etwas eingefügt werden soll. Dafür schreiben wir die Namen der Felder aus, die wir auch bereits festgelegt haben, getrennt durch ein Komma und zusammengefasst in Klammern.

  • VALUES leitet die Werte ein, die in die Felder eingefügt werden sollen. Das passiert jeweils der Reihe nach. Der erste Wert unter Value geht in den ersten Eintrag unter Insert Into. Der zweite Wert von Value in den 2. Eintrag unter Insert Into. Die Anzahl der Felder muss oben wie unten deshalb genau die gleiche sein.
    Die einzufügenden Werte stehen ebenfalls in Klammern und werden durch ein Komma getrennt. Außerdem sind sie in Anführungszeichen ' ' eingebettet. Anstelle einer Variablen, wie wir es hier tun, könnten wir natürlich auch gleich einen String reinsetzten, als Namen z.B. 'Helga'. Was du hier siehst, ist eben nichts weiter als eine Verkettung von Strings und Variablen, die beim Auslesen in dem Gesamtstring übersetzt werden. Wie immer.

Als Beitrittsdatum geben wir NOW() ein. Das ist eine Mysql Funktion, die ohne die Anführungszeichen ' ' eingefügt werden muss. Du erinnerst dich sicher an die PHP Funktion time(). In ihr steckt die Zeit vom 1.1.1970 bis heute in Sekunden. In der MySQL Funktion NOW() stecken das aktuelle Datum und die Uhrzeit im Format JJJJ-MM-TT HH:MM:SS, genau das gleiche Format, wie beim MySQL Type datetime, bzw. das Datum betrachtet auch date.

Versucht man einen 50 Zeichen langen String in ein Varchar Feld mit der Länge 30 einzufügen, werden die letzten 20 Zeichen kommentarlos abgeschnitten. Fügt man das Datum der Funktion NOW() in ein Date-Feld ein, wird die Uhrzeit einfach abgeschnitten und übrig bleibt das Datum.

Durch die Funktion mysql_query() wird die Anweisung an die Datenbank geschickt. Passiert dabei ein Fehler, wird, wie bei der Datenbankanbindung, eine Fehlermeldung ausgegeben.

 

Wenn du nun auf die Mitglieder Tabelle in phpMyAdmin siehst, kannst du den Eintrag sehen. Auf deine Webseite bringen wir ihn in der nächsten Lektion.


hr

11.7 Übungen

11.7.1 Wie muss die if-Abfrage, in der wir bestimmen, ob ein Wahl Avatar oder die URL zu einem Avatar in die Tabelle einfügt wird, aussehen, wenn wir die URL zum eigenen Avatar als Standart nehmen, wenn dort eine URL eingegeben wurde, unabhängig davon, ob ein Bild ausgewählt wurde?

11.7.2 Baue die Anmeldung in deine Übungsseite ein.

11.7.3 Stelle dir vor, es gäbe eine Tabelle mit Namen 'Tabelle', die 4 Felder hat: Name, Bild, Beschreibung, Datum. Als Name soll 'Heidi', als Beschreibung 'Dies ist ein Apfel', als Bild 'apfel.jpg' und als Datum das aktuelle Datum eingefügt werden. Wie sieht die MySQL Anweisung aus?

« zurück Inhalt | Fragen       Kurs weiter »
Layout