Galileo Computing <openbook>
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


PHP 4 von Thomas Theis
Webserver-Programmierung für Einsteiger
Zum Katalog
gp Kapitel F Programmierung von MySQL–Datenbanken mit PHP
  gp F.1 Verbindung aufnehmen, Datensätze anzeigen
  gp F.2 Datensätze auswählen
  gp F.3 Ausgabe in eine HTML-Tabelle
  gp F.4 Auswahl von Daten über ein Such-Formular
  gp F.5 Datensätze erzeugen
  gp F.6 Datensätze ändern
  gp F.7 Datensätze löschen
  gp F.8 Alle Funktionen für MySQL

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.


Galileo Computing

F.1 Verbindung aufnehmen, Datensätze anzeigen  downtop

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

gp  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

gp  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

gp  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

gp  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

gp  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.
gp  Die Anzahl wird zur Information ausgegeben (echo $num Datensätze gefunden ...).

for-Schleife

gp  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

gp  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.
gp  Am Ende der Schleife werden die fünf Feldinhalte, die in den fünf Variablen gespeichert wurden, ausgegeben.
gp  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
Abbildung

Im weiteren Verlauf des Abschnittes werden noch Möglichkeiten zur übersichtlicheren Ausgabe der Daten erläutert wie z. B. in einer HTML-Tabelle.


Galileo Computing

F.2 Datensätze auswählen  downtop

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.


Galileo Computing

F.2.1 Erstes Beispiel  downtop

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
Abbildung


Galileo Computing

F.2.2 Zweites Beispiel  downtop

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.


Galileo Computing

F.3 Ausgabe in eine HTML-Tabelle  downtop

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
Abbildung


Galileo Computing

F.4 Auswahl von Daten über ein Such-Formular  downtop

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.


Galileo Computing

F.4.1 Erstes Beispiel  downtop

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
Abbildung

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.


Galileo Computing

F.4.2 Zweites Beispiel  downtop

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.


Galileo Computing

F.4.3 Drittes Beispiel  downtop

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
Abbildung

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
Abbildung

Ü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ü
Abbildung

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
Abbildung


Galileo Computing

F.5 Datensätze erzeugen  downtop

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
Abbildung

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:.

gp  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.
gp  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
Abbildung


Galileo Computing

F.6 Datensätze ändern  downtop

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.


Galileo Computing

F.6.1 Änderung mehrerer Datensätze  downtop

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:

gp  Die Erhöhung soll durchgeführt werden (Aufruf des PHP-Programmes über einen Hyperlink).
gp  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.


Galileo Computing

F.6.2 Änderung eines bestimmten Datensatzes  downtop

Ä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:

gp  Dem Benutzer werden alle Datensätze angezeigt.
gp  Er wählt aus, welchen er ändern möchte.
gp  Er gibt die Änderungen ein.
gp  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:

gp  Datei uf16a.php zur Anzeige aller Datensätze und Auswahl
gp  Datei uf16b.php zur Anzeige eines Datensatzes und Eingabe der Änderungen
gp  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
Abbildung

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
Abbildung

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
Abbildung

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.


Galileo Computing

F.7 Datensätze löschen  downtop

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:

gp  Dem Benutzer werden alle Datensätze angezeigt.
gp  Er wählt aus, welchen er löschen möchte.
gp  Er lässt die Löschung durchführen.

Die beschriebene Vorgehensweise wird an einem Beispiel in folgenden Dateien realisiert:

gp  Datei uf17a.php zur Anzeige aller Datensätze und Auswahl
gp  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.

gp  Das Wort »Löschen« wird zweimal ersetzt durch »Ändern«.
gp  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
Abbildung

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
Abbildung

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).


Galileo Computing

F.8 Alle Funktionen für MySQL  toptop

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

  

Perl – Der Einstieg




Copyright © Galileo Press GmbH 2001 - 2002
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken und speichern. Ansonsten unterliegt das <openbook> denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Die Veröffentlichung der Inhalte oder Teilen davon bedarf der ausdrücklichen schriftlichen Genehmigung von Galileo Press. Falls Sie Interesse daran haben sollten, die Inhalte auf Ihrer Website oder einer CD anzubieten, melden Sie sich bitte bei: stefan.krumbiegel@galileo-press.de


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, fon: 0228.42150.0, fax 0228.42150.77, info@galileo-press.de