Skip to content

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

ProblemLösung
Verbindung fehlgeschlagenDatenbank-Zugangsdaten prüfen
Zugriff verweigertBenutzerrechte in MySQL prüfen
Datenbank nicht gefundenDatenbanknamen prüfen (Groß-/Kleinschreibung!)
Zeichenkodierungsproblememysqli_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 SELECT abgefragt
  • ✅ Daten mit INSERT hinzugefügt
  • ✅ Daten mit UPDATE aktualisiert
  • ✅ Daten mit DELETE gelöscht
  • ✅ SQL-Injection verhindert (Prepared Statements)
  • ✅ Eine vollständige CRUD-Anwendung erstellt

Nächstes Kapitel: Wir werden Datei-Upload und Bildverarbeitung lernen.


Übungsaufgaben:

  1. Erstellen Sie ein Produktverwaltungssystem (CRUD)
  2. Implementieren Sie eine Suchfunktion für Benutzer
  3. Erstellen Sie eine Paginierung (Seitenaufteilung) für Benutzerliste
  4. 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 tabelle ohne WHERE → Löscht ALLE Datensätze!

Frei für alle Anfänger