PHP - 1 - Inhalt: Allgemein .....................................................................................................................................................................2 Strings verbinden .......................................................................................................................................................2 Navigation in include-Dateien auslagern .................................................................................................................2 1) "kopf.inc.php" ..................................................................................................................................................................... 2 2) die eigentliche HTML-Seite (z.B. "pyramiden.php") ......................................................................................................... 3 3) "fuss.inc.php" ...................................................................................................................................................................... 3 PHP und MYSQLi ........................................................................................................................................................3 MYSQLi-Datenbank mit "phpMyAdmin" anlegen .................................................................................................................. 3 Exportieren/Importieren ........................................................................................................................................................... 5 a) Datenbank exportieren 5 b) Datenbank importieren 6 c) Einzelne Tabellen exportieren 7 d) Tabellen importieren 8 Mit php und Mysqli arbeiten ......................................................................................................................................8 1) Verbindung herstellen ......................................................................................................................................................... 8 2) Abfrage ausführen ............................................................................................................................................................... 9 3) Abfrageergebnis anzeigen ................................................................................................................................................... 9 4) Datensätze in einer Tabelle ausgeben ............................................................................................................................... 10 5) Anzahl der Datensätze ermitteln ....................................................................................................................................... 10 6) Datensätze einfügen .......................................................................................................................................................... 11 7) Datensätze löschen ............................................................................................................................................................ 11 8) Datensätze ändern ............................................................................................................................................................. 11 Formulare ..................................................................................................................................................................12 1) Allgemein .......................................................................................................................................................................... 12 2) Textfelder .......................................................................................................................................................................... 12 3) Mehrzeiliger Text.............................................................................................................................................................. 12 4) Buttons .............................................................................................................................................................................. 12 5) Checkbox .......................................................................................................................................................................... 13 6) Auswahlliste ...................................................................................................................................................................... 13 7) Übergabe von Formular-Daten an die verarbeitende php-Datei ....................................................................................... 13 8) Sprung zu bestimmter Datei .............................................................................................................................................. 14 9) Nachrichten in einem Link mitsenden .............................................................................................................................. 14 10) Buttons mit individueller Aktion ...................................................................................................................................... 14 11) Checkboxes in Datensatzliste ............................................................................................................................................ 15 Währung ....................................................................................................................................................................16 Datum und Uhrzeit ....................................................................................................................................................16 1) PHP - Timestamp .............................................................................................................................................................. 16 2) MySql Timestamp nach PHP konvertieren ....................................................................................................................... 16 3) PHP - Datum nach MySQL konvertieren ......................................................................................................................... 16 4) Texteingabe in PHP - Datum umwandeln ......................................................................................................................... 17 5) NULL - Wert in MySql Datumsfeld ................................................................................................................................. 17 Sessions ....................................................................................................................................................................17 1) Einführung ........................................................................................................................................................................ 17 2) "session_start" ................................................................................................................................................................... 17 3) Anwendungsbeispiel: Login.............................................................................................................................................. 18 PHP - 2 - Zusammenfassung PHP und MYSQL Allgemein PHP-Skripts können an beliebiger Stelle und beliebig oft in eine HTML-Seite eingebunden werden. Sie beginnen mit "<?php" und enden mit "?>". Jede Anweisung muss, wie in Java, mit einem Semikolon abgeschlossen werden. Dateien, die PHP-Skripts enthalten, müssen mit der Erweiterung ".php" abgespeichert werden. Kommentare beginnen wie in Java mit "//" und gelten bis zum Ende der Zeile. Mehrzeilige Kommentare sind natürlich auch möglich: sie sind von /* und */ einzuschließen. Für Strings sind sowohl einfache als auch doppelte Anführungszeichen erlaubt: $a = 5; // einzeiliger Kommentar $s= "Hallo"; $s= 'Hallo'; /* hier beginnt ein mehrzeiliger Kommentar. Ende des mehrzeiligen Kommentars */ Variablen beginnen mit einem Dollarzeichen, Groß- Kleinschreibung wird unterschieden! Mit dem „echo“ - Befehl kann in einem PHP-Skript beliebiger HTML-Text (bei Bedarf auch komplette HTML-Seiten) erzeugt werden. Achtung! Sowohl der echo-Befehl als auch HTML-Attribute verlangen Anführungszeichen. Da echo sowohl einfache als auch doppelte akzeptiert, HTML-Attribute dagegen nur doppelte, setzt man generell den String, der „echo“ übergeben wird, in einfache Anführungszeichen: echo '<a href="weiter.php">Weiter</a>'; // außen: einfache Anführungszeichen für PHP; Innen: doppelte A. für HTML Strings verbinden Strings können mithilfe des Punkt -Operators (".") mit Variablen verbunden werden. Achtung! Vergisst man das $-Zeichen vor der Variable, wird nicht der Inhalt sondern der Name der Variable in den String übernommen! $name = 'Eva'; $s = 'Hallo, ' . $name; // ergibt: "Hallo, Eva" $s = 'Hallo, ' . name; // $-Zeichen vergessen → ergibt „Hallo, name“ Navigation in include-Dateien auslagern Mit PHP können HTML-Seiten in Einzelteile "zersägt" und in separaten Dateien gespeichert werden. Mit dem "include"-Befehl lassen sie sich an beliebiger Stelle wieder einfügen. Damit ist es möglich, die komplette Navigation auszulagern. In der HTML-Seite bleibt nur der eigentliche Seiteninhalt übrig. "include" erwartet in Klammern und Anführungszeichen den Dateinamen. Im folgenden Beispiel enthält die include-Datei "kopf.inc.php" den üblichen HTML-Kopf, die <div> für Header, Navigation und Hauptbereich. Der eigentliche Seiteninhalt beginnt mit der Überschrift ("H1"). In welchem <div> er sich befindet oder welche Bereiche es noch gibt, weiß er nicht und soll es auch gar nicht wissen. Damit sind Layout und Seiteninhalt unabhängig voneinander. Änderungen an der Navigation müssen nur in der include-Datei vorgenommen werden, wirken sich aber auf alle HTML-Seiten aus, die diese Datei einlesen. Am Ende wird eine zweite include-Datei eingelsen, die alles enthält, was auf den Hauptbereich folgt (Ende des „main“-Div, ev. Footer, etc.). Beispiel „Sieben Weltwunder“: 8 Seiten (7 Weltwunder + Startseite) sollen eine einheitliche Navigation bekommen, die in eine einzige Include-Datei ausgelagert ist und zu Beginn jeder Seite mit dem Befehl „include“ eingebaut wird: 1) "kopf.inc.php" <!DOCTYPE html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Weltwunder</title> <link href="weltwunder.css" rel="stylesheet" type="text/css" /></head> PHP - 3 - <body> <div class="header"><img src="bilder/logo.jpg" /></div> <div class="navig"> <ul> <li><a href="index.html">Home</a></li> <li><a href="pyramiden.html">Pyramiden</a></li> <li><a href="koloss.html">Koloss</a></li> <li><a href="leuchtturm.html">Leuchtturm</a></li> <li><a href="garten.html">Gärten</a></li> <li><a href="mausoleum.html">Mausoleum</a></li> <li><a href="zeus.html">Zeusstatue</a></li> <li><a href="artemis.html">Artemis</a></li> </ul> </div> <div class="main> Hier endet der für alle Seiten gleiche Teil. Daruf folgt, hinter dem <div>-Tag des Hauptteils („main“), der eigentliche, unterschiedliche Seiteninhalt der einzelnen Weltwunderseiten (+ Startseite). 2) die eigentliche HTML-Seite (z.B. "pyramiden.php") <?php include('kopf.inc.php'); ?> <h1>Die Pyramiden von Gise</h1> ... <?php include('fuss.inc.php'); ?> 3) "fuss.inc.php" </div> </body> </html> PHP und MYSQLi MYSQLi-Datenbank mit "phpMyAdmin" anlegen 1) Apache und Mysql-Server im XAMPP-Control Panel starten. Im Browser das Datenbankadministrationstool phpMyAdmin öffnen, indem folgende Adresse eingegeben wird: "http://localhost/phpMyAdmin/" 2) Auf der Startseite Klick auf „Datenbanken“, anschließend Name der neuen Datenbank eintippen und auf „Anlegen“ klicken. 3) Unter "Neue Tabelle in Datenbank ... erstellen" den Namen der Tabelle und Anzahl der Felder eingeben, Klick auf "OK". 4) Die Felder der Tabelle definieren: für Textfelder den Typ "VARCHAR" wählen, unter "Länge" die Anzahl der maximal erlaubten Zeichen eingeben und unter „Kollation“ die Textcodierung (normalerweise „UTF8“) wählen. PHP - 4 - Für das Primärschlüssel-Feld (hier: "ID") den Typ "INT", unter "Index" den Eintrag "Primary" wählen und unter A_I die „Autoinkrementierung“ (= automatisches Hochzählen“) aktivieren. Will man verhindern, dass Felder leerbleiben, darf unter „Null“ das Häkchen nicht gesetzt sein (in diesem Fall erlaubt die Datenbank nicht, neue Datensätze einzufügen, ohne dass diesen Feldern (absichtlich oder irrtümlich) Werte zugewiesen wurden): 5) Mit Klick auf "Speichern" wird die Tabelle erstellt. Daten können nun eingegeben werden: Klick auf "Einfügen", danach in der rechten Spalte die gewünschten Werte eintippen (Achtung bei Datentyp „Float“: Komma = Punkt!) oder auf das Kästchen unter „Null“ klicken, um das Feld als „leer“ zu markieren (wenn dies beim Anlegen der Tabelle erlaubt wurde) und Klick auf "OK" (oder, um mehrere Datensätze einzufügen: in der Liste neben "und dann" statt "zurück" den Eintrag "anschließend einen weiteren Datensatz einfügen" wählen): Auf der darauffolgenden Seite findet man den neuen Datensatz (mit allen anderen) und kann ihn bei Bedarf ändern oder löschen: Die vorhandenen Datensätze. Mit Klick auf die entsprechenden Symbole ist „Bearbeiten“ und „Löschen“ möglich PHP - 5 - 6) Mit Klick auf „Anzeigen“ ganz oben kann man jederzeit alle Datensätze ansehen und über „Bearbeiten“ ändern, bzw. „Löschen“ entfernen. 7) Wenn man die Struktur der Tabelle ändern muss (z.B. neue Felder anlegen oder Länge von Textfeldern vergrößern, ...), kommt man mit Klick auf „Struktur“ (Übersichtsfenster ganz oben) zur Liste aller Felder dieser Tabelle und kann sie mit Klick auf das Bleistiftsymbol („Ändern“) bearbeiten. Neue Felder werden über die letzte Zeile eingefügt (ganz links Anzahl neue Felder, Klick auf Schalter „OK“). Will man doch nichts ändern, Klick auf „Anzeigen“ (ganz oben). 8) Weitere neue Tabellen hinzufügen: Klick um Übersichtsfenster links auf den Schalter „Erzeuge Tabelle“ und die Schritte ab Punkt 4) wiederholen Exportieren/Importieren „Exportieren“ bedeutet, eine Datenbank oder einzelne Tabellen auf einen anderen Rechner zu kopieren (z.B. als Sicherungskopie oder um mit ihr auf einem lokalen Server php-Skripte zu entwickeln und zu testen): a) Datenbank exportieren Im Startfenster des phpMyAdmin auf „Exportieren“ klicken und in der Liste die zu exportierende Datenbank auswählen. Klick auf „OK“ „Senden“ muss eingeschaltet sein, sonst wird die Datenbank nicht gespeichert Unter diesem Dateinamen wird die Datenbank im Download-Ordner gespeichert PHP - 6 - Im Download-Ordner wird daraufhin eine einzige Datei gespeichert (lautet ähnlich wie: __XY__.sql). Sie enthält alle notwendigen SQL-Befehle, um die Datenbank auf einem anderen Rechner wieder in den dort installierten phpMyAdmin zu importieren. b) Datenbank importieren Im Startfenster des phpMyAdmin auf den Schalter „Importieren“ klicken und die gewünschte „.sql“Datei auswählen (die zuvor - wie oben beschrieben - auf einem anderen Rechner exportiert wurde) Achtung! Wenn eine Datenbank mit demselben Namen schon existiert, wird der Import nicht ausgeführt. Stattdessen erscheint eine Fehlermeldung: Die vorhandene gleichnamige Datenbank muss zuerst entfernt werden: im Startfenster des phpMyAdmin auf den Schalter „Datenbanken“ klicken und die Datenbank auswählen, die entfernt werden muss. Anschließend auf den „Löschen“ - Schalter unterhalb der Liste klicken: PHP - 7 - c) Einzelne Tabellen exportieren Will man nicht eine ganze Datenbank, sondern nur einzelen Tabellen exportieren/importieren, muss zuerst die Datenbank ausgewählt werden, die dieses Tabellen enthält (im Startfenster des phpMyAdmin auf die gewünschte Datenbank klicken): Anschließend Klick auf die gewünschte Tabelle und Klick auf „Exportieren“ Schaltfläche „Exportieren“ „AUTO_INCREMENT-Wert hinzufügen“ abwählen, sonst wird eine neue Spalte mit Autoincrement-Werten (= normalerweise das Primärschlüsselfeld) in die Tabelle eingefügt, obwohl eine solche ja gewöhnlich schon vorhanden ist „Senden“ aktivieren, damit die Tabelle auch tatsächlich heruntergeladen wird Zwischen den Unterstrichen einen Dateinamen für die Download-Datei eintragen, falls gewünscht (sonst bekommt sie den wenig aussagekräftigen Namen „_TABLE_“) Klick auf „OK“, um den Download zu starten. Sicherstellen, dass „Speichern“ ausgewählt ist! „AUTO_INCREMENT-Wert“ ausschalten „Senden“ Dateiname der Download-Datei einschalten PHP - 8 - d) Tabellen importieren Um beschädigte Tabellen durch Sicherungskopien von einem anderen Rechner wiederherzustellen (oder, um auf einem anderen Rechner geänderte Tabellen auf den Server zu übertragen), müssen sie in die Datenbank importiert werden: Falls eine Tabelle mit dem gleichen Namen wie die zu importierende bereits vorhanden ist, muss sie leer sein (falls nicht, zuerst über „Operationen - Leeren“ alle Datensätze löschen). Falls eine Tabelle mit diesem Namen noch gar nicht vorhanden ist, die Datenbank auswählen, in die die neue eingefügt werden soll Auf den Schalter für Datei-Upload klicken und SQL-Datei auswählen. „Zeichenkodierung“ muss dieselbe sein, wie diejenige, die für den Download verwendet worden ist (normalerweise „utf8“). Sie hat nichts mit dem Zeichensatz zu tun, der innerhalb der Tabelle für Textfelder definiert wurde, sondern betrifft nur den Upload der Datei. Klick auf „OK“ Die vorhandene Tabelle enthält daraufhin alle Datensätze der heraufgeladenen Tabelle. Im Fehlerfall gibt´s eine rot hervorgehobene Meldung. Die folgende erscheint z.B., wenn die Tabelle, in die die Datensätze eingefügt werden sollten, nicht leer war (genauer: wenn sie einen Datensatz mit gleichem Primärschlüssel enthält): Mit php und Mysqli arbeiten 1) Verbindung herstellen Benötigt werden: Name des Webservers (standardmäßig "localhost"), Username (standardmäßig "root") und Passwort (falls vorhanden) für den Mysqli-Server. a) Verbindung mit dem Befehl "mysqli_connect" herstellen (erwartet Servername, Username und, falls vorhanden, Passwort). Sollte aus irgendeinem Grund kein Zugriff auf den Datenbankserver möglich sein, eine entsprechende Meldung (nach „or die“) ausgeben. Hängt man an diese Fehlermeldung „mysqli_error“, schreibt PHP noch ein paar zusätzliche Informationen zum Fehler dazu. Hat die Verbindung geklappt, merkt man sich in einer Variable (hier: „$link“) den Rückgabewert. Er wird für alle Datenbankzugriffe benötigt! PHP - 9 - b) Anschließend die Datenbank mit dem Befehl "mysqli_select_db" auswählen (erwartet als Parameter den Datenbanknamen). c) Zuletzt den Zeichensatz bestimmen, der für die Übertragung der Daten verwendet wird. Es genügt nämlich nicht, in der Datenbank (wie oben beschrieben) und im HTML-Dokument Unicode („utf8“) auszuwählen! Es muss zusätzlich - unmittelbar, nachdem die Verbindung zur Datenbank hergestellt wurde - „mysqli_set_charset“ aufgerufen werden. $server='localhost'; $user='root'; $passwort = ''; $link = mysqli_connect($server, $user, $passwort) or die('Keine Verbindung zum Datenbankserver " . mysqli_error($link)); $db='meineDatenbank'; // Datenbankname in Variable merken $rs = mysqli_select_db($link, $db); // Datenbank auswählen if (!$rs) // hat Datenbankauswahl geklappt? { echo 'Fehler bei Auswahl der Datenbank<br />'; // wenn nicht: Fehler melden } mysqli_set_charset($link, 'utf8'); // Zeichensatz Nach den Zugriffen auf die Datenbank (d.h. normalerweise am Ende der Seite) sollte man die Verbindung wieder beenden: mysql_close($link); // Verbindung zum Datenbankserver schließen 2) Abfrage ausführen SQL-Abfragestring in Anführungszeichen erstellen. Achtung: sowohl Mysqli als auch PHP verlangen Semikolon als Abschluss der Anweisung! "mysqli_query" führt die Abfrage aus (erwartet als Parameter Verbindung und SQL-String), das Ergebnis befindet sich im Rückgabewert, den die Funktion liefert: $sql = 'SELECT * FROM tblKunden;'; $erg = mysqli_query($link, $sql); Mysqli erwartet Strings in Anführungszeichen, Zahlen ohne. Achtung! Da SQL-String selbst in Anführungszeichen zu setzen ist, müssen für Strings innen andere Anführungszeichen gewählt werden (im folgenden Beispiel: außen einfache, innen doppelte Anführungszeichen): $sql='SELECT * FROM tblKunden WHERE nName = "Müller" AND Alter > 10;'; Nach Auswertung des Abfrageergebnisses sollte der dafür reservierte Speicher mit "myqli_free_result" freigegeben werden (erwartet als Parameter die Variable mit dem Abfrageergebnis). Da eine Abfrage auch fehlschlagen kann (in diesem Fall enthält $erg nur den Wert „false“), muss die Variable zuvor auf Gültigkeit überprüft werden (sonst erzeugt mysqli_free_result eine Fehlermeldung): if($erg) mysqli_free_result($erg); 3) Abfrageergebnis anzeigen Das Abfrageergebnis muss mit "mysql_fetch_array" weiterverarbeitet werden. Diese Funktion liest einen Datensatz aus und erzeugt ein Array, das alle Felder enthält, die die Abfrage geliefert hat (d.h. nicht unbedingt alle Felder, die in der Datenbank selbst vorhanden sind!). Der erste Aufruf liefert den ers- PHP - 10 - ten Datensatz, der zweite den zweiten, etc. Nach dem letzten Datensatz liefert die Funktion den Wert "false". Somit können in einer while-Schleife alle Datensätze ausgelesen werden. Als Parameter wird eine Variable erwartet, die das Abfrageergebnis enthält (hier: "$erg"). Der (optionale) Parameter "MYSQLI_ASSOC" erlaubt den Zugriff auf das Array mit den Namen der Felder (in Anführungszeichen!) statt numerischem Index: while($zeile=mysqli_fetch_array($erg,MYSQLI_ASSOC)) { echo ' Name: ' . $zeile['vName'] . ' ' . $zeile['nName'] . '<br />'; } Nach jeder neuen Abfrage (d.h. nach jedem Aufruf von mysql_query) wird der interne "Datensatzzeiger" auf 0 zurückgesetzt. Ein folgender Aufruf von mysqli_fetch_array begint daher wieder mit dem ersten Datensatz. Bei Bedarf kann der Datensatzzeiger allerdings auch mit der Funktion mysqli_data_seek auf einen beliebigen Datensatz gesetzt werden (erwartet als Parameter die Variable mit dem Abfrageergebnis und die gewünschte Datensatznummer). Ein darauffolgender Aufruf von "mysqli_fetch_array" wird den angegebenen Datensatz (im folgenden Beispiel: Nr.10) auslesen: mysqli_data_seek($erg,10); $Zeile=mysqli_fetch_array($erg,MYSQLI_ASSOC) Achtung! „mysqli_query“ liefert als Rückgabewert (in unserem Beispiel in der Variable $erg gespeichert) ein Objekt (eine sog. „resource“), das auch dann gültig ist (if($erg) liefert „true“), wenn gar kein Datensatz gefunden wurde! Es enthält den Wert „false“ nur, wenn die Abfrage selbst misslungen ist, z.B. bei falschen Feldnamen oder Syntaxfehlern im SQL-String. Erst der Aufruf von „mysqli_fetch_array“ versucht, einen Datensatz aus diesem Objekt herauszuholen und liefert „false“, falls es keinen Datensatz enthält. Daher nach SELECT - Abfragen immer beide mysqli-Funktionen gemeinsam verwenden: $erg = mysqli_query($link, $sql); // Abfrage ausführen if($erg) // Abfrage gelungen? { $zeile = mysqli_fetch_array($erg,MYSQLI_ASSOC); // Datensatz auslesen if($zeile) // Datensatz vorhanden? { ... // mit dem Datensatz arbeiten } // else: $zeile = „false“, daher kein Datensatz vorhanden } // else: $erg = „false“, daher konnte die Abfrage gar nicht durchgeführt werden Möchte man mehr über die Art des Fehlers wissen, kann „mysqli_query“ mit OR DIE ergänzt werden: $erg = mysqli_query($link, $sql) OR DIE('Fehler: ' .mysqli_error()); 4) Datensätze in einer Tabelle ausgeben Es sieht natürlich besser aus, wenn die Datensätze in einer Tabelle angezeigt werden. Der Zugriff auf die Datenbank erfolgt in gleicher Weise wie oben beschrieben, lediglich HTML-Tags/-Attribute und gewünschte CSS-Klassen sind hinzuzufügen (Achtung auf unterschiedliche Anführungszeichen): echo '<tr class="kunden"><td>' . $zeile['vName'] '</td><td>' . $zeile['Adresse'] . '</td></tr>'; . ' ' . $Zeile['nName'] . 5) Anzahl der Datensätze ermitteln Nach einer Abfrage mit „mysqli_query” liefert mysqli_num_rows die Anzahl der gefundenen Datensätze. Parameter ist die Variable mit dem Abfrageergebnis: PHP - 11 $erg = mysqli_query($link, $sql); $anz = mysqli_num_rows($erg); 6) Datensätze einfügen Der SQL-Befehl "INSERT INTO" erwartet den Name der Tabelle, dahinter in Klammern die Felder, die beschrieben werden sollen (Primärschlüsselfeld wird von der Datenbank automatisch eingefügt), zuletzt die Werte selbst (hier: eine Zahl für das Feld „Abteilung“ und ein String für das Feld „Name“). Achtung! Textvariablen sind in Anführungszeichen zusetzen. Außerdem ist zu beachten, dass Strings innerhalb des SQL-Strings natürlich eigene Anführungszeichen benötigen (im folgenden Beispiel: doppelte innerhalb des SQL-Strings): $text = 'Müller'; $zahl = 1; $sql='INSERT INTO tblKunden (Abteilung,Name) VALUES(' . $zahl . ',"' . $txtName . '");'; $erg = mysqli_query($link, $sql); Der Rückgabewert (hier in $erg gespeichert) liefert „true“, wenn der Datensatz erfolgreich eingefügt werden konnte, oder „false“. PHP-Variablen können zwar auch direkt in den SQL-String eingebaut werden (man erspart sich die etwas unübersichtliche Verwendung des UND-Operators). Aber in diesem Fall müssen außen doppelte, innen einfache Anführungszeichen gesetzt werden! Das wiederum ist nicht möglich, wenn HTML erzeugt werden soll (weil HTML auf jeden Fall doppelte Anführungszeichen erwartet). $sql="INSERT INTO tblKunden (Abteilung,Name) VALUES($zahl,'$text');"; Um herauszufinden, welche ID dem neuen Datensatz von mysqli zugewiesen wurde, verwendet man die Funktion mysqli_insert_id(). In Klammern die Verbindungsvariable ($link) angeben. Diese Funktion gilt für den letzten INSERT-Befehl. $neueID = mysqli_insert_id(); 7) Datensätze löschen Der SQL-Befehl "DELETE FROM" erwartet den Tabellennamen und nach WHERE eine Bedingung, die angibt, welche Datensätze gelöscht werden sollen (lässt man sie weg, wird die gesamte Tabelle geleert!) $id=5; $sql='DELETE FROM tblKunden WHERE ID = ' . $id . ';'; $erg=mysqli_query($link, $sql); Der Rückgabewert (hier in $erg gespeichert) liefert „true“, wenn der Datensatz erfolgreich gelöscht werden konnte, oder „false“. 8) Datensätze ändern Der SQL-Befehl UPDATE erwartet den Tabellennamen und nach "SET" das zu ändernde Feld sowie den neuen Wert, der in das Feld einzutragen ist (zuletzt, wie üblich, die Bedingung): $id=5; $sql = 'UPDATE tblKunden SET Name="Mayer" WHERE ID = ' . $id . ';'; $erg = mysqli_query($link, $sql); Mehrere Felder durch Komma trennen: $sql='UPDATE tblKunden SET Name="Mayer",Ort="Eisenstadt" WHERE ID = ' . $id . ';'; PHP - 12 - Der Rückgabewert (hier in $res gespeichert) liefert „true“, wenn der Datensatz erfolgreich geändert werden konnte, oder „false“. Formulare 1) Allgemein Formulare beginnen in HTML mit <form> und enden mit </form>. Als Attribute werden Name des Formulars, die Art der Übermittlung ("POST" oder "GET") und der Name der Datei erwartet, die die Formulareingaben weiterverarbeitet: <form name="f1" method="post" action="f1.php"> ... </form> Aus optischen Gründen setzt man Formularfelder üblicherweise in eine Tabelle. Achtung! der <table> Tag liegt innerhalb des <form> - Tags: <form name="f1" method="post" action="f1.php"> <table> ... </table> </form> 2) Textfelder Der vielseitige <input> - Tag kann ganz unterschiedliche Elemente repräsentieren. Entscheidend ist das Attribut "type": type = "text" bezeichnet ein einfaches Eingabefeld, in "value" kann das Eingabefeld mit einem beliebigen String initialisiert werden, "size" gibt die Länge in Zeichen an. <input> hat kein Ende-Tag: <input type="text" name="txtEingabe" id="txtEingabe" size="24" value="ihr Name bitte" /> Als Beschriftung kann der <Label> - Tag verwendet werden (die ID des input-Elements angeben): <label for="txtEingabe">Benutzername: </label> 3) Mehrzeiliger Text Für lange, mehrzeilige Texte gibt´s den „textarea“ - Tag. Breite wird mit „cols“ angegeben (= Anzahl Spalten), die Höhe mit "rows" (= Anzahl Zeilen). Im Unterschied zu "input" verlangt "textarea" ein Ende-Tag (alles dazwischen erscheint auf dem Bildschirm): <textarea name="eingabe" id="eingabe" cols="60" rows="4"> ... hier der sichtbare Text ...</textarea> 4) Buttons Damit Formulare überhaupt sinnvoll weiterverarbeitet werden können, benötigen sie einen Schalter, der sie abschickt. <input type = "submit"> erzeugt einen "Senden" -Button, <input type="reset"> erzeugt einen "Wiederherstellen"-Button, der die eingegeben Werte löscht (Formular wird nicht abgeschickt, bleibt sichtbar für Neueingabe). "value" erlaubt die Beschriftung der Buttons (Browser beschriften ansonsten nach eigenem Gutdünken): PHP - 13 - Es können mehrere "submit" - Buttons im Formular platziert werden. Nur der Name desjenigen Buttons, der das Abschicken ausgelöst hat, wird mitgeschickt: <input type="submit" name="bAnzeigen" id="bAnzeigen" value="Anzeigen" /> <input type="submit" name="bNeu" id="bAnzeigen" value="Neuer Datensatz" /> In der verarbeitenden Seite kann dieser Name abgefragt und entsprechend unterschiedlich reagiert werden: if($bAnzeigen) datensatzAnzeigen(); // Button “Anzeigen” angeklickt? else if($bNeu) neuerDatensatz(); // andernfalls Button “Neuer Datensatz” angeklickt 5) Checkbox <input type="checkbox" name="cbAgb" id="cbAgb" value="" /> "Value" ist ein beliebiger Wert, der für die interne Weiterverarbeitung genutzt werden kann, für die eigentlich Frage (ob die Checkbox selektiert wurde) aber nicht benötigt wird. Die Variable ("$cbAgp") existiert nämlich in PHP nur, wenn sie auch selektiert wurde: if(isset($cbAgb)). 6) Auswahlliste <select name="cbAuswahl" id="cbAuswahl" size="1"> <option>1.Auswahl</option> <option>2.Auswahl</option> </select> Das Attribut "size" gibt die Anzahl der sichtbaren Einträge an (eine aufklappbare Liste erscheint nur, wenn size = "1", ansonsten sieht man eine offene Liste mit "size" Anzahl Einträgen und ev. Scrollbalken). Abfrage in PHP: die entsprechende Variable (= Name der Liste) enthält den Inhalt des ausgewählten Eintrags (= den Text zwischen <option> und </option>): if($cbAuswahl != '') $eintrag = $cbAuswahl; Möchte man andere Daten als den Text übergeben, setzt man das Attribut "value" entsprechend: <option value = "10">1.Auswahl</option> 7) Übergabe von Formular-Daten an die verarbeitende php-Datei Nach Klick auf einen „Senden“-Button (<input type = "submit">) wird diejenige Datei aufgerufen, die wir im <form> - Tag hinter dem Attribut „action“ angegeben haben (in unserem Beispiel <form name="f1" method="post" action="f1.php"> - s.S.12). Damit wir in dieser Datei die Inhalte der Formularfelder verarbeiten können, verschaffen wir uns mit „$_POST['...']“ Zugriff auf diese Felder. In der eckigen Klammer in Anführungszeichen sind der Name, der dem Formularfeld gegeben wurde (mit dem Attribut „name=...“) anzugeben. Im folgenden Beispiel lesen wir den Inhalt des InputFeldes „txtEingabe“ (s.S. 12) aus und merken ihn uns in einer Variable „$eingabe“: $eingabe = $_POST['txtEingabe']; Häufig muss überprüft werden, ob ein Feld leer geblieben ist (wenn z.B. der Anwender keinen Benutzernamen in einem Anmeldeformular eingeben hat). In diesem Fall wird ein Leerstring (= zwei Anführungszeichen ohn Inhalt) übertragen: PHP - 14 if($_POST[txtEingabe] != "") // Leerstring? { ... // nur dann weiterverarbeiten } else echo 'Bitte Benutzernamen eingeben'; // andernfalls für Fehlermeldung sorgen 8) Sprung zu bestimmter Datei Wenn man nach Abarbeitung des Formulars zu einer bestimmten Datei springen will (ohne dass der Anwender erst auf einen Link klicken muss), schreibt man am besten eine entspechende JavascriptAnweisung (window.location.href = ...) und fügt sie mit dem "echo" Befehl in die Seite ein (Achtung auf die äußeren und inneren Anführungszeichen): echo '<script language="javascript">window.location.href = "index.php";</script>'; In ähnlicher Weise sind einfache Sprünge zurück möglich (Javascript-Anweisung "history.back" erwartet die Anzahl der Seiten, die zurückgesprungen werden soll): echo '<script language="javascript">history.back(1);</script>'; 9) Nachrichten in einem Link mitsenden Häufig (speziell nach Fehlern) ist es nötig, nicht nur zu einer bestimmten Datei zu springen, sondern auch Meldungen mitzuschicken. Ans Ende des Links wird, durch Fragezeichen getrennt, der Name der Meldung und der Wert (String oder Zahl) angehängt. Achtung! Beide (auch Strings!) ohne Anführungszeichen. Mehrere Variablen durch "&" voneinander trennen. Sonderzeichen und auch Leerzeichen sind nicht erlaubt: echo '<a href="index.php?msg1=diesIstEinText&msg2=10"></a>'; Der folgende Link dagegen funktioniert wegen der Leerzeichen vor und nach dem "=" nicht: echo '<a href="index.php?msg1 = diesIstEinText&msg2=10"></a>'; // funktioniert nicht! In genau der gleichen Weise können Meldungen auch an die entsprechende Javascript-Anweisung angehängt werden: echo '<script language="javascript">window.location.href = "index.php?msg1=diesIstEinText&msg2=10";</script>'; Da an Links angehängte Meldungen immer mit der Methode „get“ übertragen werden, kann die Meldung mit $_GET[' ... '] wie eine Variable gelesen und verwendet werden (in eckiger Klammer zwischen den Anführungszeichen den Namen der Meldung (msg1, msg2, ...) schreiben): if($_GET['msg1'] == 'diesIstEinText') ... ; // Strings mit Anführungszeichen if($_GET['msg2'] == 10) ... ; // Zahlen ohne Anführungszeichen 10) Buttons mit individueller Aktion Standardmäßig gibt es nur den „Submit“- und „Reset“-Button. Sollen Buttons eigene Aktionen auslösen, muss das Click-Event mit Javascript abgefangen werden. Im folgenden Beispiel soll das Formular einen „Abbrechen“ - Button enthalten, mit dem man das Formular verlassen und zur Index-Seite springen kann. Zuerst einen <script>-Bereich mit der Javascript-Funktion anlegen. Anschließend einen Button (<input>) ins Formular einfügen und dessen Klick-Ereignis mit „onClick“ auf die Javascript-Funktion umleiten: PHP - 15 <script language=javascript> function abbrechen() { window.location.href = "index.php"; } </script> ... <form ...> <input type="reset" name="reset" value="Abbrechen" onClick="abbrechen()"/> </form> 11) Checkboxes in Datensatzliste Wenn wir dem Anwender die Möglichkeit geben wollen, in einer Datensatzliste mit Hilfe von Checkboxes (HTML-Tab „<input type="checkbox">) beliebige auszuwählen (um sie z.B. anschließend zu löschen), stehen wir vor dem Problem, wie die einzelnen Checkboxes voneinander unterschieden und dem jeweiligen Datensatz zugeordnet werden können. Wie oben beschrieben werden Datensätze normalerweise in einer Schleife ausgegeben. Der Name, den wir im HTML-Bereich den Checkboxes geben, ist für alle identisch, wobei die für Arrays üblichen eckigen Klammern angehängt werden (name="cb[]"). HTML stört das nicht – im Browser wird alles korrekt ausgegeben. Für PHP dagegen bedeuten sie, dass dieses Element als Array zu interpretieren ist. Die Unterscheidung der einzelnen Checkboxes erfolgt durch das Attribut „value“, das wir mit dem Primärschlüssel des Datensatzes füllen (holen wir uns aus dem Feld "ID" des Datensatzes, der in der Schleife gerade gelesen wird): echo '<tr class="kunden"> <td><input type="checkbox" name="cb[]" value="' . $Zeile['ID'] . '"></td> <td>' . $Zeile['VName'] . ' ' . $Zeile['NName'] . '</td> <td>' . $Zeile['Adresse'] . '</td></tr>'; Wird ein solches Formular gesendet, schreibt HTML nur die selektierten Checkboxes in das Array – wir müssen in der weiterverarbeitenden PHP-Seite nicht mehr überprüfen, ob sie selektiert sind oder nicht. Wie üblich holen wir uns das Array mit „$_POST['cb']“. Hier zwei Möglichkeiten, wie die selektierten Datensätze gelöscht werden könnten. Dabei wird eine foreach-Schleife verwendet, die zwei Parameter verlangt: den Namen des Arrays (hier: "$cb") und eine Hilfsvariable (hier: "$element"), in die der Inhalt des aktuellen Elements des Arrays eingetragen wird (gegenüber "for" erspart man sich damit den Schleifenzähler): 1) Methode a (wiederholter Zugriff auf die Datenbank): in einer Schleife rufen wir für jeden selektierten Datensatz den SQL-Befehl DELETE auf und übergeben der WHERE – Bedingung die ID des aktuellen Datensatzes: foreach($_POST['cb'] as $element) { $sql='DELETE FROM benutzer WHERE ID = ' . $element . ';'; $res=mysqli_query($link, $sql); } 2) Methode b (einmaliger Zugriff auf die Datenbank): zuerst in einer Schleife eine durch Kommata getrennte Liste in einen String (hier: $werte) schreiben, diesen anschließend mit dem IN-Operator in den SQL-String einbauen (achte auf die Anführungszeichen): $liste=""; // Leerstring für die Liste foreach($_POST['cb'] as $element) { if($liste == "") $liste = $element; // Liste noch leer? Dann erstes Element hinein else $liste .= ',' . $element; // nächstes Element, durch Komma getrennt, an die Liste anhängen } PHP - 16 $sql='DELETE FROM benutzer WHERE ID IN (' . $liste . ');'; $res=mysqli_query($link,$sql); Währung Für Währungen ist in Mysql-Datenbanken der Felddatentyp "Decimal" geeignet, da er keine Rundungsfehler kennt (die z.B. bei "Float" auftreten würden). In der Datenbankstruktur neben „Länge“ die Vor- und Nachkommastellen angeben (durch Beistrich getrennt!). Bei der Eingabe von Datensätzen in diesem Feld dagegen als Dezimaltrennzeichen den Punkt verwenden! Datum und Uhrzeit 1) PHP - Timestamp Die aktuelle Zeit (sog. "Timestamp") wird mit der Funktion time() gesetzt. Sie enthält die Anzahl Sekunden seit dem 1.1.1970 (sog. "UNIX - Timestamp"). Mit der Funktion "date()" wird daraus wieder ein für uns lesbarer Text: $aktZeit = time(); // erzeugt einen Timestamp des momentanen Zeitpunkts (in Sekunden seit 1970) $ausgabe = date("d.m.Y - H:i:s",$aktZeit); // ergibt z.B.: 02.04.2009 - 13:09:24 In Klammern wird ein String (Anführungszeichen!) erwartet, der die Fornatierung des Datums bestimmt: d m Y H i s = = = = = = Tag (01 - 31) Monat (01 -12) Jahr (vierstellig) Stunde (00 - 23) Minuten (00 - 59) Sekunden (00 - 59) Die Zeichen zwischen diesen Buchstaben ("." und ":") werden unverändert ausgegeben. Als zweiten Parameter verlangt die Funktion einen UNIX-Timestamp. 2) MySql Timestamp nach PHP konvertieren In MySQL gibt es zwar auch ein "Timestamp" genanntes Datumsformat, das aber ganz anders aufgebaut ist (nämlich als String: YYYY-MM-DD HH:MM:SS, z.B. 2010-12-25 13:43:15), es muss daher mit strtotime in das von PHP verwendetet Format konvertiert werden: while($Zeile=mysqli_fetch_array($RS,MYSQLI_ASSOC)) { $datum = date("d.m.Y",strtotime($Zeile['datumEingabe'])); .... 3) PHP - Datum nach MySQL konvertieren Umgekehrt ist ebenfalls eine Umwandlung notwendig, bevor ein im PHP-Format vorliegendes Datum in eine MySQL-Datenbank geschrieben werden kann. Zum Glück besitzt MySQL selbst den passenden Be- PHP - 17 - fehl (Beispiel: in der Variable $geburtsdatum steht ein Datum im PHP-Format, das in die MySQLTabelle tblBenutzer geschrieben werden soll): $sql = 'INSERT INTO tbla (datum) VALUES(' . FROM_UNIXTIME(' . $datum . '));'; 4) Texteingabe in PHP - Datum umwandeln Manchmal muss ein Datum aus einem Eingabefeld eines Formulars in eine Datenbank übernommen werden. In diesem Fall die Eingabe (= String!) zuerst mit time() in einen PHP-Timestamp und erst danach ins MySQL-Formut konvertieren: $sql = 'INSERT INTO tbla (datum) VALUES(' . FROM_UNIXTIME(' . time($datum) . '));'; Wenn uns dabei ein Fehler unterläuft, liefert MySQL beim nächsten Auslesen des Datums den Wert "1.1.1970" - weil die Datenbank Datumswerte automatisch auf "0" setzt, wenn sie diese nicht als korrektes Datum interpretieren kann (und 0 entspricht, wie oben erwähnt, dem 1.1.1970). 5) NULL - Wert in MySql Datumsfeld Dieses fehlerhafte Datum bekommen wir übrigens auch, wenn wir versuchen einen "NULL"-Wert aus einem Datumsfeld mit den oben genannten Funktionen in PHP auszugeben. Man sollte daher auf NULL prüfen: if(is_null($Zeile['datumEingabe'])) echo '-'; else echo date("d.m.Y",strtotime($Zeile['datumEingabe'])); Sessions 1) Einführung Um Daten von einer Seite zur anderen weiterzureichen, gibt es drei Methoden. Eine kennen wir bereits (an einen Link anhängen), eine zweite arbeitet mit versteckten Formularfeldern (<input type = "hidden" name="versteckt" value="10">), die Daten im "value" – Attribut speichern und in der aufgerufenene php-Seite wie jede Variable auszulesen sind ($wert = $_POST['versteckt']). Für sensible Daten wie Passwörter sind beide Methoden denkbar ungeeignet, weil sie im Browser von jedem mitgelesen werden können. Genau für diesen Zweck gibt es das Session-Objekt ("$_SESSION"), das nicht in der HTML-Datei, sondern auf dem Server gespeichert wird. Der User lässt sich über ein Cookie identifizieren, das beim Erzeugen einer neuen Session automatisch angelegt (und spätestens mit dem Schließen des Browsers gelöscht) wird. 2) "session_start" Beim Session-Objekt handelt es sich um ein Array, das mit beliebigen Werten gefüllt werden kann. Der Befehl session_start erzeugt eine neue Session, bzw. "aktiviert" die darin gespeicherten Daten (d.h. erlaubt den Zugriff darauf), falls sie bereits (auf einer anderen Seite) angelegt worden ist. Achtung! Dieser Befehl muss die erste Anweisung auf der Seite sein (noch vor irgendeiner HTMLAnweisung): <?php session_start(); <!DOCTYPE html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ... PHP - 18 - Danach steht das Array $_SESSION zur Verfügung und kann mit beliebigen Werte beschrieben werden. Als Index setzt man frei wählbare (möglichst aussagekräftige) Strings ein (beachte Anführungszeichen): $_SESSION['benutzerName']='Mayer'; Ausgelesen werden sie ebenfalls mit diesem Index: $benName=$_SESSION['benutzerName']; Jeder neue Index erzeugt automatisch ein neues Feld im Array: S_SESSION['wasNeues'] = 12345; Eine einzelne Session-Variable kann mit unset() für ungültig erklärt werden: unset($_SESSION['abc']); Die Session ist beendet, sobald ihre Inhalte geleert (session_unset) und sie selbst zerstört (session_destroy) wurde: session_start(); // notwendig, um auf SESSION-Array zugreifen zu können session_unset(); // Inhalte entfernen session_destroy(); // Session selbst entfernen 3) Anwendungsbeispiel: Login In einem Loginformular soll der Anwender Benutzername und Passwort eingeben. Sind beide korrekt, schreiben wir sie zusammen mit der ID des Datensatzes ins Session-Objekt. Das Formular enthält zwei Textfelder (mit Label) und die üblichen zwei Buttons (natürlich müssten die Eingaben vorher überprüft werden – der Übersichtlichkeit wegen hier nur das Gerüst ohne Sicherheitsabfragen): <form id="frmLogin" name="frmLogin" method="post" action="doLogin.php"> <table><tr><td colspan="2"><h2>Anmeldung</h2></td></tr> <tr><td><label for="txtName">Benutzername</label></td> <td><input type="text" name="txtBenName" id="txtBenName" size="24" maxlength="24" /></td> <tr><td><label for="txtPassw">Passwort</label></td> <td><input type="text" name="txtPassw" id="txtPassw" size="24" maxlength="24" /></td> <tr><td colspan="2"><input type="submit" name="Submit" value="Senden" /> <input type="reset" name="reset" /></tr> </table></form> In der weiterverarbeitenden PHP-Datei ("doLogin.php") überprüfen wir, ob die Eingabefelder leer sind, und schreiben die darin enthaltenen Werte (Zugriff mit den Namen, die wir den Textfeldern gegeben haben: txtName und txtPassw) in einen SQL-String, um in der Datenbank nachzusehen, ob sie existieren (in unserem Beispiel setzen wir eine Datenbank voraus, die die drei Felder "ID", "BenName" und "Passw" enthält). Nicht vergessen, zuerst die Funktionen "session_start" (damit wir eine Session anlegen können) aufzurufen: PHP - 19 session_start(); ... (Verbindung zum Server herstellen, Datenbank auswählen, etc. s.S.8) if($_POST['txtBenName'] != "") // wurde Benutzername eingegeben? { if($_POST['txtPassw'] != "") // wurde Passwort eingegeben? { $sql = 'SELECT * FROM benutzer WHERE BenName="' . $_POST[txtBenName] . '" AND Passw = "' . $_POST[txtPassw] . '";'; // stimmen Benutzername und Passwort? $erg = mysqli_query($link,$sql); // Abfrage ausführen und Rückgabewert merken (true oder false) Im Rückgabewert $erg befinden sich alle gefundenen Datensätze. Wie üblich muss mit „mysqli_fetch_array“ der eigentliche Datensatz ausgelesen werden, bevor ein Zugriff auf dessen Felder möglich ist ("ID", "BenName" und "Passw"): if($erg) // konnte Abfrage ausgeführt werden? { $zeile=mysql_fetch_array($erg); // Datensatz auslesen, falls vorhanden if($zeile) // wurde ein passender Datensatz gefunden? { // wenn ja: Datensatz auslesen Die drei Felder des Datensatzes können jetzt endlich, wenn die Abfrage erfolgreich war, in das Session-Objekt geschrieben werden: $_SESSION['benutzerName']=$zeile['BenName']; $_SESSION['benutzerPassw']=$zeile['Passw']; $_SESSION['benutzerID']=$zeile['ID']; } // else: kein passender Datensatz gefunden → falsches Passwort oder falscher Benutzername } // else: irgendein Fehler ist schon bei der Ausführung der Abfrage passiert Die drei "if"-Anweisungen, die wir in diesem Beispiel verwendet haben, sind wie geschaffen für "else"-Zweige, in denen über Javascript mit angehängter Nachricht (s.o. S.14) zum Formular zurückgesprungen werden kann, um dort passende Fehlermeldungen auszugeben (aus Gründen der Übersichtlichkeit haben wir oben im Quelltext des Formulars (S.18) auf die Auswertung dieser Nachrichten verzichtet): } else echo '<script language="javascript">window.location.href = "frmLogin.php?msg=falscheEingaben";</script>'; } else echo '<script language="javascript">window.location.href = "frmLogin.php?msg=passwFehlt";</script>'; } else echo '<script language=javascript>window.location.href = "frmLogin.php?msg=benNameFehlt";</script>'; Nach erfolgreicher Anmeldung stehen die Anmeldedaten im Session-Objekt und können auf jeder Seite, die nur für angemeldete User zugänglich sein soll, abgefragt werden: if(isset($_SESSION['benutzerID'])) { echo 'Willkommen, ' . $_SESSION['benutzerName']; ... }