Kapitel F Programmierung von MySQL–Datenbanken mit PHP
In diesem Abschnitt wird beschrieben, wie man die dynamische Schnittstelle zwischen dem Betrachter einer Internet-Seite und den Inhalten einer MySQL-Datenbank erzeugt.
F.1 Verbindung aufnehmen, Datensätze anzeigen  
Dem Benutzer kann mit Hilfe von PHP-Programmen eine komfortable Schnittstelle zum Erzeugen, Anzeigen, Ändern und Löschen von Datensätzen aus einer MySQL-Datenbank zur Verfügung gestellt werden.
Struktur-Entwurf vorher
Die Erzeugung der Datenbank und der Struktur-Entwurf werden vorher vom Entwickler unter MySQL durchgeführt (siehe vorherigen Abschnitt).
Zunächst ein Programm zur Anzeige aller Datensätze aus der Datenbank firma, Tabelle personen:
Listing F.1 Datei uf01.php
<html>
<body>
<?php
$db = mysql_connect();
$res = mysql_db_query("firma",
"select * from personen");
$num = mysql_num_rows($res);
echo "$num Datensätze gefunden<br>";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$vn = mysql_result($res, $i, "vorname");
$pn = mysql_result($res, $i, "personalnummer");
$ge = mysql_result($res, $i, "gehalt");
$gt = mysql_result($res, $i, "geburtstag");
echo "$nn, $vn, $pn, $ge, $gt <br>";
}
mysql_close($db);
?>
</body>
</html>
Programm und Erläuterung erscheinen zunächst etwas umfangreich. Man wird allerdings feststellen, dass die meisten Programm-Schritte typisch für Datenbank-Programme sind. Sie kommen in vielen PHP-Programmen vor, die Zugriff auf Datenbanken nehmen.
Erläuterung des Programmes:
mysql_connect
|
Die Funktion mysql_connect() öffnet eine Verbindung zum MySQL-Datenbank-Server. In den Klammern können bis zu drei Parameter stehen: Hostname, Benutzername und Kennwort. Es soll vereinfachend angenommen werden, daß es sich um den Hostnamen localhost handelt, den Standard-Benutzer und ein leeres Kennwort. |
Verbindungs-Kennung
|
Falls die Verbindung erfolgreich aufgebaut wurde, so liefert die Funktion eine Verbindungs-Kennung zurück (hier in der Variablen $db). Die Verbindungs-Kennung wird später noch benötigt, um die Verbindung wieder zu schließen. |
mysql_db_query
|
Die Funktion mysql_db_query() führt eine Abfrage mit select in der Datenbank firma aus. Die Abfrage soll alle Datensätze der Tabelle personen liefern. Der Aufbau der Abfrage entspricht der betreffenden SQL-Anweisung, allerdings sollte kein Semikolon am Ende gesetzt werden. |
Ergebnis-Kennung
|
Falls die Abfrage erfolgreich war, so liefert die Funktion eine Ergebnis-Kennung zurück (hier in der Variablen $res). Die Ergebnis-Kennung wird anschließend benötigt, um das Ergebnis zu untersuchen. |
mysql_num_rows
|
Die Funktion mysql_num_rows() liefert die Anzahl der Datensätze zurück (hier in der Variablen $num), die mit der Abfrage ermittelt wurde. Dabei wird die Abfrage eindeutig über die zuvor ermittelte Ergebnis-Kennung (hier $res) zugeordnet. |
|
Die Anzahl wird zur Information ausgegeben (echo $num Datensätze gefunden ...). |
for-Schleife
|
Es wird eine for-Schleife verwendet, um alle Datensätze des Ergebnisses auszugeben. Diese Schleife beginnt bei 0 (Nummer des ersten Datensatzes) und endet bei num-1 (Nummer des letzten Datensatzes). |
mysql_result
|
Innerhalb der Schleife wird jeweils der Inhalt eines Feldes (name, vorname, ... ) des Datensatzes ermittelt. Dies geschieht mit Hilfe der Funktion mysql_result(). Ihr wird beim Aufruf die Ergebniskennung, die gewünschte Nummer ($i) aus dem Abfrage-Ergebnis ($res) und der Name des Feldes übergeben. Der Feldinhalt wird jeweils einer Variablen zugewiesen ($nn, $vn, ... ). Die Namen der Felder müssen genau denen der Tabelle entsprechen. |
|
Am Ende der Schleife werden die fünf Feldinhalte, die in den fünf Variablen gespeichert wurden, ausgegeben. |
|
Zu guter Letzt wird die Verbindung zum Datenbank-Server mit Hilfe der Funktion mysql_close() wieder geschlossen. |
Die Ausgabe sieht aus wie folgt (vorausgesetzt, es handelt sich noch um die Original-Tabelle des Beispieles):
Abbildung F.1 Die erste Datenbank-Ausgabe
|
Im weiteren Verlauf des Abschnittes werden noch Möglichkeiten zur übersichtlicheren Ausgabe der Daten erläutert wie z. B. in einer HTML-Tabelle.
F.2 Datensätze auswählen  
select
In einem PHP-Programm können alle Möglichkeiten zur weiteren Auswahl von Datensätzen durch SQL-Anweisungen angewendet werden. Die Einschränkung mit where, Vergleichsoperatoren, logische Operatoren, like-Operator, Sortierungen mit order by usw. führen zu den bereits bekannten Ergebnissen.
F.2.1 Erstes Beispiel  
Ein Beispiel mit ausgewählten Feldern, where, Vergleichsoperator, logischem Operator und sortierter Ausgabe:
Listing F.2 Datei uf02.php
<html>
<body>
<?php
$db = mysql_connect();
$sqlab = "select name, gehalt from personen";
$sqlab .= " where gehalt >= 3000";
$sqlab .= " and gehalt <= 3700";
$sqlab .= " order by gehalt desc";
$res = mysql_db_query("firma", $sqlab);
$num = mysql_num_rows($res);
echo "$num Datensätze gefunden<br>";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$ge = mysql_result($res, $i, "gehalt");
echo "$nn, $ge <br>";
}
mysql_close($db);
?>
</body>
</html>
SQL-Anweisung speichern
Es werden alle Personen angezeigt, deren Gehalt zwischen 3000 DM und 3700 DM liegt, sortiert nach geringer werdendem Gehalt. Die Abfrage besteht aus einer längeren SQL-Anweisung. Aus Gründen der Übersichtlichkeit wurde sie zunächst in mehreren Schritten in einer PHP-Variablen ($sqlab) gespeichert. Dabei ist besonders auf die Leerzeichen zwischen den einzelnen Angaben zu achten (hier vor where, vor and und vor order by).
Die Funktion mysql_db_query() wird mit dieser Variablen als zweitem Parameter aufgerufen:
$res = mysql_db_query("firma", $sqlab);
Innerhalb der Schleife werden nur noch die Inhalte der Felder name und gehalt aus dem Datensatz extrahiert. Die anderen Felder stehen über die Variable $res nicht zur Verfügung, da die SQL-Anweisung sie nicht beinhaltete. Die Ausgabe sieht so aus:
Abbildung F.2 Auswahl aus der Datenbank
|
F.2.2 Zweites Beispiel  
Ein Beispiel mit dem like-Operator:
Listing F.3 Datei uf03.php
<html>
<body>
<?php
$db = mysql_connect();
$sqlab = "select name, vorname from personen";
$sqlab .= " where name like 'M%' order by name";
$res = mysql_db_query("firma", $sqlab);
$num = mysql_num_rows($res);
echo "$num Datensätze gefunden<br>";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$vn = mysql_result($res, $i, "vorname");
echo "$nn, $vn <br>";
}
mysql_close($db);
?>
</body>
</html>
like, Hochkommata
Es werden alle Personen angezeigt, deren Namen mit dem Buchstaben M beginnen. Dabei ist besonders auf die einfachen Hochkommata (bei name like 'M%') zu achten.
Übung UF04
Schreiben Sie ein PHP-Programm zur Anzeige aller Datensätze aus der Tabelle fp der Datenbank hardware (Datei uf04.php).
Übung UF05
Zeigen Sie mit einem PHP-Programm aus der o. a. Tabelle nur noch bestimmte Datensätze (Datei uf05.php). Es sollen alle Festplatten mit allen Angaben angezeigt werden, die eine Kapazität von mehr als 10 000 MB haben und weniger als 300 DM kosten, nach MB absteigend sortiert.
Übung UF06
Zeigen Sie mit einem PHP-Programm aus der o. a. Tabelle nur noch bestimmte Datensätze (Datei uf06.php). Es sollen alle Festplatten mit allen Angaben angezeigt werden, die im ersten Halbjahr 1998 erstmalig produziert wurden.
F.3 Ausgabe in eine HTML-Tabelle  
Tabellen-Ausgabe
Eine Ausgabe wird in Tabellenform wesentlich übersichtlicher. Dazu müssen nur die HTML-Markierungen zur Erzeugung einer Tabelle (siehe Abschnitt zu HTML) an geeigneter Stelle in das PHP-Programm integriert werden. Es folgt ein Beispiel zur Anzeige aller Datensätze aus der Datenbank firma, Tabelle personen in Tabellenform mit Überschrift:
Listing F.4 Datei uf07.php
<html>
<body>
<?php
$db = mysql_connect();
$res = mysql_db_query("firma", "select * from personen");
$num = mysql_num_rows($res);
// Tabellenbeginn
echo "<table border>";
// Überschrift
echo "<tr> <td>Lfd.Nr.</td> <td>Name</td>";
echo "<td>Vorname</td> <td>Personalnummer</td>";
echo "<td>Gehalt</td> <td>Geburtstag</td> </tr>";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$vn = mysql_result($res, $i, "vorname");
$pn = mysql_result($res, $i, "personalnummer");
$ge = mysql_result($res, $i, "gehalt");
$gt = mysql_result($res, $i, "geburtstag");
$lf = $i + 1;
// Tabellenzeile mit -zellen
echo "<tr> <td>$lf</td> <td>$nn</td> <td>$vn</td>";
echo "<td>$pn</td> <td>$ge</td> <td>$gt</td> </tr>";
}
// Tabellenende
echo "</table>";
mysql_close($db);
?>
</body>
</html>
Zunächst wird das Abfrage-Ergebnis ermittelt. Es folgt der Tabellenbeginn (<table border>) und eine Überschriftszeile (<tr> bis </tr>). Innerhalb der Schleife wird zusätzlich zu den Feldinhalten eine laufende Nummer ermittelt. Diese wird gemeinsam mit den Feldinhalten Zeile für Zeile ausgegeben. Die Tabelle wird nach der Schleife geschlossen (</table>). Die Ausgabe findet sich in Abbildung F.3:
Abbildung F.3 Datenbank-Tabelle als HTML-Tabelle
|
F.4 Auswahl von Daten über ein Such-Formular  
Such-Formular
Ein Benutzer möchte natürlich nicht immer nur die gleichen Daten aus einer Datenbank sehen, sondern selber eine Auswahl treffen. Dies wird ihm durch die Eingabe von Werten in Formulare ermöglicht.
F.4.1 Erstes Beispiel  
Suchen nach Zahlenwerten
Im nachfolgenden Beispiel hat er die Möglichkeit, zwei Zahlen einzugeben. Diese dienen bei der Abfrage als Untergrenze bzw. Obergrenze für das Feld gehalt. Er kann also bei jeder Abfrage selber festlegen, welcher Gehaltsgruppe die angezeigten Personen angehören sollen. Zunächst das Formular:
Abbildung F.4 Ein Such-Formular
|
Der HTML-Programmcode:
Listing F.5 Datei uf08.htm
<html>
<body>
Anzeige der Personen mit einem Gehalt zwischen:
<form action = "uf08.php" method = "post">
<input name = "ug"> Untergrenze<p>
und <p>
<input name = "og"> Obergrenze<p>
<input type = "submit">
<input type = "reset">
</form>
</body>
</html>
Innerhalb des Formulares werden die beiden Werte in den Eingabefeldern ug und og aufgenommen. Deren Inhalte stehen dem PHP-Programm nach dem Absenden zur Verfügung. Das Programm sieht folgendermaßen aus:
Listing F.6 Datei uf08.php
<html>
<body>
<?php
$db = mysql_connect();
$sqlab = "select name, gehalt from personen";
$sqlab .= " where gehalt >= $ug";
$sqlab .= " and gehalt <= $og";
$res = mysql_db_query("firma", $sqlab);
$num = mysql_num_rows($res);
if ($num==0)
echo "keine passenden Datensätze gefunden";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$ge = mysql_result($res, $i, "gehalt");
echo "$nn, $ge<br>";
}
mysql_close($db);
?>
</body>
</html>
Innerhalb der SQL-Anweisung finden sich nach dem where die Variablen $ug und $og zur Eingrenzung der ausgegebenen Datenmenge. Diese Variablen beinhalten die beiden Eingabewerte des Benutzers.
Falls ein Bereich angegeben wurde, in dem sich kein Datensatz befindet, so hat die Variable $num den Wert 0 und es wird die Meldung »keine passenden Datensätze gefunden« ausgegeben. Dies empfiehlt sich statt eines leeren Ausgabe-Bildschirmes, um dem Benutzer zu zeigen, daß seine Anfrage auch bearbeitet wurde.
F.4.2 Zweites Beispiel  
Suchen nach Zeichenketten
Bei der Abfrage von Zeichenketten-Feldern muss auf die einfachen Hochkommata geachtet werden. Der Operator like und die Platzhalter % und _ können in gewohnter Weise eingesetzt werden.
Mit Hilfe des Formulares aus dem nachfolgenden Beispiel kann der Benutzer nach allen Personen suchen lassen, deren Namen mit den eingegebenen Anfangsbuchstaben beginnen. Hier zunächst das Formular:
Listing F.7 Datei uf09.htm
<html>
<body>
Anzeige der Personen mit folgenden Anfangsbuchstaben:
<form action = "uf09.php" method = "post">
<input name = "anf"> <p>
<input type = "submit">
<input type = "reset">
</form>
</body>
</html>
Innerhalb des Formulares werden die Anfangsbuchstaben im Eingabefeld anf aufgenommen. Das PHP-Programm sieht wie folgt aus
Listing F.8 Datei uf09.php
<html>
<body>
<?php
$db = mysql_connect();
$sqlab = "select name, vorname from personen";
$sqlab .= " where name like '$anf%' ";
$res = mysql_db_query("firma", $sqlab);
$num = mysql_num_rows($res);
if ($num==0)
echo "keine passenden Datensätze gefunden";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$vn = mysql_result($res, $i, "vorname");
echo "$nn, $vn<br>";
}
mysql_close($db);
?>
</body>
</html>
Innerhalb der SQL-Anweisung findet sich der Ausdruck where name like '$anf%'. Die Variable $anf wird durch den aktuellen Inhalt des Eingabefeldes ersetzt, das Prozentzeichen steht für beliebig viele folgende Buchstaben.
F.4.3 Drittes Beispiel  
Formular-Elemente
Eine Abfrage kann dem Benutzer durch die Verwendung von weiteren Formularelementen (Optionsgruppen = Radio-Buttons, Kontrollkästchen = Checkboxen, Auswahl-Menüs = Select-Menüs) erleichtert werden. Diese wurden bereits im Abschnitt über Formulare vorgestellt.
Mit Hilfe des nachfolgenden Beispieles können Personen aus bestimmten Gehaltsgruppen angezeigt werden. Jede der Gehaltsgruppen ist mit einem Radio-Button verknüpft. Zunächst das Formular:
Listing F.9 Datei uf10.htm
<html>
<body>
Anzeige der Personen aus der ausgewählten Gehaltsgruppe:
<form action = "uf10.php" method = "post">
<input type="radio" name="geh" value="1" checked>
bis DM 3000 einschl. <p>
<input type="radio" name="geh" value="2">
ab DM 3000 bis DM 3500 einschl. <p>
<input type="radio" name="geh" value="3">
ab DM 3500 bis DM 5000 einschl. <p>
<input type="radio" name="geh" value="4">
ab DM 5000 <p>
<input type="submit">
<input type="reset">
</form>
</body>
</html>
Radio-Buttons
Die verwendeten Radio-Buttons haben alle den gleichen Namen (geh), dadurch bilden sie eine zusammengehörige Gruppe. Der vom Benutzer ausgewählte Button ist mit einem Wert (value) verbunden (1, 2, 3, oder 4). Dieser Wert wird dem PHP-Programm beim Absenden übermittelt. Nun das Formular:
Abbildung F.5 Formular mit Radio-Buttons
|
Abschließend das PHP-Programm:
Listing F.10 Datei uf10.php
<html>
<body>
<?php
$db = mysql_connect();
$sqlab = "select name, gehalt";
$sqlab .= " from personen where";
if ($geh==1)
$sqlab .= " gehalt <= 3000";
else if ($geh==2)
$sqlab .= " gehalt > 3000 and gehalt <= 3500";
else if ($geh==3)
$sqlab .= " gehalt > 3500 and gehalt <= 5000";
else
$sqlab .= " gehalt > 5000";
$res = mysql_db_query("firma", $sqlab);
$num = mysql_num_rows($res);
if ($num==0)
echo "keine passenden Datensätze gefunden";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$ge = mysql_result($res, $i, "gehalt");
echo "$nn, $ge<br>";
}
mysql_close($db);
?>
</body>
</html>
Die übermittelte Variable $geh wird mit Hilfe einer geschachtelten Verzweigung mit if-else untersucht. Je nach Wert der Variablen wird eine von mehreren möglichen SQL-Anweisungen gebildet. Diese kommt zur Ausführung und liefert die gewünschten Daten.
Übung UF11
Zeigen Sie mit einem PHP-Programm aus der Tabelle fp der Datenbank hardware Festplatten aus bestimmten Preisgruppen an. Die Preisgruppen (bis 200 DM einschl., ab 200 DM bis 270 DM einschl., ab 270 DM alle) soll der Benutzer über Radio-Buttons auswählen können (Dateien uf11.htm und uf11.php).
Es sollen nur die Angaben zu Hersteller, Typ und Preis geliefert werden. Mit Hilfe eines Kontrollkästchens soll der Benutzer entscheiden können, ob er eine Sortierung der Ausgabe nach Hersteller-Name wünscht. Das Formular könnte folgendes Aussehen haben:
Abbildung F.6 Formular mit Kontrollkästchen und Radio-Buttons
|
Übung UF12
Zeigen Sie mit einem PHP-Programm aus der o. a. Tabelle nur noch Festplatten eines Herstellers an (Dateien uf12.htm und uf12.php). Der Benutzer soll den gewünschten Hersteller (Fujitsu, Quantum oder Seagate) über ein Select-Menü auswählen. Das Formular könnte folgendes Aussehen haben:
Abbildung F.7 Formular mit Auswahl-Menü
|
Die Daten sollen vollständig in Form einer HTML-Tabelle mit einer Überschrift angezeigt werden, wie nachfolgend angegeben:
Abbildung F.8 Auswahl aus Datenbank mit HTML-Tabellenausgabe
|
F.5 Datensätze erzeugen  
Neue Datensätze eintragen
Bestimmten Benutzern kann es auch gestattet werden, weitere Datensätze zu erzeugen. Die Berechtigung dazu kann über den Benutzernamen und das Kennwort bei Aufbau der Datenbank-Verbindung oder über eine zusätzliche Passwort-Eingabe geklärt werden.
Es soll vereinfacht angenommen werden, dass jeder Benutzer Datensätze hinzufügen (und in den nachfolgenden Abschnitten auch ändern und löschen) kann. Es folgt ein Beispiel für ein Eingabe-Formular.
Abbildung F.9 Eingabe-Formular für neue Datensätze
|
Zunächst der Programmcode:
Listing F.11 Datei uf13.php
<html>
<head>
<?php
if ($gesendet)
{
$db = mysql_connect();
$sqlab = "insert personen";
$sqlab .= "(name, vorname, personalnummer,";
$sqlab .= " gehalt, geburtstag) values ";
$sqlab .= "('$na', '$vn', $pn, $ge, '$gt')";
mysql_db_query("firma", $sqlab);
$num = mysql_affected_rows();
if ($num>0)
echo "Es wurde 1 Datensatz hinzugefügt<p>";
else
{
echo "Es ist ein Fehler aufgetreten, ";
echo "es wurde kein Datensatz hinzugefügt<p>";
}
mysql_close($db);
}
?>
</head>
<body>
Geben Sie einen vollständigen Datensatz ein und senden Sie das
Formular ab:
<form action = "uf13.php" method = "post">
<input name="na"> Name<p>
<input name="vn"> Vorname<p>
<input name="pn"> Personalnummer (eine ganze Zahl)<p>
<input name="ge"> Gehalt (Nachkommastellen mit Punkt)<p>
<input name="gt">
Geburtsdatum (in der Form JJJJ-MM-TT)<p>
<input type="submit" name="gesendet">
<input type="reset">
</form>
Alle Datensätze <a href="uf07.php">anzeigen</a>
</body>
</html>
Innerhalb des Programmes wird zunächst festgestellt, ob es sich um den ersten Aufruf handelt oder um eine weitere Eingabe. Dazu wird dem Absende-Button ein Name gegeben (hier: gesendet). Als Folge dieser Namensgebung existiert ab dem zweiten Aufruf des Programmes die Variable $gesendet. Zu Beginn des Programmes wird mit Hilfe der Abfrage if ($gesendet) festgestellt, ob die Variable $gesendet existiert:.
|
Beim ersten Aufruf der Datei trifft dies noch nicht zu, da das zugehörige Formular-Element erst weiter unten auftaucht. Daher wird das PHP-Programm nicht weiter ausgeführt. |
|
Bei einem späteren Aufruf der Datei existiert die Variable, daher wird das PHP-Programm weiter ausgeführt. |
insert
Die SQL-Anweisung insert entspricht einer Anfüge-Abfrage, sie wird (wie die select-Anweisung) mit Hilfe von mysql_db_query() abgesendet. Die Angaben hinter values entsprechen den Namen der Formular-Elemente, also den PHP-Variablen. Auf die Hochkommata bei den Variablen vom Typ Zeichenkette oder Datumsangabe muss besonders geachtet werden.
mysql_affected_rows
Die Funktion mysql_affected_rows() kann bei Aktions-Abfragen eingesetzt werden. Unter den Begriff Aktions-Abfragen fallen alle Abfragen zum Erzeugen (wie hier), Ändern und Löschen von Datensätzen. Die Funktion ermittelt die Anzahl der von der Aktion betroffenen (=affected) Datensätze.
In diesem Falle muss nur geprüft werden, ob diese Anzahl größer als 0 war. Ist dies der Fall, so war die Aktion erfolgreich, und der Benutzer wird über den Erfolg informiert. Ein unvollständiger oder falsch eingetragener Datensatz führt dazu, dass er nicht hinzugefügt wird. In diesem Falle wird der Benutzer über den Misserfolg informiert.
Innerhalb des Formulares gibt es fünf Eingabefelder für die Inhalte der fünf Datenbankfelder. Ihre Namen werden im PHP-Programm verwendet. Nach dem Formular folgt ein Hyperlink auf das PHP-Programm, das zur Auflistung aller Datensätze führt. Auf diese Weise kann man sich bei Bedarf schnell über die eingetragenen Werte informieren.
Erster Aufruf
Erinnerung: Während der Testphase möchte der Entwickler deutlich sehen, wie sich erster Aufruf und weitere Aufrufe voneinander unterscheiden. Ein Aktualisieren der Datei im Browser führt nicht zu einem neuen ersten Aufruf. Nur die Bestätigung der Adresse in der Adresszeile mit (¢) erzeugt einen ersten Aufruf ohne eine der beiden Meldungen über Erfolg bzw. Misserfolg.
Übung UF14
Ermöglichen Sie mit einem PHP-Programm das Hinzufügen von Datensätzen zu der Tabelle fp der Datenbank hardware (Datei uf14.php). Das Eingabe-Formular sollte folgendes Aussehen haben:
Abbildung F.10 Eingabe-Formular für neue Datensätze
|
F.6 Datensätze ändern  
Beim Ändern von Datensätzen sollte man sich genau überlegen, welche Änderungen bei welchen Datensätzen vorgenommen werden sollen. Handelt es sich um eine Änderung bei genau einem Datensatz, der evtl. einen falschen Eintrag hat, oder soll eine ganze Gruppe von Datensätzen durch eine Änderung aktualisiert werden? Beide typischen Vorgänge sollen an Beispielen gezeigt werden.
F.6.1 Änderung mehrerer Datensätze  
Mehrere Datensätze ändern
Nehmen wir an, daß auf Grund eines günstigen Geschäftsverlaufes die Gehälter aller Mitarbeiter um 5% erhöht werden sollten. Die nachfolgende HTML-Datei stellt zwei Möglichkeiten zur Verfügung:
|
Die Erhöhung soll durchgeführt werden (Aufruf des PHP-Programmes über einen Hyperlink). |
|
Alle Datensätze sollen zur Kontrolle angezeigt werden. |
Listing F.12 Datei uf15.htm
<html>
<body>
Alle Gehälter um 5% <a href = "uf15.php">erhöhen</a><p>
Alle Datensätze <a href = "uf07.php">anzeigen</a>
</body>
</html>
Beim Aufruf des PHP-Programmes wird die Änderung jedes Mal(!) durchgeführt:
Listing F.13 Datei uf15.php
<html>
<body>
<?php
$db = mysql_connect();
$sqlab = "update personen set gehalt = gehalt * 1.05";
mysql_db_query("firma", $sqlab);
$num = mysql_affected_rows();
echo "Es wurden $num Datensätze geändert<p>";
mysql_close($db);
?>
Alle Datensätze <a href="uf07.php">anzeigen</a>
</body>
</html>
update
Der Inhalt des Feldes gehalt wird mit Hilfe der SQL-Anweisung update bei allen Datensätzen verändert. Es wird der alte Wert genommen, mit dem Faktor 1,05 multipliziert, und das Ergebnis wird als neuer Wert in die Datenbank geschrieben.
F.6.2 Änderung eines bestimmten Datensatzes  
Änderung eines Datensatzes
Zur Veränderung eines einzelnen Datensatzes benötigt man eine Identifizierung des betreffenden Datensatzes. Diese ist mit einem eindeutigen Index innerhalb einer Tabelle gegeben.
Benutzerführung
Es empfiehlt sich folgende Vorgehensweise für eine komfortable Benutzerführung bei einer Änderung:
|
Dem Benutzer werden alle Datensätze angezeigt. |
|
Er wählt aus, welchen er ändern möchte. |
|
Er gibt die Änderungen ein. |
|
Er lässt sie durchführen. |
In der Tabelle personen liegt der eindeutige Index auf dem Feld personalnummer. Die beschriebene Vorgehensweise wird an einem Beispiel in folgenden Dateien realisiert:
|
Datei uf16a.php zur Anzeige aller Datensätze und Auswahl |
|
Datei uf16b.php zur Anzeige eines Datensatzes und Eingabe der Änderungen |
|
Datei uf16c.php zur Durchführung der Änderungen |
Anzeige und Auswahl
Auswahl des Datensatzes
Zunächst die Anzeige aller Datensätze in Tabellenform, mit Radio-Buttons zur Auswahl eines bestimmten Datensatzes:
Abbildung F.11 Auswahl eines Datensatzes zur Änderung
|
Zunächst der Programmcode:
Listing F.14 Datei uf16a.php
<html>
<body>
Wählen Sie aus, welcher Datensatz geändert werden soll:<p>
<form action = "uf16b.php" method = "post">
<?php
$db = mysql_connect();
$res = mysql_db_query("firma",
"select * from personen");
$num = mysql_num_rows($res);
// Tabellenbeginn
echo "<table border>";
// Überschrift
echo "<tr> <td>Auswahl</td> <td>Name</td>";
echo "<td>Vorname</td> <td>Personalnummer</td>";
echo "<td>Gehalt</td> <td>Geburtstag</td> </tr>";
for ($i=0; $i<$num; $i++)
{
$nn = mysql_result($res, $i, "name");
$vn = mysql_result($res, $i, "vorname");
$pn = mysql_result($res, $i, "personalnummer");
$ge = mysql_result($res, $i, "gehalt");
$gt = mysql_result($res, $i, "geburtstag");
// Tabellenzeile mit -zellen
echo "<tr> <td><input type='radio' name='auswahl'";
echo " value='$pn'></td> <td>$nn</td> <td>$vn</td>";
echo "<td>$pn</td> <td>$ge</td> <td>$gt</td> </tr>";
}
// Tabellenende
echo "</table>";
mysql_close($db);
?>
<p>
<input type="submit" value="Datensatz anzeigen">
</form>
</body>
</html>
Zusätzlich zur bisher bekannten Tabelle gibt es eine Spalte mit Radio-Buttons. Der Eintrag in dieser Spalte wird innerhalb des PHP-Programmes erzeugt mit:
<input type="radio" name="auswahl" value="$pn">
Radio-Buttons
Die Radio-Buttons bilden eine Options-Gruppe, da sie alle den gleichen Namen auswahl haben. Als Wert (value) der Radio-Buttons wird die jeweilige Personalnummer verwendet.
Der Benutzer wählt über den Radio-Button eine Datensatz aus. Die Personalnummer des ausgewählten Datensatzes wird beim Absenden an die Datei uf16b.php übermittelt.
Anzeige eines Datensatzes
Datensatz anzeigen
Der ausgewählte Datensatz wird mit allen Daten innerhalb eines Formulares angezeigt:
Abbildung F.12 Anzeige des ausgewählten Datensatzes
|
Es folgt der Programmcode:
Listing F.15 Datei uf16b.php
<html>
<body>
<?php
if ($auswahl)
{
$db = mysql_connect();
$sqlab = "select * from personen where";
$sqlab .= " personalnummer = $auswahl";
$res = mysql_db_query("firma", $sqlab);
$altnn = mysql_result($res, 0, "name");
$altvn = mysql_result($res, 0, "vorname");
$altge = mysql_result($res, 0, "gehalt");
$altgt = mysql_result($res, 0, "geburtstag");
echo "Führen Sie die Änderungen durch,<p>";
echo "betätigen Sie anschließend den Button<p>";
echo "<form action = 'uf16c.php' ";
echo " method = 'post'>";
echo "<input name='neunn' value='$altnn'>";
echo " Nachname<p>";
echo "<input name='neuvn' value='$altvn'> ";
echo " Vorname<p>";
echo "<input name='neupn' value='$auswahl'>";
echo " Personalnummer<p>";
echo "<input name='neuge' value='$altge'>";
echo " Gehalt<p>";
echo "<input name='neugt' value='$altgt'>";
echo " Geburtstag<p>";
echo "<input type='hidden' name='oripn' ";
echo " value='$auswahl'>";
echo "<input type='submit' ";
echo " value='Änderungen in DB speichern'><p>";
echo "<input type='reset'>";
echo "</form>";
mysql_close($db);
}
else
echo "Es wurde kein Datensatz ausgewählt<p>";
?>
</body>
</html>
Falls ein Datensatz ausgewählt wurde, wird die Auswahl des Datensatzes mit Hilfe der übermittelten Variablen auswahl durchgeführt.
select * from personen where personalnummer = $auswahl
Das Ergebnis umfasst genau einen Datensatz. Die alten Inhalte der Felder aus diesem Datensatz werden innerhalb der Eingabefelder des Formulares angezeigt (value='$altnn' ...). Dabei ist besonders auf die einfachen Hochkommata zu achten.
Alle Inhalte ändern
Der Benutzer kann die Inhalte teilweise oder alle ändern, und zwar auch die Personalnummer. Beim Absenden werden die geänderten Inhalte der Eingabefelder (name='neunn' ...) an die Datei uf16c.php übermittelt.
hidden
Gleichzeitig wird der Inhalt eines weiteren, versteckten Formularfeldes
<input type='hidden' name='oripn' value='$auswahl'>
mit der Original-Personalnummer übermittelt, die zur eindeutigen Identifizierung benötigt wird.
Solche versteckten Formular-Felder dienen nur der Übermittlung von nicht sichtbaren Daten von einer Datei zu einem Auswerte-Programm. Falls der Benutzer die Personalnummer geändert hat, würde die Information ansonsten nicht mehr zur Verfügung stehen.
Durchführung der Änderung
Nachfolgend wird die Änderung durchgeführt und bestätigt:
Abbildung F.13 Bestätigung der Änderung
|
Der Programmcode sieht wie folgt aus:
Listing F.16 Datei uf16c.php
<html>
<body>
<?php
$db = mysql_connect();
$sqlab = "update personen set name = '$neunn',";
$sqlab .= "vorname = '$neuvn',";
$sqlab .= "personalnummer = '$neupn',";
$sqlab .= "gehalt = '$neuge',";
$sqlab .= "geburtstag = '$neugt'";
$sqlab .= "where personalnummer = $oripn";
mysql_db_query("firma", $sqlab);
$num = mysql_affected_rows();
if ($num>0)
echo "Der Datensatz wurde geändert<p>";
else
echo "Der Datensatz wurde nicht geändert<p>";
mysql_close($db);
?>
Zurück zur <a href="uf16a.php">Auswahl</a>
</body>
</html>
update
Die SQL-Anweisung update führt die Änderung mit den neuen Inhalten durch:
update personen set name = '$neunn',
set vorname = '$neuvn', ...
Die Identifizierung des zu ändernden Datensatzes geschieht über die Original-Personalnummer:
... where personalnummer = $oripn
Falls die Änderung nicht durchgeführt werden konnte (z. B. bei Eingabe einer bereits vorhandenen Personalnummer) wird dies gemeldet.
Zur nächsten Änderung
Der Benutzer kann über den Hyperlink zurück zum Anfang, um weitere Datensätze zu ändern.
F.7 Datensätze löschen  
Löschen eines Datensatzes
Zum Löschen eines Datensatzes benötigt man wie beim Ändern eine Identifizierung des betreffenden Datensatzes über den eindeutigen Index.
Benutzerführung
Es empfiehlt sich folgende Vorgehensweise für eine sichere Benutzerführung bei einer Löschung:
|
Dem Benutzer werden alle Datensätze angezeigt. |
|
Er wählt aus, welchen er löschen möchte. |
|
Er lässt die Löschung durchführen. |
Die beschriebene Vorgehensweise wird an einem Beispiel in folgenden Dateien realisiert:
|
Datei uf17a.php zur Anzeige aller Datensätze und Auswahl |
|
Datei uf17b.php zur Durchführung der Änderungen |
Die Datei uf17a.php unterscheidet sich nur an drei Stellen von der Datei uf16a.php, daher wird sie hier nicht gesondert aufgeführt.
|
Das Wort »Löschen« wird zweimal ersetzt durch »Ändern«. |
|
Bei dem aufgerufenen PHP-Programm beim Absenden des Formulares handelt es sich um die Datei uf17b.php. |
Lösch-Vorgang
Die Auswahl des zu löschenden Datensatzes:
Abbildung F.14 Auswahl eines Datensatzes zur Löschung
|
Nachfolgend wird die Änderung durchgeführt und bestätigt:
Der Programmcode des Lösch-Vorganges:
Listing F.17 Datei uf17b.php
<html>
<body>
<?php
if ($auswahl)
{
$db = mysql_connect();
$sqlab = "delete from personen where";
$sqlab .= " personalnummer = '$auswahl'";
mysql_db_query("firma", $sqlab);
$num = mysql_affected_rows();
if ($num>0)
echo "Der Datensatz wurde gelöscht<p>";
else
echo "Der Datensatz wurde nicht gelöscht<p>";
mysql_close($db);
}
else
echo "Es wurde kein Datensatz ausgewählt<p>";
?>
Zurück zur <a href="uf17a.php">Auswahl</a>
</body>
</html>
Abbildung F.15 Bestätigung der Löschung
|
Eindeutig
identifizieren
Die Variable $auswahl beinhaltet die Personalnummer des ausgewählten Eintrages. Der zu löschende Datensatz kann damit eindeutig identifiziert werden. Falls kein Datensatz ausgewählt wurde, so existiert die Variable $auswahl nicht, und es wird eine entsprechende Meldung angezeigt.
Übung UF18
Ermöglichen Sie mit PHP-Programmen das Ändern von Datensätzen in der Tabelle fp der Datenbank hardware (Dateien uf18a.php bis uf18c.php).
Übung UF19
Ermöglichen Sie mit PHP-Programmen das Löschen von Datensätzen in der Tabelle fp der Datenbank hardware (Dateien uf19a.php und uf19b.php).
F.8 Alle Funktionen für MySQL  
Alle MySQL-Funktionen
Im vorliegenden Abschnitt und im Abschnitt H (Arrays) werden eine ganze Reihe von PHP-Funktionen für MySQL eingesetzt. Zur besseren Übersicht schließt sich eine Liste aller Funktionen mit einer kurzen Erläuterung derselben an. Weitergehende Ausführungen finden sich im PHP Manual.
Funktionsname |
Erläuterung |
mysql_affected_rows() |
Liefert die Anzahl betroffener Datensätze einer
vorhergehenden Aktionsabfrage |
mysql_change_user() |
Ändert den zur Zeit angemeldeten Benutzer |
mysql_close() |
Beendet eine Verbindung zum Datenbank-Server |
mysql_connect() |
Öffnet eine Verbindung zum Datenbank-Server |
mysql_create_db() |
Erzeugt eine neue Datenbank |
mysql_data_seek() |
Bewegt den Datensatz-Zeiger |
mysql_db_query() |
Ausführen einer Anfrage an die Datenbank |
mysql_drop_db() |
Löschen einer Datenbank (!) |
mysql_errno() |
Liefert die Fehlernummer einer zuvor ausgeführten MySQL-Operation |
mysql_error() |
Liefert den Fehlertext der zuvor ausgeführten
MySQL-Operation |
mysql_fetch_array() |
Liefert einen Datensatz als assoziatives Array
(s. Abschnitt H) |
mysql_fetch_field() |
Liefert Feldinformationen aus einem Abfrageergebnis |
mysql_fetch_lengths() |
Liefert die Länge jedes Feldes eines Datensatzes |
mysql_fetch_object() |
Liefert einen Datensatz als Objekt |
mysql_fetch_row() |
Liefert einen Datensatz als indiziertes Array (s. Abschnitt H) |
mysql_field_name() |
Liefert den Namen eines Feldes aus einem Abfrageergebnis |
mysql_field_seek() |
Setzt den Feldzeiger auf ein bestimmtes Feld |
mysql_field_table() |
Liefert den Namen der Tabelle, die das genannte Feld enthält |
mysql_field_type() |
Liefert den Typ eines Feldes aus einem Abfrageergebnis |
mysql_field_flags() |
Liefert die Flags eines Feldes aus einem Abfrageergebnis |
mysql_field_len() |
Liefert die Länge eines Feldes |
mysql_free_result() |
Entfernt ein Ergebnis |
mysql_insert_id() |
Liefert die Kennung einer vorherigen Anfüge-Abfrage mit INSERT |
mysql_list_fields() |
Listet die Felder einer Tabelle auf (s. Abschnitt H) |
mysql_list_dbs() |
Liefert eine Liste der verfügbaren Datenbanken auf dem Server (s. Abschnitt H) |
mysql_list_tables() |
Liefert eine Liste der Tabellen in einer Datenbank
(s. Abschnitt H) |
mysql_num_fields() |
Liefert die Anzahl der Felder in einem Ergebnis |
mysql_num_rows() |
Liefert die Anzahl der Datensätze im Ergebnis |
mysql_pconnect() |
Öffnet eine dauerhafte Verbindung zum MySQL-Server |
mysql_query() |
Sendet eine SQL-Abfrage zum Datenbankserver |
mysql_result() |
Liefert Ergebnis |
mysql_select_db() |
Wählt eine Datenbank aus |
mysql_tablename() |
Liefert den Namen einer Tabelle |
|