Signatur
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();
}
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();
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();
}
// 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').