PHP und MYSQL

Werbung
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'];
...
}
Herunterladen