Sie sind auf Seite 1von 13

Step 1

Anlegen der Übungsdatenbank

Wir starten unseren Webserver und stellen sicher, dass PHP und mySQL betriebsbereit sind.

Dann öffnen wir den Browser und geben http://localhost/ ein. Es sollte sich nun der
Webserver mit dem htdocs-Verzeichnis melden. Durch einen entsprechenden Klick auf den
Link (= Ordner) wechseln wir zu phpMyAdmin. Nun sollte man von dessen Startbildschirm
erwartet werden.

In das Feld unter "Neue Datenbank anlegen" geben wir "test" ein und klicken auf "Erzeugen".

Im nächsten Fenster suchen suchen wir den Teil "Neue Tabelle erstellen in Datenbank test"
und geben folgendes ein:
> Name: adressen
> Felder: 7

Ein Klick legt die Tabelle an unf bringt uns zu deren Dump (= Struktur). Hier werden nun die
einzelnen Spalten angelegt, deren Datentypen gesetzt und einige Extras eingebaut. Werft
einfach mal einen Blick auf den Screenshot und tragt alles genauso bei Euch ein. Eine
ausführliche Erklärung kommt später.

Noch ein Klick auf "Speichern" und die Datenbank ist ready to go!
Step 2
PHP-Script mit der Datenbank verbinden

Kommen wir jetzt also zu PHP. Es sei noch gesagt, dass hier kein OOP-Anstz mit Klassen
und allem möglichen verfolgt wird, sondern so simpel wie möglich erläutert werden soll,
wie's funktioniert.

PHP bietet äusserst komfortable Funktionen für die Zusammenarbeit mit Datenbanken. Als
allererstes muss man naürlich eine Verbindung mit der Datenbank aufbauen und später wieder
schliessen. Im Prinzip sieht das ganze so aus:

PHP-Code:
<?

mysql_connect();

// Irgendwelches Zeug

mysql_close();

?>

Ein paar Feinheiten sind aber noch nötig, damit alles klappt.

Zum Verbinden benötigt PHP die Daten über Host, User und Passwort, auch muss eine
Datenbank angegeben werden, da ein DBMS (Datenbank-Management-System, z.B. mySQL,
Oracle, Informix etc.) mehrere verwalten kann. Hier, im Workshop, der nur lokal getestet
wird, würde es auch so laufen, da PHP standardmässig davon ausgeht, dass sich die DB lokal
befindet und der User auch Root-Rechte besitzt und kein Passwort braucht, aber wir wollen
mal alles beachten. Ausserdem benötigt mysql_close() einen Handler, der ihm sagt, welche
Verbindung getrennt werden soll, es können schliesslich mehrere geöffnet sein. Unser SCript
müsste also jetzt so aussehen:

PHP-Code:
<?

$verbindung = mysql_connect("localhost","root",""); // Diese Daten koennen natürlich au


ch aus Variablen gelesen werden
mysql_select_db("test");
// Irgendwelches Zeug

mysql_close($verbindung);

?>

Wenn wir dieses Script nun testen passiert: gar nix.

Warum ist das so?

mysql_connect() und mysql_select_db() setzen lediglich einen Handler auf die Datenbank und
warten auf weitere Befehle.
Step 3
Datensätze lesen

Als nächstes lernen wir die Funktion mysql_query() kenne, welche SQL-Abfragen ausführen
kann. Sie erwartet mindestens die SQL-Klausel (SELECT * FROM adressen etc.) und
optinonal den Verbindungshandler. Letzterer ist dann nötig, wenn mehrere Verbindungen
geöffnet sind. Das Script sieht jetzt also so aus (der SQL-Teil steht in einer Variablen, damit
es übersichtlicher ist):

PHP-Code:
<?

$verbindung = mysql_connect("localhost","root",""); // Diese Daten koennen natürlich au


ch aus Variablen gelesen werden
mysql_select_db("adressen");

$abfrage = "SELECT * FROM adressen";


mysql_query($abfrage, $verbindung);

mysql_close($verbindung);

?>

Wenn wir dieses Script nun ausführen passiert immer noch nichts, denn es wurde lediglich ein
Pointer auf die entsprechenden Datensätze gesetzt. Diese müssen wir nun in einer Schleife
auslesen, wobei die einzelnen Felder einer jeden Zeile in einem Array zur Verfügung stehen.
Innerhalb derselbigen geben wir jeden Datensatz per print() aus:

PHP-Code:
<?

$verbindung = mysql_connect("localhost","root",""); // Diese Daten koennen natuerlich a


uch aus Variablen gelesen werden
mysql_select_db("test");

$abfrage = "SELECT * FROM adressen";


$ergebnis = mysql_query($abfrage, $verbindung);

while ($zeile = mysql_fetch_array($ergebnis)){


print("$zeile[nachname],$zeile[vorname],$zeile[plz] $zeile[ort],$zeile[telefon]<br>");

mysql_close($verbindung);

?>

Das Script wirkt jetzt schon sehr komplex.


Step 3
Neue Datensätze anlegen

Damit wir gleich wie die Verrückten unsere Datenbank abfragen können, sollten wir noch
einige Datensätze hinzufügen. Das geht entsprechend einfach, da in PHP bekanntlich alle
Werte aus Formular-Feldern unter ihrem HTML-Namen innerhalb des verarbeitenden Scripts
als Variablen zur Verfügung stehen.

Code:
HTML: <input type="text" name="eingabefeld1">

PHP: $eingabefeld1

Das Eingabefeld ist also schnell gebaut, wir benötigen nur die Felder für Vorname,
Nachname, Strasse, PLZ, Ort und Telefon. Da das Script sich selber aufruft, benötigen wir
noch ein verstecktes Feld namen "action", in dem wir dem Script sagen können, was es tun
soll:

Code:
<form action="<?php $PHP_SELF ?>">
Vorname: <input type="text" name="vorname"><br>
Nachname: <input type="text" name="nachname"><br>
Strasse: <input type="text" name="strasse"><br>
PLZ: <input type="text" name="plz"><br>
Ort: <input type="text" name="ort"><br>
Telefon: <input type="text" name="telefon"><br>
<input type="hidden" name="action" value="neu">
<input type="submit" value="Speichern">
</form>

In der Konstanten "$PHP_SELF" ist immer der Pfad zum Script gespeichert, wir müssen uns
also keine langen URL merken. Am Anfang des Script fragen wir jetzt ab, ob die Variable
"$action" existiert und welchen Wert sie hat:

PHP-Code:
if($action == "neu"){
// Anweisungen
}

Wenn dem so ist, führen wir eine SQL-Query aus und lassen uns über das Speichern
informieren:

PHP-Code:
$abfrage = "INSERT INTO adressen (vorname,nachname,strasse,plz,ort,telefon) VALUES
('$vorname', '$nachname','$strasse','$plz','$ort','$telefon')";
mysql_query($abfrage, $verbindung);
print("Neuen Datensatz gespeichert!<br>")

Die SQL-Anweisung ist sehr einfach aufgebaut (kein LIMIT etc.) und sollte jedem
verständlich sein. Hier noch mal der schematische Aufbau:

PHP-Code:
INSERT INTO [Datenbank] ([diese Felder]) VALUES ([diese Werte])
Die einzufügenden Werte stammen direkt aus dem Formular und tragen die gleichen
Bezeichnungen, wie die entsprechenden Felder in unserer Datenbank. Das ist natürlich nicht
zwingend, aber erhöht die Übersichtlichkeit. Unser Script sieht nun also so aus:

PHP-Code:
<html>
<head>
<title>Workshop</title>
</head>
<body>

<p>
<?

$verbindung = mysql_connect("localhost","root",""); // Diese Daten koennen natuerlich a


uch aus Variablen gelesen werden
mysql_select_db("test");

if($action == "neu"){
$abfrage = "INSERT INTO adressen (vorname,nachname,strasse,plz,ort,telefon) VALU
ES ('$vorname', '$nachname','$strasse','$plz','$ort','$telefon')";
mysql_query($abfrage, $verbindung);
print("Neuen Datensatz gespeichert!<br>");
}

$abfrage = "SELECT * FROM adressen";


$ergebnis = mysql_query($abfrage, $verbindung);

while ($zeile = mysql_fetch_array($ergebnis)){


print("$zeile[nachname],$zeile[vorname],$zeile[plz] $zeile[ort],$zeile[telefon]<br>");

mysql_close($verbindung);

?>
</p>

<p>
<b>Neue Adresse eintragen</b>
<form action="<?php $PHP_SELF ?>">
Vorname: <input type="text" name="vorname"><br>
Nachname: <input type="text" name="nachname"><br>
Strasse: <input type="text" name="strasse"><br>
PLZ: <input type="text" name="plz"><br>
Ort: <input type="text" name="ort"><br>
Telefon: <input type="text" name="telefon"><br>
<input type="hidden" name="action" value="neu">
<input type="submit" value="Speichern">
</form>
</p>

</body>
</html>
Step 3
Löschen von Datensätzen

So, damit wir den ganzen Mist, den wir in die Datenbank eingegeben haben auch wieder
löschen können, basteln wir uns jetzt eine einfache Funktion hierfür. Hier kommt wieder der
Primärschlüssel ins Spiel, damit auch wirklich nur der Datensatz ins Nirvana befördert wird,
der weg soll. Denn wenn wie beispielsweise den Nachnamen als Primary Key gewählt hätten,
gäbe es bei Meier und Meier schon Probleme, glücklicherweise waren wir aber ja so schlau,
uns der auto_increment-Prozedur zu bedienen.

Innerhalb der Ausgabeschleife fügenen wir nun an jeden Datensatz einen Link, an den wir
wieder unsere Steuerungs Variable $action anhängen, diesmal mit dem Wert loeschen.
Ausserdem hängen wir noch die jeweilige ID (unseren Primärschlüssel) an:

PHP-Code:
while ($zeile = mysql_fetch_array($ergebnis)){
print("$zeile[nachname],$zeile[vorname],... <a href=\"$PHP_SELF?
action=loeschen&id=$zeile[id]\">Löschen?</a><br>");
// Die Variablen werden einfach per "?" von der URL getrennt, weitere Variablen mit "&
"
}

Im Kopf des Scripts notieen wir nun die entsprechende Löschfunktion:

PHP-Code:
if($action == "loeschen"){
$abfrage = "DELETE FROM adressen WHERE id='$id'";
mysql_query($abfrage, $verbindung);
print("Datensatz $id gelöscht!!<br>");
}

Diese unterscheidet sich lediglich in der SQL-Abfrage und natürlich der Meldung von der
Funktion zum speichern. Hier noch mal der SQL-Teil im Schema:

PHP-Code:
DELETE FROM [Datenbank] WHERE bedingung;

In unserem Beispiel wollen wir ja nur eine speziellen Datensatz löschen, es lassen sich aber
auch mehrere auf einmal entfernen. Dazu muss die SQL-Anweisung nur entsprechend
umgebaut werden. Hier mal ein Beispiel:

PHP-Code:
DELETE FROM adressen WHERE plz='53227';
Unser Script ist nun auf dieses Ausmass angewachsen:

PHP-Code:
<html>
<head>
<title>Workshop</title>
</head>
<body>

<p>
<?

$verbindung = mysql_connect("localhost","root",""); // Diese Daten koennen natuerlich a


uch aus Variablen gelesen werden
mysql_select_db("test");

if($action == "neu"){
$abfrage = "INSERT INTO adressen (vorname,nachname,strasse,plz,ort,telefon) VALU
ES ('$vorname', '$nachname','$strasse','$plz','$ort','$telefon')";
mysql_query($abfrage, $verbindung);
print("Neuen Datensatz gespeichert!<br>");
}

if($action == "loeschen"){
$abfrage = "DELETE FROM adressen WHERE id='$id'";
mysql_query($abfrage, $verbindung);
print("Datensatz $id gelöscht!!<br>");
}

$abfrage = "SELECT * FROM adressen";


$ergebnis = mysql_query($abfrage, $verbindung);

while ($zeile = mysql_fetch_array($ergebnis)){


print("$zeile[nachname],$zeile[vorname],$zeile[strasse],$zeile[plz] $zeile[ort],
$zeile[telefon] <a href=\"$PHP_SELF?action=loeschen&id=$zeile[id]\">Löschen?
</a><br>");
}

mysql_close($verbindung);

?>
</p>

<p>
<b>Neue Adresse eintragen</b>
<form action="<?php $PHP_SELF ?>">
Vorname: <input type="text" name="vorname"><br>
Nachname: <input type="text" name="nachname"><br>
Strasse: <input type="text" name="strasse"><br>
PLZ: <input type="text" name="plz"><br>
Ort: <input type="text" name="ort"><br>
Telefon: <input type="text" name="telefon"><br>
<input type="hidden" name="action" value="neu">
<input type="submit" value="Speichern">
</form>
</p> </body> </html> (body und html stehen nur aus platzgründen in der zeile)
Step 4
Datenbank durchsuchbar machen

Um unsere unglaubliche Fülle von Adressen nun durchsuchbar zu mcahen, bauen wir eine
kleine Suchfunktion ein. Wir fangen erstm mal klein an, und lassen nur nach Vor- oder
Nachname suchen. Dazu benötigen wir ein entsprechendes Formular, in dem neben unserer
Variable "$action" auch übergeben wird, in welcher Spalte nach was gesucht werden soll:

Code:
<form action="<?php $PHP_SELF ?>">
<table border="0" cellspacing="5">
<tr>
<td colspan="2">Nach Adressen suchen</td>
</tr>
<tr>
<td>Suchwort:</td><td><input type="text" name="suchwort"></td>
</tr>
<tr>
<td colspan="2">
Suche nach
<input type="radio" name="spalte" value="nachname" checked> Nachname
oder
<input type="radio" name="spalte" value="vorname"> Vorname?
</td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="action" value="suchen">
<input type="submit" value="Finden">
</td>
</tr>
</table>
</form>
Im Script wird dann wieder geprüft, welche Aktion (-> $action) ausgeführt werden soll. In
disem Falle die Suche:

Code:
if($action == "suchen"){
$abfrage = "SELECT * FROM adressen WHERE $spalte='$suchwort'";
$ergebnis = mysql_query($abfrage, $verbindung);
$anzahl = mysql_affected_rows();
print("
<tr>
<td colspan=\"7\">$anzahl Adresse(n) gefunden:</td>
</tr>
");
while ($zeile = mysql_fetch_array($ergebnis)){
print("
<tr bgcolor=\"#CCCCCC\">
<td>$zeile[nachname]</td>
<td>$zeile[vorname]</td>
<td>$zeile[strasse]</td>
<td>$zeile[plz] $zeile[ort]</td>
<td>$zeile[telefon]</td>
<td><a href=\"$PHP_SELF?
action=loeschen&id=$zeile[id]\">Löschen?</a></td>
</tr>
");
}
print("
<tr>
<td colspan=\"7\"><hr></td>
</tr>
");

Die Abfrage arbeitet wieder mit dem WHERE-Statement, nur, dass diesmla kein fester SQÖ-
Ausdruck verwendet wird, sondern eine Abfrage aus den übergebenen Variablen
zusammengebaut wird:

PHP-Code:
$abfrage = "SELECT * FROM adressen WHERE $spalte='$suchwort'" // Bitte hierzu noch
mal einen Blick auf das Formular werfen
Die Script-Zweig sieht dann so aus:

PHP-Code:
f($action == "suchen"){
$abfrage = "SELECT * FROM adressen WHERE $spalte='$suchwort'";
$ergebnis = mysql_query($abfrage, $verbindung);
$anzahl = mysql_affected_rows();
print("
<tr>
<td colspan=\"7\">$anzahl Adresse(n) gefunden:</td>
</tr>
");
while ($zeile = mysql_fetch_array($ergebnis)){
print("
<tr bgcolor=\"#CCCCCC\">
<td>$zeile[nachname]</td>
<td>$zeile[vorname]</td>
<td>$zeile[strasse]</td>
<td>$zeile[plz] $zeile[ort]</td>
<td>$zeile[telefon]</td>
<td><a href=\"$PHP_SELF?action=loeschen&id=$zeile[id]\">Löschen?
</a></td>
</tr>
");
}
print("
<tr>
<td colspan=\"7\"><hr></td>
</tr>
");

Neu ist die Funktion mysql_affected_rows(), sie liefert die Anzahl der von der Abfrage
zurückgelieferten Spalten. Diesen Wert schreiben wir in die Variable "$anzahl" und können
somit komfortabel ausgeben, wieviele Treffer gefunden wurden. Falls kein Treffer geliefert
wird, erfolgt keine Ausgabe, da die Funktion FALSE zurückliefert, man kann dieses jedoch
mit einer einfachen Schleife umbauen, damit zumindest eine Meldung erscheint (könnt Ihr ja
mal testen).
Hier nun unser aktuelles Script:

PHP-Code:
<html>
<head>
<title>Workshop</title>
</head>
<body>

<table border="0" cellspacing="5">


<?

$verbindung = mysql_connect("localhost","root",""); // Diese Daten koennen natuerlich a


uch aus Variablen gelesen werden
mysql_select_db("test");

if($action == "neu"){
$abfrage = "INSERT INTO adressen (vorname,nachname,strasse,plz,ort,telefon) VALU
ES ('$vorname', '$nachname','$strasse','$plz','$ort','$telefon')";
mysql_query($abfrage, $verbindung);
print("<tr><td colspan=\"7\">Neuen Datensatz gespeichert!</td></tr>");
}

if($action == "loeschen"){
$abfrage = "DELETE FROM adressen WHERE id='$id'";
mysql_query($abfrage, $verbindung);
print("<tr><td colspan=\"7\">Datensatz $id gelöscht!!</td></tr>");
}

if($action == "suchen"){
$abfrage = "SELECT * FROM adressen WHERE $spalte='$suchwort'";
$ergebnis = mysql_query($abfrage, $verbindung);
$anzahl = mysql_affected_rows();
print("
<tr>
<td colspan=\"7\">$anzahl Adresse(n) gefunden:</td>
</tr>
");
while ($zeile = mysql_fetch_array($ergebnis)){
print("
<tr bgcolor=\"#CCCCCC\">
<td>$zeile[nachname]</td>
<td>$zeile[vorname]</td>
<td>$zeile[strasse]</td>
<td>$zeile[plz] $zeile[ort]</td>
<td>$zeile[telefon]</td>
<td><a href=\"$PHP_SELF?action=loeschen&id=$zeile[id]\">Löschen?
</a></td>
</tr>
");
}
print("
<tr>
<td colspan=\"7\"><hr></td>
</tr>
");

}
$abfrage = "SELECT * FROM adressen";
$ergebnis = mysql_query($abfrage, $verbindung);

while ($zeile = mysql_fetch_array($ergebnis)){


print("
<tr bgcolor=\"#CCCCCC\">
<td>$zeile[nachname]</td>
<td>$zeile[vorname]</td>
<td>$zeile[strasse]</td>
<td>$zeile[plz] $zeile[ort]</td>
<td>$zeile[telefon]</td>
<td><a href=\"$PHP_SELF?action=loeschen&id=$zeile[id]\">Löschen?</a></td>
</tr>
");
}

mysql_close($verbindung);

?>
</table>

<form action="<?php $PHP_SELF ?>">


<table border="0" cellspacing="5">
<tr>
<td colspan="2">Neue Adresse eintragen</td>
</tr>
<tr>
<td>Vorname:</td><td><input type="text" name="vorname"></td>
</tr>
<tr>
<td>Nachname:</td><td><input type="text" name="nachname"></td>
</tr>
<tr>
<td>Strasse:</td><td><input type="text" name="strasse"></td>
</tr>
<tr>
<td>PLZ:</td><td><input type="text" name="plz"></td>
</tr>
<tr>
<td>Ort:</td><td><input type="text" name="ort"></td>
</tr>
<tr>
<td>Telefon:</td><td><input type="text" name="telefon">
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="action" value="neu">
<input type="submit" value="Speichern">
</td>
</tr>
</table>
</form>

<form action="<?php $PHP_SELF ?>">


<table border="0" cellspacing="5">
<tr>
<td colspan="2">Nach Adressen suchen</td>
</tr>
<tr>
<td>Suchwort:</td><td><input type="text" name="suchwort"></td>
</tr>
<tr>
<td colspan="2">
Suche nach
<input type="radio" name="spalte" value="nachname" checked> Nachname oder
<input type="radio" name="spalte" value="vorname"> Vorname?
</td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="action" value="suchen">
<input type="submit" value="Finden">
</td>
</tr>
</table>
</form>

</body>
</html>