Inhalt:

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 ("pyramiden.php") ................................................................................................................. 3
3) "fuss.inc.php" ...................................................................................................................................................................... 3
PHP und MYSQL ......................................................................................................................................................... 3
MYSQL-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 Mysql 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 .......................................................................................................................................................... 10
7) Datensätze löschen ............................................................................................................................................................ 11
8) Datensätze ändern ............................................................................................................................................................. 11
Formulare ..................................................................................................................................................................11
1) Allgemein.......................................................................................................................................................................... 11
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 .............................................................................................................................................. 13
9) Nachrichten in einem Link mitsenden .............................................................................................................................. 14
10) Buttons mit individueller Aktion ...................................................................................................................................... 14
11) Checkboxes in Datensatzliste ............................................................................................................................................ 14
Währung ....................................................................................................................................................................15
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 ......................................................................................................................... 16
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 C#, mit einem Semikolon abgeschlossen werden. Dateien, die PHP-Skripts enthalten, müssen mit der Erweiterung ".php" abgespeichert werden. Kommentare beginnen wie in C# mit "//" und gelten bie 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>';
Strings verbinden
Strings können mithilfe des Punkt -Operators (".") mit Variablen verbunden werden. Achtung! Vergisst
man das $-Zeichen vor der Variablen, wird nicht der Inhalt sondern der Name der Variablen 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.):
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>
<body>
<div class="header"><img src="bilder/logo.jpg" /></div>
PHP - 3 <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>
2) die eigentliche HTML-Seite ("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>
Achtung! "charset" - Attribute im <head>-Bereich werden zwar korrekt
übernommen, aber im Dreamweaver muss die automatische Codierung
beim Öffnen der Seiten ausgeschaltet sein, sonst werden Sonderzeichen
nicht richtig dargestellt (falls die Codierung in "kopf.inc.php" nicht mit
der Standard-Codierung für neue Seiten übereinstimmt): zu finden im
Menü "Bearbeiten - Einstellungen - Neues Dokument".
PHP und MYSQL
MYSQL-Datenbank mit "phpMyAdmin" anlegen
1) Apache und Mysql-Server im XAMPP-Control Panel starten. Im Browser 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 importierene bereits vorhanden ist, muss sie
leer sein (falls nicht, zuerst über den Schalter „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 Mysql arbeiten
1) Verbindung herstellen
Benötigt werden: Name des Webservers (standardmäßig "localhost"), Username (standardmäßig
"root") und Passwort (falls vorhanden) für den Mysql-Server. Verbindung mit dem Befehl
"mysql_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. Anschließend die Datenbank mit dem Befehl "mysql_select_db" auswählen (erwartet als Parameter den Datenbanknamen). 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 - „mysql_set_charset“ aufgerufen werden.
PHP - 9 $server='localhost';
$user='root';
$db='meineDatenbank'; // Datenbankname
$conn=mysql_connect($server,$user) or die ('Keine Datenbankverbindung möglich');
mysql_select_db($db);
mysql_set_charset('utf8',$conn); // Codierung für die Datenübertragung festlegen
Nach dem Zugriff sollte man die Verbindung wieder beenden:
mysql_close($conn); // Verbindung zum Datenbankserver schließen
2) Abfrage ausführen
SQL-Abfragestring in Anführungszeichen erstellen. Achtung: sowohl Mysql als auch PHP verlangen
Semikolon als Abschluss der Anweisung! "mysql_query" führt die Abfrage aus (erwartet SQL-String
und Verbindung als Parameter), das Ergebnis befindet sich im Rückgabewert, den die Funktion liefert:
$sql='SELECT * FROM tblKunden;';
$erg=mysql_query($sql,$conn);
Mysql erwartet Strings in Anführungszeichen, Zahlen ohne. Achtung! Da SQL-String selbst in Anführungszeichen zu setzen ist, müssen für Strings innerhalb 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 "myql_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 mysql_free_result eine Fehlermeldung):
if($erg) mysql_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 ersten 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
"MYSQL_ASSOC" erlaubt den Zugriff auf das Array mit den Namen der Felder (in Anführungszeichen!)
statt numerischem Index:
while($Zeile=mysql_fetch_array($erg,MYSQL_ASS
OC))
{
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
mysql_fetch_array begint daher wieder mit dem ersten Datensatz. Bei Bedarf kann der Datensatzzeiger allerdings auch mit der Funktion mysql_data_seek
PHP - 10 -
auf einen beliebigen Datensatz gesetzt werden (erwartet als Parameter die Variable mit dem
Abfrageergebnis und die gewünschte Datensatznummer). Ein darauffolgender Aufruf von
"mysql_fetch_array" wird den angegebenen Datensatz (im folgenden Beispiel: Nr.10) auslesen:
mysql_data_seek($erg,10);
$Zeile=mysql_fetch_array($erg,MYSQL_ASSOC)
Achtung! „mysql_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
„mysql_fetch_array“ versucht, einen Datensatz aus diesem Objekt herauszuholen und liefert „false“,
falls es keinen Datensatz enthält. Daher nach SELECT - Abfragen immer beide mysql-Funktionen gemeinsam verwenden:
$erg = mysql_query($sql,$conn); // Abfrage ausführen
if($erg) // Abfrage gelungen?
{
$zeile = mysql_fetch_array($erg,MYSQL_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 „mysql_query“ mit OR DIE ergänzt werden:
$erg = mysql_query($sql,$conn) OR DIE('Fehler: ' .mysql_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 „mysql_query” liefert mysql_num_rows die Anzahl der gefundenen
Datensätze. Parameter = die Variable mit dem Abfrageergebnis:
$erg = mysql_query($sql,$conn);
$anz = mysql_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 . ',"' . $text . '");';
PHP - 11 $erg = mysql_query($sql,$conn);
Der Rückgabewert (hier in $erg gespeichert) liefert „true“, wenn der Datensatz erfolgreich eingefügt
werden konnte, oder „false“
PHP-Variablen können 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!
$sql="INSERT INTO tblKunden (Abteilung,Name) VALUES($zahl,'$text');";
Um herauszufinden, welche ID dem neuen Datensatz von mysql zugewiesen wurde, verwendet man die
Funktion mysql_insert_id(). In Klammern die Verbindungsvariable ($conn) angeben. Diese
Funktion gilt für den letzten INSERT-Befehl.
$neueID = mysql_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=mysql_query($sql,$conn);
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 . ';';
$res=mysql_query($sql,$conn);
Mehrere Felder durch Komma trennen:
$sql='UPDATE tblKunden SET Name="Mayer",Ort="Eisenstadt" WHERE ID = ' . $id . ';';
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>
PHP - 12 -
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="eingabe" size="24" value="ihr Name bitte" />
Als Beschriftung kann der <Label> - Tag verwendet werden:
<label>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:
<form name="f1" method="post" action="f1.php">
<textarea name="eingabe" cols="60" rows="4"></textarea>
<input name="bSend" type="submit" value="Senden" />
<input name="bReset" type="reset" Value="Abbrechen" />
</form>
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):
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" value="Anzeigen" />
<input type="submit" name="bNeu" 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
PHP - 13 -
5) Checkbox
<input type="checkbox" name="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" 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
Die Anweisung import_request_variables ermöglicht den Zugriff auf die Formulardaten in der
verarbeitenden php-Datei, nachdem das Formular abgeschickt wurde. Als Parameter wird der
Übertragungsmodus erwartet ("p" für "post" bzw. "g" für "get"). Die im Formular vergebenen Namen
der Felder können jetzt als Variablen (Dollarzeichen nicht vergessen!) verwendet werden (im folgenden
Beispiel wird abgefragt, ob das Feld "Name" leer ist):
import_request_variables('p');
if($name != "") // Leerstring?
{
...
}
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>';
PHP - 14 -
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>';
In der Zieldatei (hier: index.php) kann die Meldung wie eine Variable verwendet werden (Dollarzeichen
nicht vergessen). Achtung! Zuvor import_request_variables aufrufen, sonst ist kein Zugriff auf die
Variable möglich. Als Parameter „g“ (für „get“) angeben, da an Links angehängte Meldungen immer mit
der Methode „get“ übertragen werden. Achtung! Im Unterschied zum Link (s.o.) muss hier sehr wohl
auf Anführungszeichen geachtet werden:
import_request_variables('g');
if($msg1 == 'diesIstEinText') ... ; // Strings immer mit Anführungszeichen
if($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 Klick auf einen „Abbrechen“-Button das Formular verlassen und zur Index-Seite springen. 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:
<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
PHP - 15 -
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 PHPSeite nicht mehr überprüfen, ob sie selektiert sind oder nicht. Achte, wie üblich, beim Zugriff auf das Array auf das Dollarzeichen: $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($cb as $element)
{
$sql='DELETE FROM benutzer WHERE ID = ' . $element . ';';
$res=mysql_query($sql,$conn);
}
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($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
}
$sql='DELETE FROM benutzer WHERE ID IN (' . $liste . ');';
$res=mysql_query($sql,$conn);
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!
PHP - 16 -
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=mysql_fetch_array($RS,MYSQL_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 Befehl (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).
PHP - 17 -
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 = $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" />
...
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']);
PHP - 18 -
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>Benutzername</label></td>
<td><input type="text" name="txtName" size="24" maxlength="24" /></td>
<tr><td><label>Passwort</label></td>
<td><input type="text" name="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",
"Name" und "Passw" enthält). Nicht vergessen, zuerst die Funktionen "session_start" (damit
wir eine Session anlegen können) und "import_request_variables" (damit wir auf die Formularfelder zugreifen können) aufzurufen:
session_start();
import_request_variables("p");
if($txtName != "")
{
if($txtPassw != "")
{
$server='localhost';
$user='root';
$conn=mysql_connect($server,$user);
$db='abc';
mysql_select_db($db,$conn);
$sql = 'SELECT * FROM benutzer WHERE Name="' . $txtName . '"
AND Passw = "' . $txtPassw . '";'; // stimmen Benutzername und Passwort?
$erg = mysql_query($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
„mysql_fetch_array“ der eigentliche Datensatz ausgelesen werden, bevor ein Zugriff auf dessen
Felder möglich ist ("ID", "Name" und "Passw"):
if($erg) // konnte Abfrage ausgeführt werden?
{
$felder=mysql_fetch_array($erg); // Datensatz auslesen, falls vorhanden
PHP - 19 if($felder) // wurde ein passender Datensatz gefunden?
{
... // wenn ja: Datensatz auslesen
} // else: kein passender datensatz gefunden
} // else: irgendein Fehler ist schon bei der Ausführung der Abfrage passiert
Diese drei Felder des Datensatzes können nun in das Session-Objekt geschrieben werden:
$_SESSION['benutzerName']=$felder['Name'];
$_SESSION['benutzerPassw']=$felder['Passw'];
$_SESSION['benutzerID']=$felder['ID'];
Die drei "if"-Anweisungen, die wir bisher in unserem 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=nameFehlt";</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