Folien



(letzte Synchronisation der PDF-Präsentation: 02.08.2017)

Falls keine PDF-Präsentation zu sehen ist, klicken Sie zum Download hier: Direktdownload PDF-Präsentation

Abfragen mit mysql_query() ausführen

SQL-Anweisungen werden in PHP mit mysql_query($SQL_befehl[, $datenbank]) ausgeführt. Der Übersichtlichkeit und Flexilibität halber speichert man sowohl den Befehl als auch das Ergebnis der Abfrage in einer Variablen, bspw.

PHP-Code
  $sql_befehl = "SELECT kundeID, kundeName FROM kunden"; //kein Semikolon nach SQL-Befehl in PHP $sql_ergebnis = mysql_query($sql_befehl);  

Das Ergebnis der Abfrage wird in $sql_ergebnis in Form einer Tabelle gespeichert.

Datensätze mit mysql_fetch_assoc() auslesen

Vorbemerkung: Am einfachsten ist es, immer mysql_fetch_array() in der Defaultvariante zu verwenden (vgl. folgende Lektion). Die vorige Behandlung von mysql_fetch_assoc() ist jedoch weniger verwirrend, so dass einfacher erklärt werden kann, wie das Auslesen der Daten funktioniert.

Mit mysql_fetch_assoc() wird das Abfrageergebnis in assoziative Arrays umgewandelt – für jeden Datensatz (= Zeile) eines. Der Feldname wird zum Schlüssel, der Feldinhalt zum Wert. Ergebnis soll z.B. sein:

$datensatz['kundeID' => '1', 'kundeName' => 'Schmitt', 'kundeVorname' => 'Gerhard', 'kundeTel' => '030-3113'] $datensatz['kundeID' = > '2', 'kundeName' => 'Maier', 'kundeVorname' => 'Herbert', 'kundeTel' => '07661-25523']

Damit können bei Bedarf auch einzelne Felder abgefragt werden z.B. mit

PHP-Code
  echo $datensatz['kundeName'];  

Um die Daten auszulesen, benötigt man eine Schleife, die die einzelnen Datensätze der Tabelle durchläuft und jeweils als Array ausgibt.

PHP-Code
  while ($datensatz = mysql_fetch_assoc($ergebnis)) // der folgende Programmcode wird nun für jeden Datensatz (=jede Zeile) einmal ausgeführt { echo "$datensatz[kundeName] $datensatz[kundeVorname] $datensatz[kundeTelefon]<br />\n"; // print_r($datensatz); // echo "<br /><br /><br />"; // zum Anzeigen der Inhalte der Arrays die vorigen beiden Zeilen entkommentieren }  

Ausgabe:

Schmitt Fritz 030-300202
Müller Mario 030-220202

(usw.)

print_r zur Anzeige von Arrays, Objekten …

Bei Verwendung von print_r($datensatz) erhält man für jeden Datensatz den Inhalt des Arrays:

Array ( [kundeID] => 1 [kundeName] => Schmitt [kundeVorname] => Fritz [kundeTelefon] => 030-300202 [kundeLand] => 1 [kundeNummer] => 13 )
Array ( [kundeID] => 2 [kundeName] => Müller [kundeVorname] => Mario [kundeTelefon] => 030-220202 [kundeLand] => 1 [kundeNummer] => 15 )

(usw.)

Da die Feldnamen im assoziativen Array als Schlüssel verwendet werden, kann man einfach per $datensatz['feldname'] auf sie zugreifen.

Ganzes Listing

PHP-Code
  <?php require("include/config.inc.php"); // Verbindung zur DB herstellen und testen   // mySQL-Abfrage: $abfrage = "SELECT * FROM kunden"; $ergebnis = mysql_query($abfrage);   // Daten auslesen while ($datensatz = mysql_fetch_assoc($ergebnis)) { echo "$datensatz[kundeName] $datensatz[kundeVorname] $datensatz[kundeTelefon]<br />\n"; // print_r($datensatz); // echo "<br /><br /><br />"; // zum Anzeigen der Inhalte der Arrays entkommentieren }   mysql_close($link); // Verbindung zur Datenbank beenden ?>  

Übungen

Alle Übungen finden Sie in der Materialsammlung (dort auch alle zusätzlichen Dateien wie Bilder, Klassendiagramme oder HTML-Vorlagen!).

Die aktuelle Übung können Sie hier als txt-File herunterladen.


***** Übungen: PHP + MySQL - Abfragen mit mysql_query() ausführen *****

Gegeben sei folgende Tabelle ‘assoc_abfragen’ (achten Sie darauf, dass Sie in den folgenden Listings die richtige Datenbank auswählen; hier verwenden wir die Datenbank ‘test’).

Tabellenstruktur der Tabelle assoc_abfragen
id (int, Primärschlüssel)
name (varchar 150)
plz (int) [für Postleitzahl]
Tabelleninhalte
1, Müller, 79200
2, Schmitt, 83002
3, Maier, 75331
4, Huber, 90221
5, Berger, 35502

MySQL-Code
-- -- Tabellenstruktur für Tabelle `assoc_abfragen` --   CREATE TABLE `assoc_abfragen` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(150) NOT NULL, `plz` int(5) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;   -- -- Daten für Tabelle `assoc_abfragen` --   INSERT INTO `assoc_abfragen` VALUES(1, 'Müller', 79200); INSERT INTO `assoc_abfragen` VALUES(2, 'Schmitt', 83002); INSERT INTO `assoc_abfragen` VALUES(3, 'Maier', 75331); INSERT INTO `assoc_abfragen` VALUES(4, 'Huber', 90221); INSERT INTO `assoc_abfragen` VALUES(5, 'Berger', 35502);  




php-MySQL_3-1: Einfache DB-Abfragen mit PHP ausführen

Führen Sie mit PHP die Abfrage SELECT * FROM assoc_abfragen aus und speichern Sie das Ergebnis in $ergebnis.

Vorschlag zum Vorgehen:
- DB-Connection in einer Klasse DbConnect.class.php
- index.php erzeugt ein Objekt der Klasse und ruft die Methode verbinden() (o.ä.) auf.
Die anschließende Abfrage könnte zwar direkt aus der index.php erfolgen, das wäre aber aus Sicht der Objektorientierung nicht besonders elegant. Besser:
- Abfrage erfolgt in einer Klasse Abfrage.class.php. Es könnte eine Methode abfrageAusfuehren(befehl:String) geben; diese bekommt als Parameter den SQL-Befehl. Außerdem nimmt sie die Ausgabe vor (z.B. mit while-Schleife).
- index.php erzeugt ein Objekt der Klasse Abfrage und ruft die Methode auf, z.B. so:

PHP-Code
$neueAbfrage = new Abfrage(); $neueAbfrage->abfrageAusfuehren("SELECT * FROM assoc_abfragen");  


Fortgeschrittene: Programmieren Sie eine Klasse, die die Anzeige der Ergebnisse bei SELECT-Abfragen vornimmt. Diese Klasse ist per uses-Assoziation (Abhängigkeitsbeziehung) mit der Klasse Abfrage verbunden.





php-MySQL_3-2: Welche Ausgabe erzeugt das Listing (1)?

PHP-Code
$sql_abfrage = ("SELECT * FROM assoc_abfragen WHERE id=3"); $sql_result = mysql_query($sql_abfrage); while ($datensatz = mysql_fetch_assoc($sql_result)) { echo "Der Kunde mit der id " . $datensatz['id'] . " heißt " . $datensatz['name'] . "."; echo "<br />"; }  




php-MySQL_3-3: Welche Ausgabe erzeugt das Listing (2)?

PHP-Code
$sql_abfrage = ("SELECT * FROM assoc_abfragen"); $sql_result = mysql_query($sql_abfrage); echo "In unserer Datenbank gibt es folgende Kunden: "; echo "<ul>\n"; while ($datensatz = mysql_fetch_assoc($sql_result)) { echo "<li>" . $datensatz['name'] . "</li>"; } echo "</ul>\n";  




php-MySQL_3-4: Welche Ausgabe erzeugt das Listing (3)?

PHP-Code
$sql_abfrage = ("SELECT * FROM assoc_abfragen WHERE id<4"); $sql_result = mysql_query($sql_abfrage); echo "Die ersten drei registrierten Kunden heißen: "; while ($datensatz = mysql_fetch_assoc($sql_result)) { echo $datensatz['name']; if ($datensatz['id'] < 3) { echo ", "; } else { echo "."; } }  




php-MySQL_3-5: Lückenlisting

Ergänzen Sie die Lücken in folgendem Listing und testen Sie die Lauffähigkeit:

PHP-Code
echo "<h1>Alle Datensätze als Arrayinhalte ausgeben</h1>";   $sql_abfrage = ("SELECT * FROM assoc_abfragen"); $sql_result = mysql_query($sql_abfrage); while (_________ = mysql_fetch_assoc($sql_result)) { print_r(__________); echo "<br />"; }   echo "<h1>Einen Datensatz als Arrayinhalt ausgeben</h1>";   $abfr = ("SELECT * FROM assoc_abfragen WHERE id=4"); $erg = mysql_query(_________); while ($datensatz = ___________) { print_r($datensatz); echo "<br />"; }   echo "<h1>Die Daten eines Datensatzes ausgeben</h1>";   $sql_abfrage = ("SELECT * FROM assoc_abfragen WHERE name='Müller'"); $sql_result = mysql_query($sql_abfrage); while ($datensatz = mysql_fetch_assoc($sql_result)) { echo "Die ID ist: " . __________ . "<br />\nDer Name ist: " . __________ . "<br />\nDie Postleitzahl ist: " . ____________; echo "<br />"; }  




php-MySQL_3-6: Welche Ausgabe erzeugt das Skript?

Gegeben sei folgendes Listing:

PHP-Code
echo "<h1>Die Daten eines Datensatzes mit foreach ausgeben</h1>"; $sql_abfrage = ("SELECT * FROM assoc_abfragen WHERE name='Müller'"); $sql_result = mysql_query($sql_abfrage); while ($datensatz = mysql_fetch_assoc($sql_result)) { echo "<h2>Datensatz mit der id " . $datensatz['id'] . " (Name: " . $datensatz['name'] . "):</h2>"; foreach ($datensatz as $key=>$value) { echo "Der Schlüssel " . $key . " hat den Wert " . $value . "."; echo "<br />"; } }  

1. Welche Ausgabe erzeugt dieses Skript?
2. Was müssen Sie ändern, damit nicht nur die Daten von “Müller” ausgegeben werden, sondern die Daten aller Datensätze?
3. Skizzieren Sie die Ausgabe, die Sie in diesem Fall erwarten.




php-MySQL_3-7: Ausgabe interpretieren

Der Befehl print_r($reihe) führe zu folgender Ausgabe:
Array ( [id] => 1 [name] => Müller [plz] => 79200 )
Array ( [id] => 2 [name] => Schmitt [plz] => 83002 )
Array ( [id] => 3 [name] => Maier [plz] => 75331 )
Array ( [id] => 4 [name] => Huber [plz] => 90221 )
Array ( [id] => 5 [name] => Berger [plz] => 35502 )

1. Was bedeutet diese Ausgabe?
2. Schreiben Sie den COde, der zu dieser Ausgabe führt.




php-MySQL_3-8: Abfrageskript schreiben

Schreiben Sie ein Skript, das in ansprechender Form die Name und id aller Datensätze ausgibt, bei denen die Postleitzahl mit einer 7 beginnt.




php-MySQL_3-9: Anwendung mit Formularoberfläche

Erstellen Sie eine Applikation, die über eine Formularoberfläche aus der folgenden Tabelle alle Datensätze abruft (SELECT) oder neue hinzufügt (UPDATE).
Erstellen Sie dazu zwei unabhängige Formulare:
- Eines, das die Selectabfrage ausführt, und
- eines, das einen neuen Datensatz hinzufügt.

FORTGESCHRITTENE:
Bei der SELECT-Abfrage können Einschränkungen angegeben werden, z.B.
- "sortieren nach Beliebtheit", oder
- "sortieren nach Preis", oder
- "Höchstpreis eingeben", oder
- "Beschreibung enthält folgendes Wort:" (Vorschlag zum Ausprobieren: super, billig, Schnäppchen, Sport)


MySQL-Code
CREATE TABLE `artikel` ( `id` int(11) NOT NULL AUTO_INCREMENT, `artikel_name` varchar(200) NOT NULL, `netto_preis` float NOT NULL, `artikel_beschreibung` varchar(800) DEFAULT NULL, `beliebtheit` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;   -- -- Daten für Tabelle `artikel` --   INSERT INTO `artikel` VALUES(1, 'Fahrrad', 133.95, 'Ein hübsches Fahrrad mit einem Windrädchen dran. Das ist super und ein richtiges Schnäppchen.', 2); INSERT INTO `artikel` VALUES(2, 'Rennrad', 299.4, 'Schnelles Profi-Rennrad mit Rahmen aus Carbon. Ideal für den Sportler und ausgesprochen billig.', 3); INSERT INTO `artikel` VALUES(3, 'Smartphone', 184.5, 'Nagelneues Smartphone mit vielen Funktionen. Leider nicht ganz billig.', 8); INSERT INTO `artikel` VALUES(4, 'Sonnenbrille', 13, 'Schwarz und verspiegelt, hält bis zu 95% UV ab! Auch für den Sport geeignet. Prädikat: Super!', 5); INSERT INTO `artikel` VALUES(5, 'Handtuch', 2.95, '100x200 cm, sogar für Sandstrände geeignet. Billigster Artikel in unserem Sortiment!', 4); INSERT INTO `artikel` VALUES(6, 'Handtuch mit CHS-Logo', 3.95, '80x60cm, mit riesigem CHS-Logo-Sticker', 12);  





php-MySQL_3-10: Anwendung mit Formularoberfläche

Sie sollen eine Anwendung zur Verwaltung eines Lagerbestands schreiben. Die Daten werden in dieser Tabelle verwaltet:

MySQL-Code
-- -- Tabellenstruktur für Tabelle `lagerbestand` --   CREATE TABLE `lagerbestand` ( `id` int(11) NOT NULL AUTO_INCREMENT, `artikel` varchar(100) NOT NULL, `bestand` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;   -- -- Daten für Tabelle `lagerbestand` --   INSERT INTO `lagerbestand` VALUES(1, 'Fahrrad', 13); INSERT INTO `lagerbestand` VALUES(2, 'Olivenöl', 288); INSERT INTO `lagerbestand` VALUES(3, 'Mrs-Kitty-Kuchen', 12); INSERT INTO `lagerbestand` VALUES(4, 'Handbuch der Wirtschaftsinformatik', 9);    

Schreiben Sie eine Applikation, die folgende Aufgaben erfüllt:

1. Öffnet eine Verbindung zum Datenbankserver und wählt eine Datenbank aus.
2. Über eine Formularoberfläche können:
--- a) der Lagerbestand für einzelne Artikel geändert werden (Auswahlmenü "Welcher Artikel soll geändert werden?", Textfeld "Neue Anzahl") - es erfolgt eine entsprechende Ausgabe ("Es sind jetzt 18 Stück vom Typ Fahrrad im System vorhanden.").
Den Drop-Down-Knopf für das Auswahlmenü müssen Sie erzeugen lassen, indem Sie mit einer Schleife die einzelnen Zeilen der Datenbank auslesen und die Namen der Artikel (Attribut 'artikel') als Optionen in den Knopf hineinschreiben lassen.

--- b) der Lagerbestand eines einzelnen Artikels ausgegeben werden (Auswahlmenü "Welchen Artikel wollen Sie anzeigen?")
siehe oben a)
--- c) alle Artikel in einer Liste mit dem jeweiligen Lagerbestand ausgegeben werden (nur Absendebutton "alle Artikel anzeigen").
--- d) neue Artikel angelegt werden (Textfeld "Name des neu anzulegenden Artikels", Textfeld "anfänglicher Lagerbestand")

***********************************************************
* /// Ergänzungen für Fortgeschrittene:
* 2a: Die ins Textfeld eingegebene Zahl wird zum bisherigen
* Lagerbestand addiert;
* Es wird überprüft, ob ins Textfeld eine Zahl eingegeben wurde;
* Lagern Sie den Formularcode in einzelne Dateien aus, z.B.
* formular_neuer_artikel.inc.php
*
* 2d: Damit Sie die Überprüfung auf numerischen Wert nicht erneut
* programmieren müssen, schreiben Sie eine Klasse, die das Textfeld
* überprüft
***********************************************************


Gehen Sie wie folgt vor:

1. Klassendiagramm erstellen mit allen notwendigen Klassen, Attributen und Methoden!
2. Erstellen Sie eine index.php, die alle notwendigen Formulare enthält. Die Auswertung erfolgt auf unterschiedlichen Ergebnisseiten (z.B. ergebnis_artikel_anlegen.php oder ergebnis_lagerbestand_aendern.php).
3. Auf den Auswertungsseiten wird eine entsprechende Klassenmethode aufgerufen, die nach Bedarf mit der Datenbank kommuniziert.

***********************************************************
* /// Ergänzungen für Fortgeschrittene:
* Die Auswertung erfolgt nur auf einer Seite, idealerweise
* der index.php
*
***********************************************************