MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung 10 Kursbuchung: Datenbank mit PHP Das Beispiel von der letzten Seite soll jetzt erweitert und ausgebaut werden. Damit außerdem für die weitere Arbeit einheitliche Felder vorhanden sind, wird zunächst aus einem Dump die Datenbank schulung komplett neu aufgebaut. Das Menü dazu: (wird später nach und nach erweitert) menu.php <!--menu.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Menü zur Datenbank Schulung</title> </head> <body> <h2 align="center">Bitte auswählen</h2> <table align="center" width=400> <tr height="30"> <td ><a href="neuschueler_form.php">Neue Schüler</a> </td> </tr> <tr height="30"> <td> <a href="schueler_loesch_form.php">Schüler löschen</a></td> </tr> <tr height="30"> <td> <a href="schueler_loesch_form2.php">Schüler löschen, zweite Version</a></td> </tr> <tr height="30"> <td><a href="kund_list.php">Schüler auflisten</a> </td> </tr></body></html> 10.1 Include-Datei zur Datenbank-Verbindung: <?php $verbindung = mysql_connect("localhost","root","bfw"); mysql_select_db("schulung") or die ("Die Datenbank existiert nicht"); ?> 10.2 Neue Schüler aufnehmen Zunächst das HTML-Formular neuschueler_form.php: 63 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung <!--neuschueler_form.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Neue Artikel</title> </head> <body> <h2 align="center">Neue Schüler</h2> <form action="neuschueler.php" method="post" > <table align="center" width=400> <tr> <td width="200"> Name:</td> <td heigth="200"> <input type="Text" name="name" size="20" </td></tr> <tr> <td width="200"> Vorname:</td> <td heigth="200"> <input type="Text" name="vorname" size="20"</td></tr> <tr> <td width="200"> Strasse:</td> <td heigth="200"> <input type="Text" name="strasse" size="20"</td></tr> <tr> <td width="200"> Ort:</td> <td heigth="200"> <input type="Text" name="ort" size="20"</td></tr> <tr> <td width="200"> Telefon:</td> <td heigth="200"> <input type="Text" name="telefon" size="20"</td></tr> <tr> <td width="200"> E-Mail:</td> <td heigth="200"> <input type="Text" name="email" size="20"</td></tr> <tr><td> <input type="Submit" name="Aufnehmen" value="aufnehmen"></td></tr> </table></form></body></html> Dann das PHP-Skript neuschueler.php --> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Neuer Schüler</title> </head> <body> <h2 align="center">Neuer Schüler</h2> <?php include ("verbindung.php"); $abfrage="INSERT INTO teilnehmer(name,vorname,strasse,plz,ort,telefon,email) values ('$name','$vorname','$strasse','$plz','$ort','$telefon','$email' )"; $res = mysql_query($abfrage); if(!$res) {echo mysql_error(); } echo "<b>Der aufgenommene Schüler heißt: <br>$vorname <br>$name<br> </b> <br><br>"; ?> </body> </html> 64 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung 10.3 Schüler löschen Nun das Formular für die Aufnahme der Nummer, wenn ein Schüler gelöscht werden soll: Der HTML-Code ist nichts Neues: <!--schueler_loesch_form.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Neue Artikel</title> </head> <body> <h2 align="center">Schüler löschen</h2> <form action="schueler_loesch.php" method="post" > <table align="center" width=200> <tr> <td width="200"> Nr:</td> <td heigth="200"> <input type="Text" name="nr" size="5" </td></tr> <tr><td> <input type="Submit" name="loeschen" value="loeschen"></td></tr> </table></form></body></html> Auch die PHP-Datei enthält zunächst keine neuen Elemente. schueler_loesch.php <!--schueler_loesch.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Schüler löschen</title> </head> <body> <h2 align="center">Schüler löschen</h2> <?php include ("verbindung.php"); $abfrage="delete from teilnehmer where s_nr=$nr"; $res = mysql_query($abfrage); if(!$res) {echo mysql_error(); } ?> </body></html> Aufgabe: Jetzt soll das Skript „Schüler löschen“ so geändert werden: Nach der Eingabe der Nummer soll der Name und der Vorname angezeigt werden. Die veränderte PHP-Datei wird aufgerufen durch den Menupunkt "Schüler löschen, zweite Version") Dazu kann die Funktion mysql_fetch_assoc verwendet werden. Sie bietet den Vorteil gegenüber mysql_fetch_array, dass man ohne eine Schleife auskommt, wenn genau ein Datensatz das Ergebnis bildet. Auf der folgenden Seite sehen Sie nur den php-Teil der Datei (der veränderte Teil ist fett): Ausschnitt aus schueler_loesch2.php 65 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung <?php include ("verbindung.php"); $sql=("select vorname,name from teilnehmer where s_nr=$nr"); $ergibt=mysql_query($sql); $row=mysql_fetch_assoc($ergibt); echo "Vorname ".$row["vorname"]."<br>"; echo "Name ".$row["name"]."<br>"; $abfrage="delete from teilnehmer where s_nr=$nr"; Eweiterung: Zuerst soll – nach der Eingabe der Nummer – der Vorname und Name angezeigt werden. Dazu soll eine Abfrage erscheinen: Wirklich löschen? Wenn mit j bestätigt wird, soll dann die Löschung erfolgen. Dies soll so gelöst werden, dass in der Datei, die nach dem Eingeben der Nummer aufgerufen wird, zunächst nur der Vorname und Name angezeigt wird. Außerdem soll ein MiniFormular die Frage aufnehmen, ob der Schüler wirklich gelöscht wird. Das Formular schickt das Ergebnis an eine neue Datei schueler_loesch3.php. Aufgabe: Speichern Sie dazu die Datei schueler_loesch.php mit dem Namen schueler_loesch2.php. Diese Datei enthält dann folgenden Code (nächste Seite) schueler_loesch2.php Im Formularteil (fett) sehen Sie die Übergabe der Variablen mit der Nummer. Diese ist von der Datei schueler_loesch_form.php zwar übergeben worden, aber nur an die zweite Datei; deshalb wird ein verstecktes Textfeld gebraucht, um es an die dritte Datei weiterzuleiten. <!--schueler_loesch2.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Schüler löschen</title> </head> <body> <h2 align="center">Schüler löschen</h2> <?php include ("verbindung.php"); $sql=("select vorname,name from teilnehmer where s_nr=$nr"); $ergibt=mysql_query($sql); $row=mysql_fetch_assoc($ergibt); echo "Vorname ".$row["vorname"]."<br>"; echo "Name ".$row["name"]."<br><br>"; ?> <form action ="schueler_loesch3.php" method ="post"> <!--der folgende Befehl (Textfeld hidden) wird benötigt, um die Variable $nr zu übergeben. Das Formular übergibt nur diese: <input type = "text" name="jn", also $jn--> <?php echo "<input type=\"hidden\" name=\"nr\" value=\"$nr\"></input>"; ?> Soll dieser Schüler wirklich gelöscht werden (j=ja, n=nein)? <input type = "text" name="jn" size="2"></input><br> <input type="submit" name="Weiter" value="Weiter"></input> </form> </body></html> 66 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Wir haben jetzt folgende Abfolge: Dann: Die Datei, die dann den Datensatz löscht (oder nicht) schueler_loesch3.php <!--schueler_loesch3.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Schüler löschen</title> </head> <body> <h2 align="center">Schüler löschen</h2> <?php if($jn=="j") { include ("verbindung.php"); $abfrage="delete from teilnehmer where s_nr=$nr"; $res = mysql_query($abfrage); if(!$res) {echo mysql_error(); } echo "<b>Der Schüler ist gelöscht</b>"; } else { echo "Dann eben nicht!"; } ?> </body></html> Auf dem Bildschirm erscheint entweder: oder: Aufgabe: Kontrollieren Sie das Ergebnis (gelöscht oder nicht) über PHPMyAdmin! 67 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Jetzt soll noch ein PHP-Skript erstellt werden, mit dem eine Auflistung aller Schüler erreicht wird. Der Code dazu ist vergleichsweise einfach, es muss aber die Funktion mysql_fetch_array verwendet werden, weil hier so viele Datensätze wie vorhanden anzusprechen sind. (nächste Seite) schueler_list.php <!--schueler_list.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Schüler auflisten</title> </head> <body> <h2 align="center">Schüler auflisten</h2> <?php include ("verbindung.php"); $sql=("select vorname,name from teilnehmer"); echo "Die Liste aller erfassten Schüler in der Datenbank:<br><br>"; $liste = mysql_query("select s_nr,vorname,name from teilnehmer"); while ($row=mysql_fetch_array($liste)){ echo $row["s_nr"]." "; echo $row["vorname"]." "; echo $row["name"] ."<br>"; } ?> </body></html> 10.4 Teilnehmer seitenweise ausgeben Statt der Ausgabe der Daten untereinander sollen jetzt immer 5 Datensätze ausgegeben werden, danach wird geblättert werden. Auf dem Monitor sieht dies so aus: 68 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Wie dies zu machen ist, erläutert Philipp Lenz1 so: "Als erstes muss eine Abfrage an die Datenbank abgesetzt werden um die Masse der Datensätze zu ermitteln: <?php $select = mysql_query("select * from tabelle");<br /> $reihen = mysql_num_rows($select); ?> Somit haben wir nun eine Zahl, die die gefundenen Datensätze beinhaltet. Diese Zahl müssen wir nun durch unsere Zahl X teilen. X beinhaltet unsere Menge der anzuzeigenen Datensätze auf einer Seite. <?php $zeigen = floor($reihen / 5); ?> Die Variable $zeigen beinhaltet nun die Seitenanzahl, die wir auf der Seite haben. Mit der Funktion floor() haben wir die Zahl gleich abgerundet, da wir ansonsten wahrscheinlich eine Zahl bekommen würden, die mit unmengen Stellen nach dem Komma gefüllt ist. Jetzt müssen wir die Variable setzen, die den Startpunkt bezeichnet, von wo an in der Datenbank-Tabelle selektiert wird. <?php if(!$start) { $start = 0.1; } ?> Somit haben wir die Grundlage zum Selektieren gelegt: <?php $result = mysql_query("select * from tabelle limit start,5"); ?> Danach machen wir eine normale Ausgabe via einer while-Schleife in einer HTML-Tabelle: <?php echo "< table>"; while ($zeile = mysql_fetch_array($result)) { echo "<tr><td>$zeile[3]</td></tr>"; } echo "< /table>"; ?> Die 3 in dem Array $zeile bezeichnet welche Spalte in dem Datensatz ausgegeben werden soll, hier fängt man bei 0 an zu zählen, also Spalte 1 ist 0, Spalte 2 ist 1 usw... Da nun die erste Ausgabe mit 5 Datensätzen geschehen ist, müssen wir uns dem Umblättern zuwenden. Als erstes machen wir via einer for-Schleife eine Ausgabe mit den Seiten. Dazu benötigen wir wieder die Variable $zeigen. <?php if($start > 0.1) { $zurueck = $start - 5; echo "<a href=\"$PHP_SELF?start=$zurueck\"><< Zurück</a>"; } for($i = 0; $i <= $zeigen; $i++) { echo "<a href=\"$PHP_SELF?start=$n\">$i</a>"; $n += 5; } $weiter = $start + 5; if($reihen > $weiter) { echo "<a href=\"$PHP_SELF?start=$weiter\">Weiter >></a>"; } ?> 1 Phillip Lenz, http://www.php-homepage.de/artikel/?nr=20 69 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Somit haben wir nun eine Ausgabe der Seiten, die verfügbar sind, desweiteren definieren wir noch eine Variable ($n), Sie wird nach jeder Ausgabe mit 5 addiert, somit pushen wir die Variable $start hoch und erzwingen beim Klick eine andere Ausgabe. Soll heissen, der MySQL-Query $select wird in der Variable $start beeinflusst. Vor und nach der for-Schleife generieren wir auch noch zwei Hyperlinks, der eine mit dem Namen Zurück und den anderen Weiter. Diese Links sollen dem Benutzer die Möglichkeit geben ohne über die Seitenzahlen zu navigieren und einfach mit den Links sich durch die Seiten zu schalten. Dazu werden 2 Variablen erstellt, die eine $zurueck und die andere $weiter. Die erste ($zurueck) wird mit 5 subtrahiert und dann wird mit einer if-Schleife überprüft, ob die Variable über 0.1 ist. Wenn das Ergebniss true ergibt, wird der Link Zurück ausgegeben. Das gleiche nur umgekehrt, also das die Variable $weiter mit 5 addiert wird, passiert auch beim Weiter-Hyperlink." Hier folgt jetzt der Code für die Datei schueler_seiten.php (abgewandelt und auf das Beispiel Kursdatenbank angepasst) <!--schueler_seiten.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Teilnehmer seitenweise auflisten</title> </head> <body> <h2 align="center">Je 5 Teilnehmer auflisten</h2> <?php include ("verbindung.php"); $select = mysql_query("select * from teilnehmer"); $reihen = mysql_num_rows($select); $zeigen = floor($reihen / 5); if(!$start) { $start = 0.1; } $result = mysql_query("select * from teilnehmer limit $start,5"); echo "<table>"; while ($zeile = mysql_fetch_array($result)) { echo "<tr><td align=\"left\">$zeile[1]</td>"." "; echo "<td align=\"left\">$zeile[2]</td>"." "; echo "<td align=\"left\">$zeile[3]</td>"." "; echo "<td align=\"left\">$zeile[4]</td>"." "; echo "<td align=\"left\">$zeile[6]</td></tr>"; } echo "</table>"; if($start > 0.1) { $zurueck = $start - 5; echo "<a href=\"$PHP_SELF?start=$zurueck\"><< Zurück</a>"; } for($i = 0; $i <= $zeigen; $i++) { echo " <a href=\"$PHP_SELF?start=$n\">$i</a> "; $n += 5; } $weiter = $start + 5; if($reihen > $weiter) { echo "<a href=\"$PHP_SELF?start=$weiter\">Weiter >></a>"; } ?> </body></html> 70 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung 10.5 Auflistung von gebuchten Kursen Wenn nach der Eingabe einer Kursnummer aufgelistet werden soll, welcher Schüler diesen Kurs gebucht hat, dann benötigen Sie diese drei Tabellen aus der Datenbank: Kurs kurse buchungen teilnehmer Die SQL-Abfrage, die nach einer gegebenen Kursnummer (z.B. Kurs 3) die Schueler auflistet, die den Kurs gebucht haben, ist: select s.vorname,s.name from teilnehmer s, buchungen b, kurse k where k.kursnr=b.kursnr and b.s_nr=s.s_nr and k.kursnr=3; Die Übersetzung in PHP ist (wenn vorher in einem Formular die Kursnr als Variable $kurs abgefragt wurde: $list = mysql_query("select t.vorname,t.name from teilnehmer t, buchungen b, kurse k where k.kursnr=b.kursnr and b.s_nr=t.s_nr and k.kursnr='$kurs'"); Dies ergibt die Datei kurs_list.php <!--kurs_list.php --> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Gebuchte Kurse</title></head> <body> <h2>Kursteilnehmer auflisten</h2> <form action="kurs_list.php" method="post" > <table align="center" width=200> <tr> <td width="200"> Kurs-Nr:</td> <td heigth="200"> <input type="Text" name="kurs" size="5" </td></tr> <tr><td> <input type="Submit" name="auflisten" value="auflisten"></td></tr> </table></form> <?php include ("verbindung.php"); $list = mysql_query("select t.vorname,t.name from teilnehmer t, buchungen b, kurse k where k.kursnr=b.kursnr and b.s_nr=t.s_nr and k.kursnr='$kurs'"); while ($row=mysql_fetch_array($list)){ echo $row["vorname"]." "; echo $row["name"] ."<br>"; } ?> </body></html> 71 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Beim Aufruf der Datei sehen Sie: Wenn dann eine Kurs-Nummer eingegeben wurde, sieht man: Aufgabe: Wenden Sie dasselbe Verfahren an, um zuerst eine Schüler-Nr. einzugeben und dann die gebuchten Kurse zu sehen. Aufgabe: Verändern Sie den Code so, dass die Ausgabe in Tabellen erfolgt. Dabei muss die Struktur der Tabelle in den PHP-Code eingebracht werden: Aus den HTMLAnweisungen, die eine Tabelle (2 Zeilen, zwei Spalten) definieren: <table > <tr> <td> </td> <td> </td> </tr> <tr> <td> </td> <td> </td> </tr> </table> wird hier: <?php $verbindung = mysql_connect("localhost","root","bfw"); mysql_select_db("schulung") or die ("Die Datenbank existiert nicht"); $list = mysql_query("select s.vorname,s.name from teilnehmer s, buchungen b, kurse k where k.kursnr=b.kursnr and b.s_nr=s.s_nr and k.kursnr='$kurs'"); while ($row=mysql_fetch_array($list)){ echo "<table ><tr> <td width='200'>"; echo $row["vorname"]."</td> <td width='200'>"; echo $row["name"]."</td></tr>"; echo "</table>"; } ?> </body></html> 72 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Im Einzelnen: echo "<table ><tr> <td width='200'>"; In der Zeile oben wird die Tabelle eröffnet, die erste Zeile <tr> und die erste Spalte <td> wird definiert. echo $row["vorname"]."</td> <td width='200'>"; Dann ist die Auflistung des Vornamens aus dem Array an der Reihe, die Tabellenzelle geht wieder zu "</td>und die nächste Zelle wird eröffnet: <td width='200'>"; Jetzt wird der Name aufgelistet, die Tabellenzelle geht wieder zu, die nächste Reihe beginnt: echo $row["name"]."</td></tr>"; Und schließlich ist die Tabelle wieder zu: echo "</table>"; 10.6 Verbessern des Moduls: Auflistung von Teilnehmern nach Kursbelegung Zur Ergänzung der Aufgabenstellung soll noch folgende Ergänzung programmiert werden: Wenn zu einem Kurs kein Teilnehmer erfasst worden ist, dann soll dies wie in der Abbildung als Meldung erfolgen. Allerdings soll diese Meldung ("Kein Teilnehmer hat diesen Kurs gebucht") nicht schon ganz zu Anfang sichtbar sein, also dann, wenn noch gar keine Nummer eingegeben worden ist. Ein Tipp: Mit der Funktion mysql_num_rows kann man herausbekommen, wievile Zeilen eine Abfrage ergeben hat. Wenn also beispielsweise 20 Teilnehmer zu einem Kurs vorhanden sind, ergibt der Code: $zeilen = mysql_num_rows($list); echo $zeilen; das Ergebnis 20 . Wenn also $Zeilen 0 ist, also keine Teilnehmer durch die Query herauskommen, dann wäre die Bedingung für den Satz "Kein Teilnehmer hat diesen Kurs gebucht" erfüllt. 73 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Das Programm-Modul "Schüler auflisten" von Herrn Baier: <!--schueler_list.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Schüler auflisten</title> </head> <body> <h2 align="center">Schüler auflisten</h2> <form action="loesch_bearbeit.php" method="post" > <?php echo '<a href="menu.php">zur&uuml;ck zur menu.php</a><br>'; include ("verbindung.php"); echo "Die Liste aller erfassten Schüler in der Datenbank:<br><br>"; echo "<table> <tr><td>Nummer</td><td>Vorname</td><td>Name</td><td>Bearbeiten</td><td>L&ouml ;schen</td></tr>"; $liste = mysql_query("select s_nr,vorname,name from teilnehmer"); while ($row=mysql_fetch_array($liste)){ echo"<tr><td>"; $nr=$row['s_nr']; echo "<input type='text' name='s_nr' value=".$nr ."></td><td> "; echo $row["vorname"]."</td><td> "; echo $row["name"] ."</td><td>"; echo"<input type='checkbox' name='bearbeiten' value='$nr'></td>"; echo"<td><input type='checkbox' name='loeschen' value='$nr'></td></tr>"; } ?> </table> <input type="Submit" name="abschicken" value="Abschicken"></td></tr> </form></body></html></html> Dadurch, dass die beiden Zeilen mit den Kontrollkästchen echo"<input type='checkbox' ..... Teil der Schleife sind, die für die Ausgabe des Arrays benötigt wurde, erscheint auch bei jedem Schüler das Kästchen zum Ankreuzen, ob Bearbeiten oder Löschen erfolgen soll. In der Zeile <form action="loesch_bearbeit.php" method="post" > wird die Weitergabe der Variablen in die Datei mit dem Namen loesch_bearbeit.php gesandt. In der Variablen $bearbeiten bzw. $loeschen ist die vom Programm übergebene Nummer des angekreuzten Teilnehmers. 74 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung In der Datei loesch_bearbeit.php muss geprüft werden, welcher der beiden Variablen den Wert enthält: if (isset ($bearbeiten) && ($bearbeiten) !=""){ echo "<h2 align='center'>Schülerdaten bearbeiten</h2>"; Wenn die Variable $bearbeiten gesetzt ist und nicht leer ist , dann wird der in der geschweiften Klammer folgende Teil ausgeführt. Weiter unten wird es entsprechend mit dieser Zeile für die andere Variable getestet: if (isset ($loeschen) && ($loeschen) !=""){ Aber zunächst zum Punkt Schülerdaten bearbeiten: Nachdem die if-Entscheidung gefällt wurde, welcher Modus (Löschen oder Bearbeiten) gewählt wird, muss der angekreuzte Teilnehmer gesucht werden: $sql=("select s_nr,vorname,name,strasse,hausnr,plz,ort,telefon,email from teilnehmer where s_nr=$bearbeiten"); $ergibt=mysql_query($sql); $row=mysql_fetch_assoc($ergibt); Weil es ja genau ein Teilnehmer sein soll, der zu suchen ist, können wir auf die Schleife verzichten und den Schüler mit der Funktion mysql_fetch_assoc( ) ausgeben. Auf S. 64 hatten wir das Formular zur Aufnahme von Schülern. für eine Zeile ist z. B. folgender HTML-Code zuständig: <input type="Text" name="vorname"> Hier soll nun eine Vorbelegung erfolgen , das heißt, in jedem der Textfelder soll das sichtbar werden, was in der Datenbanktabelle zu dem gesuchten Schüler gespeichert ist. Das geschieht im Textfeld über das tag <value ...> Wenn also in ein Feld für den Vornamen der konkrete Namen Peter einzufügen wäre, dann hieße es im Code: <input type="Text" name="vorname" value ="Peter"> statt des konkreten Vornamens muss hier aus der Datenbank eingefügt werden: <input type='Text' name='vorname' size='20'value='$row[vorname]'> Normalerweise müsste es heißen: $row['vorname'] (einfache Anführungszeichen) – weil hier die ganze Zeile aber sowieso schon in den Anführungszeichen von echo steht, kann es hier entfallen. Wenn die Ausgabe des HTML-Formularfeldes innerhalb von PHP erfolgt, muss es, wie gesagt, in der Ausgabe mittels echo erfolgen. Die input-Zeile oben sieht dann so aus: echo "<tr><td>Vorname:</td><td><input type='Text' name='vorname' size='20'value='$row[vorname]'></td></tr>"; Mit dem bisher besprochenen ist nur das Formular definiert. Die Weitergabe an die PHPDatei, in der dann schließlich der update-Befehl steht, ist diese: echo "<form action='update_schueler.php' method='post' >"; Und in diese Datei wird das übergeben, was in den Formularfeldern geändert wurde, aber nicht die Nummer des Schülers. Deshalb muss die noch separat in einem versteckten Textfeld übermittelt werden: echo "<input type='hidden' name='zahl' value='$bearbeiten'></input>"; 75 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Wird statt der Änderung das Löschen gewählt, dann wird nicht mehr zu einer anderen Datei verzweigt, sondern direkt gelöscht: if (isset ($loeschen) && ($loeschen) !=""){ echo "<br><br><b>Der Eintrag nr.: ".$loeschen." wurde Gel&ouml;scht!!</b>"; $abfrage="delete from teilnehmer where s_nr=$loeschen"; Hier folgt jetzt der komplette Code für die Datei loesch_bearbeit.php: <!--loesch_bearbeit.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Schüler löschen</title> </head> <body> <?php include ("db_connect.php"); if (isset ($bearbeiten) && ($bearbeiten) !=""){ echo "<h2 align='center'>Schülerdaten bearbeiten</h2>"; $sql=("select s_nr,vorname,name,strasse,hausnr,plz,ort,telefon,email from teilnehmer where s_nr=$bearbeiten"); $ergibt=mysql_query($sql); $row=mysql_fetch_assoc($ergibt); echo "<form action='update_schueler.php' method='post' >"; echo "<table align='center' width='400'>"; echo "<tr><td> Name:</td>"; echo "<td> <input type='Text' name='name' size='20' value='$row[name]'></td></tr>"; echo "<tr><td>Vorname:</td><td><input type='Text' name='vorname' size='20'value='$row[vorname]'></td></tr>"; echo "<tr><td> Strasse:</td><td><input type='Text' name='strasse' size='20'value='$row[strasse]'></td></tr>"; echo "<tr><td> Hausnummer:</td><td><input type='Text' name='hausnr' size='20'value='$row[hausnr]'></td></tr>"; echo "<tr><td>Postleitzahl:</td><td><input type='Text' name='plz' size='20'value='$row[plz]'></td></tr>"; echo "<tr><td>Ort:</td><td><input type='Text' name='ort' size='20'value='$row[ort]'></td></tr>"; echo "<tr><td>Telefon:</td><td><input type='Text' name='telefon' size='20'value='$row[telefon]'></td></tr>"; echo "<tr><td>E-Mail:</td><td><input type='Text' name='email' size='20'value='$row[email]'></td></tr>"; echo "<input type='hidden' name='zahl' value='$bearbeiten'></input>"; echo "<tr><td><input type='Submit' name='Aufnehmen' value='so soll es sein'></td></tr>"; echo "</table></form></body></html>"; } if (isset ($loeschen) && ($loeschen) !=""){ echo "<br><br><b>Der Eintrag nr.: ".$loeschen." wurde Gel&ouml;scht!!</b>"; $abfrage="delete from teilnehmer where s_nr=$loeschen"; $res = mysql_query($abfrage); if(!$res) {echo mysql_error(); } } echo '<br><br><a href="menu.php">zur&uuml;ck zur menu.php</a>'; ?> </body></html> 76 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Die Daten zum Ändern werden an die Datei update_schueler.php geschickt: <!--update_schueler.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Schüler auflisten</title> </head> <body> <h2 align="center">Schüler auflisten</h2> <?php include ("verbindung.php"); $abfrage="update teilnehmer set vorname='$vorname', name = '$name', strasse='$strasse', hausnr='$hausnr', ort='$ort', plz='$plz', telefon='$telefon', email='$email' where s_nr=$zahl"; $tues=mysql_query($abfrage); echo "Zum Vergleich noch mal die Änderungen:<br>"; echo $vorname." ".$name."<br>"; echo $strasse." ".$hausnr."<br>"; echo $plz." ".$xort."<br>"; echo '<br><br><a href="menu.php">zur&uuml;ck zur menu.php</a>'; ?> </body></html> Auf dem Monitor sehen Sie: 10.7 Ausgabe der Tabelle in ansprechender Formatierung Am Beispiel der Datei jo_list.php zeigt Jörn Johansen, wie die Ausgabe der Daten in guter HTML-Formatierung mit CSS erfolgen kann: 77 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung <!—jo_list.php--> <html><head> <style type="text/css"> p {font-family:verdana; font-size:16px; color:#006699;} </style></head> <body bgcolor="#a5b9cd" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <table width="700"> <tr><td width="100"></td> <td width="1" width="1" bgcolor="#990033"></td> <td width="298" bgcolor="#ffffff" style="padding:15px;"> <p style="font-size:24px; font-weight:bold; textalign:center;">Sch&uuml;lerliste</p><br> <?php include ("verbindung.php"); $abfrage="select s_nr, name, vorname, strasse, hausnr, plz, ort, telefon, email from teilnehmer group by name"; $result=mysql_query($abfrage); if(!$res) { echo mysql_error(); } while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "<p>".$row["vorname"]." <b><span style=\"color:#990033;\">".$row["name"]."</span></b><br>"; echo $row["strasse"]." ".$row["hausnr"]."<br>"; echo $row["plz"]." ".$row["ort"]."<br>"; echo $row["telefon"]."<br>"; echo $row["email"]."</p>"; } mysql_free_result($result); ?> </td> <td width="1" bgcolor="#990033"></td> </tr> </table></body></html> 10.8 Ausgabe von Feldnamen und Daten mit Schleifen Die Liste der Dozenten soll so ausgegeben werden: Dazu sollen die Feldnamen (Nr, Name, Vorname, Fachgebiet) nicht in den Code geschrieben werden, sondern aus der Tabelle der Datenbank selber gelesen werden2. Dies wäre 2 ich verwende hier ein Beispiel von Johann-Christian Hanke, in:PHP und MySQL auf der Homepage, S. 44 78 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung zwar für die wenigen Wörter hier kein Problem, aber es geht hier um den Beispielcharakter und die Übertragbarkeit auf andere Beispiele. Hier werden folgende MySQL-Funktionen verwendet: mysql_num_fields ermittelt die Anzahl der Felder mysql_num_rows ermittelt die Anzahl der Datensätze mysql_field_name liest die Feldnamen aus In der Datei geschieht folgendes: $sql = "select * from dozenten"; $result = mysql_query($sql); zuerst erfolgt die Abfrage aus der Tabelle Dozenten. Dann werden die MySQL-Funktionen angewandt, um die Anzahl der Felder und die Anzahl der Datensätze herauszubekommen. $felder = mysql_num_fields($result); $datensaetze = mysql_num_rows($result); Die Anzahl der Felder wird nach Beginn der Tabelle (echo ...-Zeilen) zur Steuerung einer Zählschleife verwendet. for ($i = 0;$i < $felder;$i++) { $feldname = mysql_field_name($result, $i); echo "<th>$feldname</th>"; } In der Variablen $felder ist die Anzahl der Felder gespeichert. Solange die Zahl i also kleiner als die Anzahl Felder ist, wird die Schleife durchlaufen. Durch die Variable $feldname wird der Name des Feldes dann ausgegeben, also Nr, Name, Vorname, Fachgebiet. Um die dann folgende foreach-Schleife zu erklären, muss noch etwas ausgeholt werden. foreach ($row as $key => $value){ .. Dem liegt hier folgendes zu Grunde: 10.8.1 Ausgabe aus assoziativen Arrays Stellen wir uns das Ganze zunächst einmal ohne Datenbank vor. Im assoziativen Array gibt es statt des Index (der Zahl, mit der die einzelnen Werte durchnummeriert sind) den key und den value: $vorname["Schmitz"]="Paul"; $vorname["Meyer"]="Peter"; $vorname["Lohmann"]="Anna"; $vorname["Guterson"]="Arne"; Der key ist Schmitz, Meyer, Lohmann und Guterson. Value sind die Vornamen. Im assoziativen Array $vorname sind nun die Vor- und Nachnamen enthalten. Man kann die Werte auch anders in das Array zuweisen: $vorname=array("Schmitz"=>"Paul","Meyer"=>"Peter","Lohmann"=>"Anna", "Guterson"=>"Arne"); Gelesen wird dies so: key Schmitz daraus folgt Paul, key Meyer daraus folgt Peter usw. (=> ist "daraus folgt") Jetzt kann das Array zunächst so ausgegeben werden: echo $vorname["Schmitz"]; echo $vorname["Meyer "]; echo $vorname["Lohmann"]; echo $vorname["Guterson"]; Je länger das Array ist, umso mühsamer. Deshalb bietet sich hier eine Kurzform an. 79 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Die Syntax allgemein sieht dabei so aus: foreach ($Array as $key => $value){ echo "$key=$value<br>"; Sie sehen, dass die Variablen tatsächlich als $key und $value anzusprechen sind. auf unser Beispiel bezogen: foreach ($vorname as $key => $value){ echo "$key=$value<br>"; } Aufgabe: Schreiben Sie zum Testen das Programm Array.php <?php $vorname=array("Schmitz"=>"Paul","Meyer"=>"Peter","Lohmann"=>"Anna", "Guterson"=>"Arne"); echo $vorname["Schmitz"]; echo $vorname["Meyer"]; echo $vorname["Lohmann"]; echo $vorname["Guterson"]."<br><br>"; foreach ($vorname as $key => $value){ echo "$key=$value<br>"; } ?> Es führt zur Ausgabe: Zurück zur Datenbank: Sehen Sie sich diese Struktur an: while ($row = mysql_fetch_assoc($result)) { foreach ($row as $key => $value) { echo "$value"; } Das Array, in den die Werte aus der Datenbank gelesen wurde, heißt $row. Mit genau derselben Struktur wie vorhin bei dem Name-Vorname-Beispiel wird nun alles ausgegeben. Nehmen wir zusätzlich noch die Tabellendefinition dazu, dann ergibt sich: while ($row = mysql_fetch_assoc($result)) { echo "<tr>"; // Zeile erzeugen foreach ($row as $key => $value) { echo "<td>$value</td>"; } echo "</tr>\n"; // Zeile schließen } 80 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Hier der vollständige Code der Datei dozenten_list.php: <!—dozenten_list.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Dozenten anzeigen</title> </head> <body> <h2>Liste der Dozenten</h2> <?php include ("verbindung.php"); $sql = "select * from dozenten"; $result = mysql_query($sql); $felder = mysql_num_fields($result); $datensaetze = mysql_num_rows($result); echo "<p>Anzahl der Datensätze: <b>$datensaetze</b></p>\n"; echo "<table border='1' cellspacing='0'>\n"; // Tabelle beginnen echo "<tr>"; // Zeile erzeugen for ($i = 0;$i < $felder;$i++) { $feldname = mysql_field_name($result, $i); echo "<th>$feldname</th>"; } echo "</tr>\n"; // Zeile schließen while ($row = mysql_fetch_assoc($result)) { echo "<tr>"; // Zeile erzeugen foreach ($row as $key => $value) { echo "<td>$value&nbsp;</td>"; } echo "</tr>\n"; // Zeile schließen } echo "</table>\n"; // Tabelle schließen ?> </body></html> Das verblüffend Gute an dieser Art der Programmierung ist nicht nur, dass man damit Schreibarbeit spart. Um statt der Ausgabe der Dozenten die Ausgabe der Kurse in folgender Form zu erreichen, muss im PHP-Code nur eine Stelle geändert werden(und die <h2>-Überschrift): Noch besser ist natürlich, wenn man vorher abfragt, welche Tabelle man sehen will, und den Rest über eine Variable steuert. Deshalb soll eine Datei namens list_form.php erstellt werden, die abfragt, welche Daten man sehen will. Die Entscheidung folgt über Radiobuttons. 81 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Der Code ist einfaches HTML. In der Variablen $tabelle wird gespeichert, was gewählt wurde. <!--list_form.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Tabelle anzeigen</title> </head> <body> <form action="list.php" method="POST"> <h2>Welche Tabelle wollen Sie sehen?</h2> <input type="radio" name ="tabelle" value="dozenten">Dozenten</input><br> <input type="radio" name ="tabelle" value="kurse">Kurse</input><br> <input type="radio" name ="tabelle" value="teilnehmer">Teilmehmer</input><br> <input type="radio" name ="tabelle" value="unternehmen">Unternehmen</input><br><br> <input type="submit" name="senden" value="Los geht's"></input> </form> </body></html> Die vorher schon erstellte Datei dozenten_list.php wird mit dem Namen list.php gespeichert und nur geringfügig geändert. Hier nur der Anfang, die beiden geänderten Stellen sind fett: <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Tabelle anzeigen</title> </head> <body> <?php echo "<h2>Auflistung der ".$tabelle."</h2>"; include ("verbindung.php"); $sql = "SELECT * FROM "; $sql.=$tabelle; .... Die beiden letzten Zeilen weisen der Variablen $sql zunächst nur "SELECT * FROM " zu (wichtig: Leerzeichen hinter from innerhalb der Anführungszeichen) Dann wird mit dem Punkt verkettet, so dass entweder select * from dozenten oder select * from kurse usw. herauskommt. 82 MySQL, PHP und HTML 10.9 Dynamische Website mit Datenbankanbindung Auflistung der Tabellen über PHP-Funktionen Bisher musste der Name der Tabellen noch manuell eingetragen werden (um diese Auswahl zu bekommen). Über zwei PHP-Funktionen, nämlich mysql_list_tables und mysql_tablename, kann dies noch automatisiert werden. (Danke für den Hinweis, Herr Baier!) Das PHP-Handbuch (php_manual_de.chm) zeigt den Gebrauch dieser Funktionen an den folgenden Beschreibungen und Codeausschnitten, zuerst zu mysql_list_tables: "mysql_list_tables ( string Datenbankname [, resource Verbindungs-Kennung]) mysql_list_tables() benötigt die Angabe eines Datenbanknamens und liefert eine Ergebniskennung ähnlich wie die Funktion mysql_query(). Um den aktuellen Tabellennamen aus der Ergebniskennung zu erhalten, können Sie die Funktion mysql_tablename() benutzen, oder irgendeine andere Funktion, die mit Ergebnistabellen umgehen kann, z.B.: mysql_fetch_assoc(). $result = mysql_list_tables($dbname); while ($row = mysql_fetch_row($result)) { print "Tabelle: $row[0]\n"; } Hier folgt die Beschreibung der zweiten genannten Funktion: "mysql_tablename() ermittelt aus einer Ergebnis-Kennung, die von mysql_list_tables() geliefert wurde, sowie einem Index vom Typ integer, den Namen der Tabelle. Die Funktion mysql_num_rows() kann verwendet werden, um die Anzahl der Tabellen in der Ergebnis-Kennung zu ermitteln. <?php mysql_connect("localhost", "mysql_user", "mysql_password"); $result = mysql_list_tables("mydb"); for ($i = 0; $i < mysql_num_rows($result); $i++) printf ("Table: %s\n", mysql_tablename($result, $i)); mysql_free_result($result); ?> Testen Sie dies bitte zunächst am Beispiel der PHP-Datei auflist1.php: <!--auflist1.php --> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Rechnung</title> </head> <body> <h2>Tabellen</h2> <?php include ("verbindung.php"); $result = mysql_list_tables(schulung); while ($row = mysql_fetch_row($result)) { print "Tabelle: $row[0]\n"."<br>"; } ?> </body></html> 83 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Das Ergebnis ist: Aufgabe: Testen Sie jetzt die Datei auflist2.php: <!--auflist2.php --> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Tabellen</title> </head> <body> <h2>Tabellen</h2> <?php include ("verbindung.php"); $result = mysql_list_tables("schulung"); for ($i = 0; $i < mysql_num_rows($result); $i++) printf ("Tabelle: %s\n", mysql_tablename($result, $i)); ?> </body></html> Sie liefert als Ergebnis: Beide Varianten beruhen darauf, dass die Zeile $result = mysql_list_tables(schulung); Die Namen der Tabellen ausliest und in die Variable $result übergibt. Nur die Art der Ausgabe ist anders, die Funktion mysql_tablename wird bei der ersten Variante gar nicht benötigt. Die Auswahl der Tabellen kann jetzt über ein Pull-Down-Listenfeld übernommen werden (Programm von Herrn Baier). Dabei werden die Tabellennamen in ein Formularfeld <select> ... </select> gebracht. Der zugrundeliegende HTML-Code ist folgender: <select name="test" > <option>Kurse</option> <option>Teilnehmer</option> <option>Dozenten</option> <option>Unternehmen</option> </select> 84 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Angewandt auf PHP (es müssen ja zunächst die Tabellen ausgelesen werden und in das select-Feld übernommen werden) ergibt sich das Programm tabellen_auswahl.php <!--tabellen_auswahl.php --> <html> <head> <link rel="stylesheet" href="standard.css" type="text/css" /> </head> <body> <form action="list.php" method="post" > <table align="center" width=200> <tr> <td width="200"> Auswahl:</td> <td height="200"> <select size="" name="tabelle"> <option>Bitte Tabelle Wählen </option> <? include ("verbindung.php"); $result = mysql_list_tables("schulung"); for ($i = 0; $i < mysql_num_rows($result); $i++) { echo "<option>".mysql_tablename($result, $i)."</option> "; } mysql_free_result($result); ?> </select> <input type="Submit" name="auflisten" value="auflisten"></td></tr> </form> </body></html> Sie sehen, wie hier zwischen <option> und </option> jeweils die Funktion mysql_tablename einen Wert ausgibt. Wenn man das Listenfeld aufklappt, dann sieht man die Auswahl der Tabellen: Die getroffene Auswahl wird gesendet in die Datei list.php, die wir schon vorher verwendet haben, um die Auswahl aus den Radiobutton-Formular aufzulisten. Hier soll die Datei noch einmal komplett gelistet werden: <!--list.php --> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Tabelle anzeigen</title> </head> <body> <?php echo "<h2>Auflistung der ".$tabelle."</h2>"; include ("verbindung.php"); $sql = "SELECT * FROM "; $sql.=$tabelle; $result = mysql_query($sql); $felder = mysql_num_fields($result); $datensaetze = mysql_num_rows($result); 85 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung echo "<p>Anzahl der Datensätze: <b>$datensaetze</b></p>\n"; echo "<table border='1' cellspacing='0'>\n"; // Tabelle beginnen echo "<tr>"; // Zeile erzeugen for ($i = 0;$i < $felder;$i++) { $feldname = mysql_field_name($result, $i); echo "<th>$feldname</th>"; } echo "</tr>\n"; // Zeile schließen while ($row = mysql_fetch_assoc($result)) { echo "<tr>"; // Zeile erzeugen foreach ($row as $key => $value) { echo "<td>$value&nbsp;</td>"; } echo "</tr>\n"; // Zeile schließen } echo "</table>\n"; // Tabelle schließen ?> </body></html> 10.10 Automatisches Ausfüllen des Radiobutton-Moduls Die Technik, die Tabellennamen automatisch auszulesen, soll jetzt verwendet werden, um auch in das Radiobutton-Auswahlprogramm die Tabellen automatisch auszufüllen. Es hatte diese Form: Der auf Seite 83 verwendete HTML-Code dazu war dieser: <input type="radio" name ="tabelle" value="dozenten">Dozenten</input><br> Jede einzelne der Tabellen musste in ein Input-Type="radio"- Feld hinein. Wenn der PHP-Code in der Datei so verwendet wird, ergibt sich: <!--list_auto.php--> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Tabelle anzeigen</title> </head><body> <h2>Welche Tabelle wollen Sie sehen?</h2> <form action="list.php" method="POST"> <?php include ("verbindung.php"); $result = mysql_list_tables("schulung"); for ($i = 0; $i < mysql_num_rows($result); $i++) { echo "<input type='radio' name ='tabelle' value=".mysql_tablename($result, $i).">".mysql_tablename($result, $i)."</input><br>"; } mysql_free_result($result); ?> <input type="Submit" name="auflisten" value="auflisten"> </form> </body></html> Sie sehen, dass jetzt in der For-Schleife im PHP-Teil das input-Type="radio" –Feld aufgeführt wird. Als value ergibt sich =".mysql_tablename($result, $i) .Die Funktion mysql_tablename wird dann noch einmal verwendet, so wie vorher die Formulierung war: value="dozenten">Dozenten ....Das erste ist der zu übergebende Wert, das zweite das, was im Formular zu lesen ist. 86 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung 10.11 Rechnungen schreiben: Auswahl aus drei verbundenen Tabellen Der folgende HTML-Code liefert das darunter abgebildete Formular: <!--rechnung_form.php --> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Gebuchte Kurse</title> </head> <body> <h2>Rechnung schreiben</h2> <form action="rechnung.php" method="post" > <table align="center" width=200> <tr> <td width="200"> Schüler-Nr:</td> <td heigth="200"> <input type="Text" name="nr" size="5" </td></tr> <tr><td> <input type="Submit" name="auflisten" value="auflisten"></td></tr> </table></form> </body></html> Wenn z. B der Schüler Nr. 7 eingetragen wird, dann soll sich ergeben: Dazu sind wieder die drei Tabellen erforderlich, die schon auf S. 72 aufgeführt waren: kurse buchungen 87 teilnehmer MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Die ausgewählte Schüler-Nr wird an die Datei rechnung.php gesandt. Dort geschieht folgendes: if (isset ($nr)&& $nr !=""){ $briefkopf=mysql_query("select name, vorname, strasse, hausnr, plz, ort from teilnehmer where s_nr='$nr'"); $zeilen = mysql_num_rows($briefkopf); if ($zeilen>0){ Wenn die Variable $nr gesetzt ist und wenn sie nicht leer ist, erfolgt eine SQL-Abfrage für die Daten, die für die Rechnungsadresse erforderlich sind. Dann prüft PHP, wieviele Zeilen dies sind, und macht dann eine if-Abfrage, ob es mehr als Zeilen sind. Sonst würde gemeldet: Dieser Teilnehmer hat keinen Kurs gebucht! Wenn es aber mindestens eine Zeile ist, wird die Adresse ausgegeben: while ($row=mysql_fetch_array($briefkopf)){ echo $row["vorname"]." "; echo $row["name"] ."<br>"; echo $row["strasse"] ." ".$row[hausnr]."<br><br>"; echo $row["plz"] ." ".$row[ort]"; echo "<br><br><br><br><br><br>"; } Danach erfolgt eine weitere Abfrage, mit der in der Tabelle kurs, Felder kursnr, titel, preis ausgelesen wird, welche Kurse von dem Teilnehmer mit der ioben eingegebenen Nummer gebucht wurden. $rechnung = mysql_query("select k.kursnr, k.titel, k.preis from teilnehmer t, buchungen b, kurse k where k.kursnr=b.kursnr and b.s_nr=t.s_nr and t.s_nr='$nr'"); Dann folgt die übliche while-Schleife zum Auslesen und Ausgeben der Daten: while ($row=mysql_fetch_array($rechnung)){ echo "<tr>"; echo "<td>".$row["kursnr"]."</td>"; echo "<td>".$row["titel"]."</td>"; echo "<td>".$row["preis"]."</td></tr>"; Auch der Preis wird zuerst für jeden einzelnen gebuchten Kurs gelesen, dann aber zusätzlich einer neuen Variablen sum1 zugewiesen. In der weiteren Variablen $gesamt erfolgt die Aufrechnung: $gesamt=$gesamt+$sum1 Das Ganze erfolgt ja noch in der while-Schleife, mit der alle Kurse, die der Teilnehmer belegt hatte, ausgeben wurden. Für jeden Datensatz wird die Schleife noch einmal neu durchlaufen, deshalb kann hier aufsummiert werden. Schließlich erfolgt die Ausgabe in formatierter Form mit zwei Dezimalstellen sprintf("%01.2f",$gesamt). $sum1=$row["preis"]; $gesamt=$gesamt+$sum1."</td></tr>"; } $gesamt = sprintf("%01.2f",$gesamt); Im PHP-Handbuch lesen Sie Erläuterungen zur Funktion sprintf():: Beispiel 3. sprintf(): Währungsformatierung $money1 = 68.75; $money2 = 54.35; $money = $money1 + $money2; // echo $money wird "123.1" ausgeben $formatiert = sprintf ("%01.2f", $money); // echo $formatiert wird "123.10" ausgeben 88 MySQL, PHP und HTML Dynamische Website mit Datenbankanbindung Die Formatierung ist also für den Fall erforderlich, dass Werte mit weniger als den zwei üblichen Dezimalstellen ausgerechnet würden (beim Addieren der Kursgebühren kommt es der umgekehrte Fall ja nicht vor, dass also mehr als zwei Kommastellen auftauchen würden) Das komplette Programm rechnung.php im Zusammenhang: <!--rechnung.php --> <html><head> <link rel="stylesheet" href="standard.css" type="text/css"> <title>Rechnung</title> </head> <body> <h2>Rechnung</h2> <?php include ("verbindung.php"); if (isset ($nr)&& $nr !=""){ $briefkopf=mysql_query("select name, vorname, strasse, hausnr, plz, ort from teilnehmer where s_nr='$nr'"); $zeilen = mysql_num_rows($briefkopf); if ($zeilen>0){ while ($row=mysql_fetch_array($briefkopf)){ echo $row["vorname"]." "; echo $row["name"] ."<br>"; echo $row["strasse"] ." ".$row[hausnr]."<br><br>"; echo $row["plz"] ." ".$row[ort]"; echo "<br><br><br><br><br><br>"; } } else { echo "Dieser Teilnehmer hat keinen Kurs gebucht!"; } } echo "Wir berechnen Ihnen für die von Ihnen gebuchten Kurse:<br><br><br>"; $rechnung = mysql_query("select k.kursnr, k.titel, k.preis from teilnehmer t, buchungen b, kurse k where k.kursnr=b.kursnr and b.s_nr=t.s_nr and t.s_nr='$nr'"); $zeilen = mysql_num_rows($rechnung); if ($zeilen>0){ echo "<table>"; while ($row=mysql_fetch_array($rechnung)){ echo "<tr>"; echo "<td>".$row["kursnr"]."</td>"; echo "<td>".$row["titel"]."</td>"; echo "<td>".$row["preis"]."</td></tr>"; $sum1=$row["preis"]; $gesamt=$gesamt+$sum1."</td></tr>"; } $gesamt = sprintf("%01.2f",$gesamt); echo "<td><b>Summe:</td><td></td><td>".$gesamt."</b></td>"; echo "</table>"; } ?> </body></html> 89