Appearance
Kapitel 12: PHP mit MySQL verbinden
12.1 Verbindung herstellen (mysqli_connect)
mysqli (MySQL Improved) Extension
mysqli: Die moderne Erweiterung für MySQL-Kommunikation in PHP.
Verbindung herstellen (prozedurale Variante)
php
<?php
// Datenbank-Zugangsdaten
$host = "localhost"; // Server (meist localhost)
$benutzer = "root"; // Datenbank-Benutzer
$passwort = ""; // Datenbank-Passwort (bei XAMPP leer)
$datenbank = "meine_shop_datenbank"; // Datenbankname
// Verbindung herstellen
$conn = mysqli_connect($host, $benutzer, $passwort, $datenbank);
// Verbindung prüfen
if (!$conn) {
die("Verbindungsfehler: " . mysqli_connect_error());
}
echo "Verbindung erfolgreich!";
// Zeichenkodierung setzen (wichtig!)
mysqli_set_charset($conn, "utf8mb4");
// Verbindung schließen (wenn nicht mehr benötigt)
mysqli_close($conn);
?>Verbindung herstellen (objektorientierte Variante - empfohlen)
php
<?php
// Datenbank-Zugangsdaten
$host = "localhost";
$benutzer = "root";
$passwort = "";
$datenbank = "meine_shop_datenbank";
// Verbindung herstellen (objektorientiert)
$conn = new mysqli($host, $benutzer, $passwort, $datenbank);
// Verbindung prüfen
if ($conn->connect_error) {
die("Verbindungsfehler: " . $conn->connect_error);
}
echo "Verbindung erfolgreich!";
// Zeichenkodierung setzen
$conn->set_charset("utf8mb4");
// Verbindung schließen
$conn->close();
?>Fehlerbehandlung bei Verbindungsproblemen
| Problem | Lösung |
|---|---|
| Verbindung fehlgeschlagen | Datenbank-Zugangsdaten prüfen |
| Zugriff verweigert | Benutzerrechte in MySQL prüfen |
| Datenbank nicht gefunden | Datenbanknamen prüfen (Groß-/Kleinschreibung!) |
| Zeichenkodierungsprobleme | mysqli_set_charset($conn, "utf8mb4") verwenden |
12.2 Abfragen ausführen (mysqli_query)
Abfragen ausführen (prozedurale Variante)
php
<?php
$conn = mysqli_connect("localhost", "root", "", "meine_shop_datenbank");
mysqli_set_charset($conn, "utf8mb4");
// SQL-Abfrage
$sql = "SELECT * FROM benutzer";
$result = mysqli_query($conn, $sql);
// Prüfen, ob Abfrage erfolgreich war
if ($result) {
echo "Abfrage erfolgreich!";
// Anzahl der Datensätze
$anzahl = mysqli_num_rows($result);
echo "Anzahl Datensätze: " . $anzahl;
// Ergebnis freigeben (speicherfreigabe)
mysqli_free_result($result);
} else {
echo "Fehler bei der Abfrage: " . mysqli_error($conn);
}
mysqli_close($conn);
?>Abfragen ausführen (objektorientierte Variante - empfohlen)
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// SQL-Abfrage
$sql = "SELECT * FROM benutzer";
$result = $conn->query($sql);
// Prüfen, ob Abfrage erfolgreich war
if ($result) {
echo "Abfrage erfolgreich!";
// Anzahl der Datensätze
$anzahl = $result->num_rows;
echo "Anzahl Datensätze: " . $anzahl;
// Ergebnis freigeben
$result->free();
} else {
echo "Fehler bei der Abfrage: " . $conn->error;
}
$conn->close();
?>12.3 Daten abfragen (SELECT)
SELECT-Abfragen (alle Datensätze)
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Alle Benutzer abfragen
$sql = "SELECT * FROM benutzer";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Ergebnisse durchlaufen
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . "<br>";
echo "Name: " . $row["name"] . "<br>";
echo "E-Mail: " . $row["email"] . "<br>";
echo "<hr>";
}
} else {
echo "Keine Datensätze gefunden.";
}
$result->free();
$conn->close();
?>SELECT-Abfragen (mit Bedingungen)
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Benutzer mit ID 1 abfragen
$sql = "SELECT * FROM benutzer WHERE id = 1";
$result = $conn->query($sql);
if ($result->num_rows == 1) {
$row = $result->fetch_assoc();
echo "Name: " . $row["name"] . "<br>";
echo "E-Mail: " . $row["email"] . "<br>";
}
// Benutzer suchen, deren Name "Max" enthält
$sql = "SELECT * FROM benutzer WHERE name LIKE '%Max%'";
$result = $conn->query($sql);
// Benutzer nach Namen sortieren
$sql = "SELECT * FROM benutzer ORDER BY name ASC";
$result = $conn->query($sql);
$result->free();
$conn->close();
?>Verschiedene fetch-Methoden
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
$sql = "SELECT * FROM benutzer";
$result = $conn->query($sql);
// 1. fetch_assoc() - Assoziatives Array (empfohlen)
while ($row = $result->fetch_assoc()) {
echo $row["name"];
}
// 2. fetch_row() - Index-Array
$result->data_seek(0); // Zurück zum Anfang
while ($row = $result->fetch_row()) {
echo $row[1]; // name ist an Index 1
}
// 3. fetch_array() - Beides (assoZiativ + Index)
$result->data_seek(0);
while ($row = $result->fetch_array()) {
echo $row["name"] . " / " . $row[1];
}
// 4. fetch_object() - Objekt
$result->data_seek(0);
while ($row = $result->fetch_object()) {
echo $row->name;
}
$result->free();
$conn->close();
?>12.4 Daten hinzufügen (INSERT)
INSERT-Abfragen
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Neuen Benutzer hinzufügen
$name = "Sabine";
$email = "sabine@beispiel.de";
$passwort = password_hash("geheim", PASSWORD_DEFAULT);
$sql = "INSERT INTO benutzer (name, email, passwort)
VALUES ('$name', '$email', '$passwort')";
if ($conn->query($sql) === TRUE) {
echo "Benutzer erfolgreich hinzugefügt!";
echo "Neue ID: " . $conn->insert_id; // ID des neuen Datensatzes
} else {
echo "Fehler: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>Sichere INSERT-Abfragen (Prepared Statements - empfohlen!)
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Prepared Statement vorbereiten
$sql = "INSERT INTO benutzer (name, email, passwort) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
// Parameter binden
$name = "Sabine";
$email = "sabine@beispiel.de";
$passwort = password_hash("geheim", PASSWORD_DEFAULT);
$stmt->bind_param("sss", $name, $email, $passwort);
// Ausführen
if ($stmt->execute()) {
echo "Benutzer erfolgreich hinzugefügt!";
echo "Neue ID: " . $stmt->insert_id;
} else {
echo "Fehler: " . $stmt->error;
}
$stmt->close();
$conn->close();
?>12.5 Daten aktualisieren (UPDATE)
UPDATE-Abfragen
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Benutzer mit ID 1 aktualisieren
$sql = "UPDATE benutzer SET email = 'max.neu@beispiel.de' WHERE id = 1";
if ($conn->query($sql) === TRUE) {
echo "Datensatz erfolgreich aktualisiert!";
echo "Betroffene Zeilen: " . $conn->affected_rows;
} else {
echo "Fehler: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>Sichere UPDATE-Abfragen (Prepared Statements)
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Prepared Statement vorbereiten
$sql = "UPDATE benutzer SET email = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
// Parameter binden
$neue_email = "max.neu@beispiel.de";
$id = 1;
$stmt->bind_param("si", $neue_email, $id);
// Ausführen
if ($stmt->execute()) {
echo "Datensatz erfolgreich aktualisiert!";
echo "Betroffene Zeilen: " . $stmt->affected_rows;
} else {
echo "Fehler: " . $stmt->error;
}
$stmt->close();
$conn->close();
?>12.6 Daten löschen (DELETE)
DELETE-Abfragen
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Benutzer mit ID 3 löschen
$sql = "DELETE FROM benutzer WHERE id = 3";
if ($conn->query($sql) === TRUE) {
echo "Datensatz erfolgreich gelöscht!";
echo "Betroffene Zeilen: " . $conn->affected_rows;
} else {
echo "Fehler: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>Sichere DELETE-Abfragen (Prepared Statements)
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_shop_datenbank");
$conn->set_charset("utf8mb4");
// Prepared Statement vorbereiten
$sql = "DELETE FROM benutzer WHERE id = ?";
$stmt = $conn->prepare($sql);
// Parameter binden
$id = 3;
$stmt->bind_param("i", $id);
// Ausführen
if ($stmt->execute()) {
echo "Datensatz erfolgreich gelöscht!";
echo "Betroffene Zeilen: " . $stmt->affected_rows;
} else {
echo "Fehler: " . $stmt->error;
}
$stmt->close();
$conn->close();
?>12.7 SQL-Injection verhindern
Was ist SQL-Injection?
SQL-Injection: Eine Sicherheitslücke, bei der Angreifer bösartigen SQL-Code einschleusen.
Beispiel für anfälligen Code:
php
<?php
// GEFÄHRLICH! SQL-Injection möglich!
$name = $_POST['name'];
$sql = "SELECT * FROM benutzer WHERE name = '$name'";
$result = $conn->query($sql);
// Wenn Angreifer als $name eingibt:
// ' OR '1'='1
// Dann wird die SQL-Abfrage zu:
// SELECT * FROM benutzer WHERE name = '' OR '1'='1'
// Das gibt ALLE Benutzer zurück!
?>Schutzmaßnahmen gegen SQL-Injection
1. Prepared Statements verwenden (wichtigste Maßnahme!)
php
<?php
// SICHER! Prepared Statements verwenden
$sql = "SELECT * FROM benutzer WHERE name = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $name);
$stmt->execute();
$result = $stmt->get_result();
?>2. Eingaben validieren und bereinigen
php
<?php
// Eingabe validieren
$name = trim($_POST['name'] ?? '');
if (empty($name)) {
die("Name darf nicht leer sein.");
}
if (!preg_match('/^[A-Za-zÄäÖöÜüß ]+$/', $name)) {
die("Name enthält ungültige Zeichen.");
}
// Für numerische Werte: (int) oder intval() verwenden
$id = (int) ($_POST['id'] ?? 0);
// Für Strings: htmlspecialchars() verwenden (gegen XSS)
$name_sicher = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
?>3. mysqli_real_escape_string() (wenn Prepared Statements nicht möglich)
php
<?php
// Nicht ideal, aber besser als nichts
$name = mysqli_real_escape_string($conn, $_POST['name']);
$sql = "SELECT * FROM benutzer WHERE name = '$name'";
$result = $conn->query($sql);
?>Wichtig: Prepared Statements sind IMMER vorzuziehen!
12.8 Praxis: Benutzerverwaltung (CRUD)
CRUD = Create (INSERT), Read (SELECT), Update (UPDATE), Delete (DELETE)
Vollständiges CRUD-Beispiel
php
<?php
// config.php (Datenbank-Konfiguration)
$host = "localhost";
$benutzer = "root";
$passwort = "";
$datenbank = "meine_shop_datenbank";
$conn = new mysqli($host, $benutzer, $passwort, $datenbank);
if ($conn->connect_error) {
die("Verbindungsfehler: " . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
?>
<?php
// CRUD-Operationen
// 1. CREATE (Benutzer hinzufügen)
function benutzerHinzufuegen($conn, $name, $email, $passwort) {
$sql = "INSERT INTO benutzer (name, email, passwort) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$passwort_hash = password_hash($passwort, PASSWORD_DEFAULT);
$stmt->bind_param("sss", $name, $email, $passwort_hash);
if ($stmt->execute()) {
return "Benutzer erfolgreich hinzugefügt! ID: " . $stmt->insert_id;
} else {
return "Fehler: " . $stmt->error;
}
}
// 2. READ (Benutzer abfragen)
function benutzerAbfragen($conn, $id = null) {
if ($id) {
$sql = "SELECT * FROM benutzer WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_assoc();
} else {
$sql = "SELECT * FROM benutzer";
$result = $conn->query($sql);
$benutzer = [];
while ($row = $result->fetch_assoc()) {
$benutzer[] = $row;
}
return $benutzer;
}
}
// 3. UPDATE (Benutzer aktualisieren)
function benutzerAktualisieren($conn, $id, $name, $email) {
$sql = "UPDATE benutzer SET name = ?, email = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $name, $email, $id);
if ($stmt->execute()) {
return "Benutzer erfolgreich aktualisiert!";
} else {
return "Fehler: " . $stmt->error;
}
}
// 4. DELETE (Benutzer löschen)
function benutzerLoeschen($conn, $id) {
$sql = "DELETE FROM benutzer WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
if ($stmt->execute()) {
return "Benutzer erfolgreich gelöscht!";
} else {
return "Fehler: " . $stmt->error;
}
}
// Beispielverwendung:
// echo benutzerHinzufuegen($conn, "Test", "test@beispiel.de", "passwort");
// $benutzer = benutzerAbfragen($conn, 1);
// echo benutzerAktualisieren($conn, 1, "Max Müller", "max@neu.de");
// echo benutzerLoeschen($conn, 3);
?>
<?php
// benutzer_verwalten.php (Benutzeroberfläche)
require_once 'config.php';
// Alle Benutzer anzeigen
$alle_benutzer = benutzerAbfragen($conn);
echo "<h2>Benutzerverwaltung</h2>";
echo "<table border='1'>";
echo "<tr><th>ID</th><th>Name</th><th>E-Mail</th><th>Aktionen</th></tr>";
foreach ($alle_benutzer as $benutzer) {
echo "<tr>";
echo "<td>" . $benutzer['id'] . "</td>";
echo "<td>" . htmlspecialchars($benutzer['name']) . "</td>";
echo "<td>" . htmlspecialchars($benutzer['email']) . "</td>";
echo "<td>";
echo "<a href='bearbeiten.php?id=" . $benutzer['id'] . "'>Bearbeiten</a> | ";
echo "<a href='loeschen.php?id=" . $benutzer['id'] . "' onclick='return confirm(\"Wirklich löschen?\")'>Löschen</a>";
echo "</td>";
echo "</tr>";
}
echo "</table>";
$conn->close();
?>Zusammenfassung
In diesem Kapitel haben Sie:
- ✅ MySQL-Verbindung mit
mysqli_connect()hergestellt - ✅ Datenbankabfragen mit
mysqli_query()ausgeführt - ✅ Daten mit
SELECTabgefragt - ✅ Daten mit
INSERThinzugefügt - ✅ Daten mit
UPDATEaktualisiert - ✅ Daten mit
DELETEgelöscht - ✅ SQL-Injection verhindert (Prepared Statements)
- ✅ Eine vollständige CRUD-Anwendung erstellt
Nächstes Kapitel: Wir werden Datei-Upload und Bildverarbeitung lernen.
Übungsaufgaben:
- Erstellen Sie ein Produktverwaltungssystem (CRUD)
- Implementieren Sie eine Suchfunktion für Benutzer
- Erstellen Sie eine Paginierung (Seitenaufteilung) für Benutzerliste
- Schützen Sie alle Datenbankoperationen vor SQL-Injection
Häufige Fehler:
- ❌
mysqli_close()vergessen → Kann zu Ressourcenlecks führen - ❌ SQL-Injection nicht beachten → Immer Prepared Statements verwenden!
- ❌ Zeichenkodierung nicht setzen →
mysqli_set_charset($conn, "utf8mb4")verwenden - ❌
DELETE FROM tabelleohneWHERE→ Löscht ALLE Datensätze!
