PHP MySQL Select: Ein umfassender Leitfaden
SQL SELECT in PHP verwenden — mit WHERE filtern, ORDER BY sortieren, LIMIT paginieren und Zeilen sicher mit mysqli und PDO abrufen.
SELECT ist die SQL-Anweisung, die Daten aus einer Datenbank liest — sie werden Sie häufiger als jede andere verwenden. Dieser Leitfaden behandelt die SELECT-Syntax, die Klauseln, die Ihre Ergebnisse formen, sowie die beiden PHP-Erweiterungen (mysqli und PDO), mit denen Sie eine Abfrage ausführen und die zurückgegebenen Zeilen durchlaufen.
Falls Sie noch keine Datenbankverbindung hergestellt haben, beginnen Sie mit PHP MySQL Connect. Um zuerst Zeilen in eine Tabelle einzufügen, lesen Sie PHP MySQL Insert.
Was die SELECT-Anweisung bewirkt
SELECT ruft Zeilen aus einer oder mehreren Tabellen ab. Am einfachsten nennen Sie die gewünschten Spalten und die Tabelle, aus der sie gelesen werden sollen:
SELECT column1, column2, ...
FROM table_name;Verwenden Sie *, um alle Spalten auszuwählen. Das ist praktisch für schnelle Erkundungen, aber im Anwendungscode sollten Sie Spalten explizit benennen — das ist schneller, macht Ihre Absicht klar, und Ihr Code bricht nicht, wenn jemand der Tabelle eine Spalte hinzufügt.
-- All columns (fine for the mysql console, avoid in app code)
SELECT * FROM users;
-- Only what you need (preferred)
SELECT id, name, email FROM users;Ein SELECT gibt immer ein Ergebnisset zurück: null oder mehr Zeilen, die jeweils aus den angeforderten Spalten bestehen. PHP stellt Ihnen dieses Ergebnisset als etwas zur Verfügung, über das Sie iterieren können.
Das Ergebnisset formen
Die Form mit Spalten und Tabelle ist nur der Anfang. Fünf Klauseln ermöglichen das Filtern, Sortieren, Gruppieren und Zusammenführen von Daten. Sie müssen in dieser Reihenfolge erscheinen, wenn Sie mehr als eine verwenden:
| Klausel | Was sie bewirkt | Vertiefung |
|---|---|---|
WHERE | Behält nur Zeilen, die eine Bedingung erfüllen | MySQL WHERE |
GROUP BY | Fasst Zeilen für Aggregate wie COUNT() in Gruppen zusammen | — |
HAVING | Filtert diese Gruppen (wie WHERE, aber für Aggregate) | — |
ORDER BY | Sortiert die Zeilen | MySQL ORDER BY |
LIMIT | Begrenzt die Anzahl der zurückgegebenen Zeilen | MySQL LIMIT |
Filtern mit WHERE
Nur die Benutzer mit dem Namen John zurückgeben:
SELECT name, email
FROM users
WHERE name = 'John';Sortieren mit ORDER BY
Alphabetisch nach Name sortieren. ASC ist aufsteigend (Standard), DESC ist absteigend:
SELECT name, email
FROM users
ORDER BY name ASC;Zeilen begrenzen mit LIMIT
Nur die 10 neuesten Benutzer abrufen — unverzichtbar für die Paginierung und um nicht Millionen von Zeilen in den Speicher zu laden:
SELECT name, email
FROM users
ORDER BY created_at DESC
LIMIT 10;Tabellen verknüpfen
JOIN verbindet verwandte Tabellen über einen gemeinsamen Schlüssel. Hier wird jede Bestellung dem Benutzer zugeordnet, der sie aufgegeben hat:
SELECT users.name, orders.order_id
FROM users
JOIN orders ON users.id = orders.user_id;Ein SELECT in PHP ausführen
Um Daten in Ihren PHP-Code zu bekommen, ist der Ablauf immer gleich:
- Verbinden mit der Datenbank.
- Ausführen der
SELECT-Anweisung. - Abrufen der Zeilen aus dem Ergebnisset.
- Schließen der Verbindung (PHP schließt sie am Ende der Anfrage auch automatisch).
Verwenden Sie immer Prepared Statements für Benutzereingaben
Fügen Sie eine Variable niemals direkt in einen Abfrage-String ein. Wenn $name aus einem Formular stammt, kann ein Angreifer SQL injizieren und Ihre gesamte Datenbank lesen oder zerstören:
// DANGER: SQL injection. Never do this with untrusted input.
$result = $conn->query("SELECT name, email FROM users WHERE name = '$name'");Ein Prepared Statement sendet die Abfrage und die Daten getrennt, sodass der Wert niemals als SQL interpretiert werden kann. Das ist die wichtigste Gewohnheit beim Lesen von benutzergelieferten Daten. Mehr dazu unter MySQL Prepared Statements.
Mit mysqli
$conn = mysqli_connect("localhost", "username", "password", "database");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$stmt = $conn->prepare("SELECT name, email FROM users WHERE name = ?");
$name = "John";
$stmt->bind_param("s", $name); // "s" = the parameter is a string
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "0 results";
}
$stmt->close();
mysqli_close($conn);fetch_assoc() gibt jede Zeile als assoziatives Array zurück, das nach Spaltenname indiziert ist ($row["name"]). Verwenden Sie fetch_array(), wenn Sie auch numerische Schlüssel möchten, oder fetch_all(MYSQLI_ASSOC), um alle Zeilen auf einmal in ein Array zu laden.
Mit PDO
Für neue Projekte ist PDO im Allgemeinen die bessere Wahl: Es bietet eine konsistente API für MySQL, PostgreSQL, SQLite und mehr, und seine Prepared Statements sind gut lesbar.
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8mb4", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE name = ?");
$stmt->execute(["John"]);
foreach ($stmt as $row) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}Das Setzen von PDO::ERRMODE_EXCEPTION sorgt dafür, dass fehlgeschlagene Abfragen Ausnahmen auslösen, anstatt still zu scheitern — umschließen Sie Datenbankaufrufe mit try/catch, damit Probleme sichtbar werden statt zu verschwinden.
Häufige Fallstricke
num_rowsgibt Zeilen zurück, kein boolean. Prüfen Sie> 0(mysqli), bevor Sie annehmen, dass Sie Daten erhalten haben.*auswählen und dann eine Spalte lesen überträgt trotzdem alle Spalten. Wählen Sie nur aus, was Sie verwenden.LIMITbei großen Tabellen vergessen kann riesige Ergebnismengen in den Speicher laden. Paginieren Sie.- String-Vergleich in
WHEREist standardmäßig nicht case-sensitiv bei den gängigen MySQL-Kollationen —'john'entspricht'John'.
Fazit
SELECT ist das Arbeitstier jeder PHP/MySQL-Anwendung. Benennen Sie Ihre Spalten explizit, formen Sie Ergebnisse mit WHERE, ORDER BY, LIMIT und JOIN, und lesen Sie Benutzereingaben immer über Prepared Statements (mysqli oder PDO), um sich vor SQL-Injection zu schützen. Als nächstes lernen Sie, Daten zu ändern mit MySQL Insert und MySQL Update.