- RobertKrah.de

Werbung
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ü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ö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ö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ü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ü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ü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 </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 </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
Herunterladen