Komplexere Datenabfrage per SELECT
Im ersten Teil ging es um simple Datenbankanfragen mittels dem SQL-Befehl SELECT. Dort haben wir immer stets alle Datensätze abgefragt. Jetzt im zweiten Teil geht es um das Filtern von Einträgen, beispielsweise suchen wir alle Nutzer mit einem gewissen Vor- oder Nachnamen. Dazu verwenden wir die Anweisung WHERE. Ebenfalls lernen wir den Einsatz von prepared statements in PDO.
Inhaltsverzeichnis
WHERE-Statements
Mittels der WHERE-Anweisung können wir gezielt unsere Datenbank durchsuchen und nur gewisse Datensätze ausgeben. Beispielsweise den Datensatz für einem Benutzer mit einem gewissen Namen oder die Datensätze aller Nutzer die zwischen 1980 und 1990 geboren wurden. Ihr könnt die WHERE-Anweisung selbstverständlich auch mit der ORDER BY-Anweisung und vor der LIMIT-Anweisung kombinieren, die wir euch im vorherigen Tutorial vorgestellt hatten. Dabei kommt die WHERE-Anweisung vor der ORDER BY-Anweisung und vor der LIMIT-Anweisung. So könnt ihr also beispielsweise mittels WHERE nach bestimmten Einträgen suchen, mittels ORDER BY sortieren und mittels LIMIT euch nur die ersten Einträge ausgeben lasst.
Eine Abfrage des Benutzers mit der ID 1 sieht beispielsweise wie folgt aus:
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $sql = "SELECT * FROM users WHERE id = 1"; foreach ($pdo->query($sql) as $row) { echo $row['vorname']." ".$row['nachname']."<br />"; echo "E-Mail: ".$row['email']."<br /><br />"; } ?>
Hier können wir auch auf die foreach-Schleife verzichten, da wir nur einen Datensatz zurückerhalten und es alternativ wie folgt schreiben.
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $sql = "SELECT * FROM users WHERE id = 1"; $user = $pdo->query($sql)->fetch(); echo $user['vorname']." ".$user['nachname']."<br />"; echo "E-Mail: ".$user['email']."<br /><br />"; ?>
Möchte man beispielsweise nach einem Nutzer mit einer gewissen E-Mail-Adresse suchen, so müssen wir das Argument per Anführungszeichen umschließen.
1 |
Logische Operatoren AND / OR
Im obigen Fall haben nur eine Spalte auf einen Wert untersucht. Mittels den logischen Operatoren AND und OR können wir ähnlich wie bei if-Anweisung mehrere Spalten überprüfen:
1 2 3 4 5 6 7 8 9 |
// Findet alle Einträge mit Vornamen Max und Nachnamen Mustermann: $sql = "SELECT * FROM users WHERE vorname = 'Max' AND nachname = 'Mustermann'"; // Findet alle Einträge mit Vornamen Max oder mit Nachnamen Mustermann: $sql = "SELECT * FROM users WHERE vorname = 'Max' OR nachname = 'Mustermann'"; // Findet alle Einträge mit Vornamen Max und Nachnamen Mustermann // oder die als E-Mail Adresse [email protected] angegeben haben: $sql = "SELECT * FROM users WHERE (vorname = 'Max' AND nachname = 'Mustermann') OR (email = '[email protected])"; |
Vergleichsoperatoren
MySQL bietet auch eine Reihe von Vergleichsoperatoren , damit könnt ihr beispielsweise überprüfen ob eine Spalten nicht einem gewissen Wert entspricht, alle Einträge mit einer Spalte größer oder kleiner einem gewissen Wert usw. Die wichtigsten Funktionen sind:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Findet alle Einträge die nicht Musermann heißen $sql = "SELECT * FROM users WHERE nachname != 'Mustermann'"; // Findet alle Einträge mit id < 5 $sql = "SELECT * FROM users WHERE id < 5"; // Findet alle Einträge mit id >= 5 $sql = "SELECT * FROM users WHERE id >= 5"; // Findet alle Einträge mit den IDs 2, 3, 5 und 7 $sql = "SELECT * FROM users WHERE id IN (2,3,5,7)"; // Findet alle Einträge, außer die mit den IDs 2, 3, 5 und 7 $sql = "SELECT * FROM users WHERE id NOT IN (2,3,5,7)"; // Findet alle Einträge bei denen die Spalte last_order den speziellen Wert NULL hat $sql = "SELECT * FROM users WHERE last_order IS NULL"; // Findet alle Einträge bei denen die Spalte last_order nicht den speziellen Wert NULL hat $sql = "SELECT * FROM users WHERE last_order IS NOT NULL"; |
LIKE und Wild-Card-Suche
Mittel der Anweisung LIKE können wir nach einfachen Mustern in unserer Datenbank suchen, beispielsweise nach allen Personen deren Vorname mit Ma beginnt. Dazu verwenden wir LIKE in Kombination mit der Wild-Card %. % steht dabei für beliebig viele Zeichen:
1 2 |
// Findet alle User deren Name mit Ma beginnt (z.B. Max, Mark, Markus, Matthias...) $sql = "SELECT * FROM users WHERE vorname LIKE 'Ma%'"; |
Neben % können wir auch _ verwenden. Dies entspricht genau einem unbekannten Zeichen. 'De_' würde also auf die Wörter Der, Den, Des usw. passen.
Hiermit können wir eine einfache Suche für unsere Tabelle bauen.
1 2 |
// Findet alle Einträge die 'Suchwort' in der entsprechenden Spalte enthalten $sql = "SELECT * FROM tabelle WHERE spalte LIKE '%Suchwort%'"; |
Doppelte Einträge verhindern
Mittels der DISTINCT-Anweisung können wir in einem SELECT doppelte Einträge vermeiden, sprich, so erhalten wir nur die eindeutigen Einträge zurück. Dabei muss das DISTINCT ganz am Anfang der Spaltenauswahl stehen.
Nachfolgend ein Beispiel, zum einen um die eine Liste aller (eindeutigen) Vornamen und aller (eindeutigen) Vor- und Nachnamen zu erhalten:
1 2 3 4 5 |
//Liste mit eindeutigen Vornamen, alphabetisch sortiert $sql = "SELECT DISTINCT vorname FROM users ORDER BY vorname"; //Liste mit eindeutigen Namen (Vor- und Nachname(, alphabetisch sortiert $sql = "SELECT DISTINCT vorname, nachname FROM users ORDER BY vorname, nachname"; |