Jetzt anmelden...

Name
Passwort
Registrieren

PHP Tutorial #22

MySQL-Datensätze mit PHP auslesen

Wir haben im vorhergehenden Kapitel gelernt, wie wir PHP mit einer MySQL-Datenbank verbinden können. Nun sind wir in Lage, einen wichtigen Schritt weitergehen. Es wird jetzt darum gehen, wie wir es Benutzern ermöglichen, eine Datenbank mithilfe von Formular- bzw. Eingabefeldern abzufragen.

Kommentare [0]

Stefan 08.06.2019

Infos zum Artikel

Kategorie PHP
Autor Stefan
Datum 08.06.2019

Thema in Kurzform:

  • Je nach Eingabe bzw. Auswahl des Nutzers im HTML-Formular wird durch PHP ein unterschiedlicher WHERE-Teil im SQL-Abfrage-String generiert:
  • Beispiel:
    $preis = $_POST["preis"];
    $abfrage = "SELECT * from tabelle WHERE preis < $preis;
    
    $result = mysqli_query($connect, $abfrage);
    
    while($dsatz = mysqli_fetch_assoc($result)){
        echo $dsatz["spalte1"];
             $dsatz["spalte2"];
             // usw.
    }
    

Ausgangslage

Wir erklären dieses Thema anhand des praktischen Beispiels eines Buchungssystems für Hotel-Zimmer.

Das Hotel speichert seine Zimmer in einer MySQL-Tabelle mit dem Namen zimmer. Jedes Zimmer ist also ein Datensatz in einer MySQL-Tabelle.

Sie können die Tabelle hier downloaden und in phpMyAdmin importierten.

Die Ergebnistabelle der SQL-Abfrage SELECT * from zimmer; sieht dann so aus:

+----+--------------+-----------+-------------+
| id | zimmernummer | kategorie | preis_nacht |
+----+--------------+-----------+-------------+
|  1 |          201 | standard  |          59 |
|  2 |          202 | standard  |          59 |
|  3 |          203 | standard  |          67 |
|  4 |          204 | standard  |          65 |
|  5 |          205 | standard  |          44 |
|  6 |          206 | standard  |          79 |
|  7 |          207 | standard  |          79 |
|  8 |          208 | standard  |          51 |
|  9 |          209 | standard  |          49 |
| 10 |          301 | deluxe    |         119 |
| 11 |          302 | deluxe    |         109 |
| 12 |          303 | deluxe    |         135 |
| 13 |          304 | deluxe    |         159 |
| 14 |          305 | deluxe    |         150 |
| 15 |          401 | Suite     |         559 |
+----+--------------+-----------+-------------+
15 rows in set (0,00 sec)

Wie wir sehen, hat die Tabelle verschiedene Spalten (Attribute). Die Zimmer unterscheiden sich danach, welchen Wert sie in der betreffenden Spalte haben. Es gibt insgesamt 15 Datensätze.

Kommen wir jetzt zur Kernfrage: Wie kriegen wir es hin, dass ein Besucher einer Website, Datensätze gezielt aus eben dieser MySQL-Tabelle herauslesen kann?

Wir brauchen hierzu Folgendes:

  • Ein HTML-Formular für die Nutzereingabe
  • Ein PHP-Programm zur Verarbeitung der Eingabe
  • Eine Tabelle in einer MySQL-Datenbank (haben wir schon)

Wir kümmern uns zuerst um das HTML-Formular. Danach schreiben wir das PHP-Programm, um durch die Nutzereingaben die MySQL-Tabelle entsprechend auszulesen, das heißt, die gewünschten Datensätze zu erhalten.

Das HTML-Formular

Wir wollen es nicht zu kompliziert machen und streben ein ganz simples HTML-Formular ohne viel Schnick-Schnack an. Auch um das CSS-Design kümmern wir uns nicht, weshalb das Formular hässlich bleibt.

Der Nutzer soll die einzelnen Hotel-Zimmer der Tabelle nach Kategorie und Preis durchsuchen können.

Wir brauchen also ein einfaches HTML-Formular, mit dem der Benutzer verschiedene Möglichkeiten der Zimmer-Suche hat. Am Ende soll das Ganze so aussehen wie im Screenshot:

PHP MySQL Datenauslesen

Der vollständige Code für das Formular sieht so aus:

<html><head></head><body>

<h1>Zimmerbuchung für HotelMareDeluxe</h1>

<p>Lieber Besucher, <br>
bitte suchen Sie anhand der folgenden Optionen Ihr gewünschtes Zimmer:</p>


<form action="zimmersuche.php" method="post">

   <h2>Preis bis</h2>
   <p>
        <input name="preisMax"> €
   </p>

   <h2>Kategorie wählen</h2>
   <p>
      <select name="kategorie">
         <option value="standard">Standard</option>
         <option value="deluxe">Deluxe</option>
         <option value="suite">Suite</option>
         <option value="alle">alle anzeigen</option>
      </select>
   </p>

   <input type="submit" value="Suche starten">

</form>

</body></html>
                   
ste

Beim Klick auf den Submit-Button Suche starten werden die Daten an die PHP-Datei namens zimemrsuche.php geschickt.

Bereits mit wenig Codezeilen in der PHP-Datei zimemrsuche.php können wir die gesendeten Daten "abholen" und das Formular testen:

<?php

if($_POST["preisMax"]){
    echo "Preis bis: " . $_POST["preisMax"] . "€ <br>";
}

echo "Kategorie: " . $_POST["kategorie"];
?>

Wenn wir testweise einen Höchstpreis für die Zimmer eingeben (z.B. 200) und im drop-down Menu Zimmerkategorie auswählen (z.B. Deluxe), erhalten wir durch zimmersuche.php folgenden Text am Bildschirm angezeigt:

Preis bis: 200€
Kategorie: deluxe                    

Alles klar, super! Wir können die Daten der Benutzereingabe abgreifen. Jetzt ist es nicht mehr weit, bis wir diese nutzen können, um eine SQL-Abfrage zu starten 😊

SQL-Abfrage mit PHP durchführen

Wir haben im letzten Kapitel gelernt, wie wir mit PHP zur Datenbank verbinden und dann eine einfache SELECT-Abfrage durchführen. Im Prinzip läuft es jetzt genauso ab, wenn wir mit PHP eine gezielte SQL-Abfrage durchführen (und anzeigen!) lassen wollen, die auf einer spezifischen Nutzereingabe (durch das HTML-Formular) basiert.

Gezielte SQL-Abfrage

Wie wir wissen, können wir alle Datensätze einer MySQL-Tabelle mit SELECT * FROM zimmer; abfragen. Für eine gezielte Abfrage, die nur die Datensätze (also die Zimmer) anzeigt, die zur Nutzereingabe passen, müssen wir an den Abfrage-String noch Bedingungen anhängen. In SQL werden Bedingungen mit dem Schlüsselwort WHERE gebildet.

Beispiel

Der Nutzer möchte nach Zimmern suchen, die höchstens 100€ pro Nacht kosten und in der Kategorie standard sind. Die SQL-Abfrage, die aufgrund dieser Nutzereingaben bzw. -auswahl generiert wird, lautet dann so:

SELECT * from zimmer
 WHERE (preis_nacht <= 100) AND (kategorie = 'standard');

Den SQL-Abfrage-String zusammenbauen

Sehen wir uns jetzt an, wie der SQL-Abfrage-String erzeugt wird. Für das, was jetzt kommt, ist folgender Grundsatz sehr wichtig:

  • Je nach Eingabe bzw. Auswahl des Nutzers im HTML-Formular wird durch PHP ein unterschiedlicher WHERE-Teil im SQL-Abfrage-String generiert.

Hier der vollständige Code von zimmersuche.php:

<?php
// Zur Datenbank verbinden
$host_name = 'localhost';
$user_name = 'root';
$password = '';
$database = 'falconbyte';
$connect = mysqli_connect($host_name, $user_name, $password, $database);

// Nutzereingabe in Variablen speichern
$preisMax = $_POST["preisMax"];
$kategorie = $_POST["kategorie"];

// SQL-Abfrage-String zusammenauen
if($kategorie == "alle"){
	$abfrage = "SELECT * FROM zimmer WHERE (preis_nacht <= $preisMax) AND (kategorie LIKE '%')";
}
else{
	$abfrage = "SELECT * FROM zimmer WHERE (preis_nacht <= $preisMax) AND (kategorie = '$kategorie');";
}

// SQL-Abfrage ausführen und anzeigen
$result = mysqli_query($connect, $abfrage);

while($dsatz = mysqli_fetch_assoc($result)){
echo $dsatz["id"] . ", " .
    $dsatz["zimmernummer"] . ", " .
    $dsatz["kategorie"] . ", " .
    $dsatz["preis_nacht"]. "
"; } ?>

Alles halb so wild! Wir verstehen den Code einfacher, wenn wir ihn uns Stück für Stück ansehen.

Zu Beginn werden diejenigen Werte in Variablen gesichert, die wir für die SQL-Abfrage einsetzen müssen: $preisMax und $kategorie.

Damit haben wir alle Werte, die wir brauchen und können nun den SQL-Abfrage String zusammenbauen. Für die Vergleichswerte im Abfrage-String setzen wir die beiden Variablen $preisMax und $kategorie ein (bei $kategorie aber an die einfachen Anführungszeichen denken, da dies ein String-Wert ist).

Sofern der Nutzer bei seiner Zimmerkategorie "alle" auswählt, müssen alle Kategorien angezeigt werden. Um das im Abfragestring zu ermöglichen, prüfen wir die Spalte kategorie mit LIKE '%'.

Am Ende steht dann der fertige SQL-Abfrage-String zum Einsatz bereit.

SQL-Abfrage durchführen

Der letzte Schritt besteht im Durchführen der SQL-Abfrage mittels der Funktion mysqli_query() und dem anschließenden Abrufen des Abfrage-Ergebnisses mit der Funktion mysqli_fetch_assoc() in Kombination mit einer while-Schleife.

Dieser Part ist ein wenig komplexer. Wenn Sie wissen wollen, wie genau dieser Schritt abläuft, schauen hier hier vorbei.

Um das fertige Programm zu Testen, greifen wir das Eingabebeispiel von oben nochmal auf:

Der Nutzer sucht nach Zimmern, das maximal 100€ pro Nacht kostet. Die Kategorie soll standard sein.

Sofern der String $abfrage eine 100% korrekte SQL-Syntax aufweist, die Verbindung zur Datenbank erfolgreich hergestellt wurde und auch mysqli_fetch_assoc() richtig eingesetzt wurde, erhalten wir wunschgemäß folgende Ergebnistabelle im Browser angezeigt:

1, 201, standard, 59
2, 202, standard, 59
3, 203, standard, 67
4, 204, standard, 65
5, 205, standard, 44
6, 206, standard, 79
7, 207, standard, 79
8, 208, standard, 51
9, 209, standard, 49         

That's it! 😎

Übungen

einfach

Wir bleiben bei unserem Beispiel mit der Zimmersuche: Wie muss der SQL-Abfrage-String lauten, wenn ein Benutzer nur Zimmer der Kategorie deluxe bis maximal 100€/ Nacht suchen möchte?

Lösung ein-/ausblenden

mittel

Entwickeln Sie ein PHP-Programm, das eine MySQL-Tabelle nach Ländern mit einer maximalen Einwohnerzahl (durch die Nutzereingabe festgelegt) durchsucht und die Ergebnisse am Bildschirm ausgibt.

Wir haben hierzu folgendes simples HTML-Formular:

PHP MySQL Datenauslesen

Hier der Code dazu:

<html><head><meta charset="UTF-8"></head><body>

<form action="laendersuche.php" method="post">

<h1>Ländersuche nach Einwohnern</h1>
<p><input name="einwohner"> höchste Einwohnerzahl eingeben</p>

<input type="submit" value="Suche starten">

</form>

</body></html>

Die (sehr einfache) Tabelle laender (laender.sql) hat folgende Datensätze:

+--------+--------------+-----------+
| nummer | name         | einwohner |
+--------+--------------+-----------+
|      1 | Deutschland  |  82000000 |
|      2 | England      |  53000000 |
|      3 | Island       |    330000 |
|      4 | Österreich   |   8800000 |
|      5 | Italien      |  60000000 |
|      6 | USA          | 325000000 |
|      7 | Russland     | 144000000 |
|      8 | Spanien      |  46000000 |
|      9 | Schweiz      |   8000000 |
|     10 | Griechenland |  10000000 |
+--------+--------------+-----------+
10 rows in set (0,00 sec)                        

Kriegen Sie das hin?

Lösung ein-/ausblenden

schwer

Wenn Sie diese Aufgabe bewältigen, haben Sie den Diamenten wirklich verdient.
Bauen Sie das HTML-Formular vom Screenshot unten nach und entwickeln Sie ein PHP-Programm, das entsprechend der Daten der Nutzereingabe die SQL-Tabelle (Download: autos.sql) gezielt ausliest. Die gefundenen Datensätze sollen am Bildschirm angezeigt werden.

PHP MySQL Datenauslesen
Lösung ein-/ausblenden

Kommentar schreiben

Nur angemeldete Benutzer können kommentieren.

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Funktionen für Variablen

In PHP stehen verschiedene Funktionen speziell fürs Variablen-Handling bereit.

Scope von Variablen

Wo ist eine Variable eigentlich sichtbar?

Funktionen aufrufen

In PHP gibt es ein ganzes Arsenal an bereits vordefinierten Funktionen, die Sie benutzen können.

FALCONBYTE.NET

Handmade with 🖤️

© 2018, 2019 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen