Start · Sprachen · PHP · Referenz · mysqli

mysqli

Klasse

Repräsentiert eine Verbindung zwischen PHP und einer MySQL-Datenbank und bietet eine objektorientierte Schnittstelle für alle Datenbankoperationen.

seit PHP 5.0.0 Kategorie: db

Signatur

class mysqli

Beschreibung

Die Klasse mysqli (MySQL Improved Extension) ist die objektorientierte Schnittstelle zur MySQL-Datenbank und der empfohlene Nachfolger der veralteten mysql_*-Funktionen. Sie unterstützt vorbereitete Anweisungen (Prepared Statements), Transaktionen, mehrfache Abfragen sowie SSL-gesicherte Verbindungen.

Ein mysqli-Objekt wird entweder über den Konstruktor oder die statische Methode mysqli::connect() erstellt. Nach erfolgreicher Verbindung können Abfragen per query(), prepare() oder multi_query() ausgeführt werden. Für benutzerdefinierte Eingaben sollten stets Prepared Statements mit prepare() und bind_param() verwendet werden, um SQL-Injection zu verhindern.

Die Klasse unterstützt sowohl prozedurale als auch objektorientierte Verwendung. Die objektorientierte Variante gilt als moderner und übersichtlicher. Fehler werden standardmäßig als Ausnahmen vom Typ mysqli_sql_exception geworfen (seit PHP 8.1 standardmäßig aktiv), was eine saubere Fehlerbehandlung mit try/catch ermöglicht.

Für Anwendungen, die Datenbankabstraktion oder mehrere Datenbanksysteme unterstützen müssen, kann alternativ PDO in Betracht gezogen werden. mysqli ist jedoch speziell auf MySQL/MariaDB optimiert und bietet einige MySQL-spezifische Funktionen wie mysqli_real_escape_string() oder multi_query().

Parameter

Name Typ Default Beschreibung
$host string|null ini_get("mysqli.default_host") Hostname oder IP-Adresse des MySQL-Servers. Ein vorangestelltes p: öffnet eine persistente Verbindung. null oder leer verwendet den Standardwert aus der php.ini.
$username string|null ini_get("mysqli.default_user") MySQL-Benutzername für die Authentifizierung.
$password string|null ini_get("mysqli.default_pw") Passwort des MySQL-Benutzers. null oder leer bedeutet kein Passwort.
$database string|null Name der Standarddatenbank, die nach dem Verbindungsaufbau ausgewählt wird. Kann später mit select_db() geändert werden.
$port int|null ini_get("mysqli.default_port") TCP-Port des MySQL-Servers. Standard ist 3306.
$socket string|null ini_get("mysqli.default_socket") Unix-Socket oder Named Pipe für die Verbindung. Wird nur verwendet, wenn host localhost oder null ist.

Beispiele

Einfache Verbindung und Abfrage

<?php
// Fehler als Ausnahmen werfen (Standard ab PHP 8.1, für ältere Versionen explizit setzen)
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $db = new mysqli('localhost', 'benutzer', 'geheimesPasswort', 'meineDatenbank');

    $result = $db->query('SELECT id, name FROM benutzer LIMIT 5');

    while ($row = $result->fetch_assoc()) {
        echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
    }

    $result->free();
    $db->close();
} catch (mysqli_sql_exception $e) {
    echo 'Datenbankfehler: ' . $e->getMessage();
}
1: Alice 2: Bob 3: Charlie 4: Diana 5: Evan

Prepared Statement mit Benutzereingabe

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$db = new mysqli('localhost', 'benutzer', 'geheimesPasswort', 'meineDatenbank');

// Benutzereingabe – niemals direkt in eine Abfrage einbauen!
$benutzerId = 42;

// Prepared Statement schützt vor SQL-Injection
$stmt = $db->prepare('SELECT id, name, email FROM benutzer WHERE id = ?');
$stmt->bind_param('i', $benutzerId); // 'i' = integer
$stmt->execute();

$result = $stmt->get_result();

if ($row = $result->fetch_assoc()) {
    echo 'Name: ' . $row['name'] . PHP_EOL;
    echo 'E-Mail: ' . $row['email'] . PHP_EOL;
} else {
    echo 'Kein Benutzer gefunden.';
}

$stmt->close();
$db->close();
Name: Max Mustermann E-Mail: max@example.com

Transaktion mit Rollback bei Fehler

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$db = new mysqli('localhost', 'benutzer', 'geheimesPasswort', 'meineDatenbank');

try {
    $db->begin_transaction();

    $db->query("UPDATE konten SET betrag = betrag - 100 WHERE id = 1");
    $db->query("UPDATE konten SET betrag = betrag + 100 WHERE id = 2");

    $db->commit();
    echo 'Transaktion erfolgreich.';
} catch (mysqli_sql_exception $e) {
    $db->rollback();
    echo 'Fehler, Rollback durchgeführt: ' . $e->getMessage();
} finally {
    $db->close();
}
Transaktion erfolgreich.

// Wichtig · Fallstricke

Sicherheit: Verwende für alle Abfragen mit Benutzereingaben ausschließlich Prepared Statements (prepare() + bind_param()). real_escape_string() ist kein vollständiger Ersatz und fehleranfällig. SQL-Injection ist eine der häufigsten und gefährlichsten Sicherheitslücken in Webanwendungen.

Fehlerbehandlung: Seit PHP 8.1 werden Fehler standardmäßig als mysqli_sql_exception geworfen. Für ältere PHP-Versionen sollte mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) zu Beginn des Skripts gesetzt werden, um konsistentes Fehlerverhalten sicherzustellen.

Persistente Verbindungen: Das Präfix p: vor dem Hostnamen (z. B. p:localhost) aktiviert persistente Verbindungen. Diese können die Performance verbessern, erfordern aber besondere Vorsicht bei Transaktionen und Sitzungszustand, da Verbindungen aus einem Pool wiederverwendet werden.

Zeichenkodierung: Die Verbindungskodierung sollte explizit auf utf8mb4 gesetzt werden, um alle Unicode-Zeichen (inkl. Emojis) korrekt zu speichern: $db->set_charset('utf8mb4').