Signatur
Beschreibung
mysqli_options() ermöglicht es, verschiedene Verbindungsoptionen für eine MySQLi-Datenbankverbindung zu konfigurieren. Die Funktion muss nach mysqli_init() und vor mysqli_real_connect() aufgerufen werden, da sie den Verbindungsaufbau beeinflusst.
Typische Anwendungsfälle sind das Setzen von Verbindungs-Timeouts, das Deaktivieren oder Aktivieren des automatischen Reconnects, das Festlegen des standardmäßigen Zeichensatzes oder das Konfigurieren von SSL-Zertifikaten für verschlüsselte Verbindungen.
Die Funktion kann mehrfach nacheinander aufgerufen werden, um verschiedene Optionen zu setzen. Ist eine Option ungültig oder wird ein falscher Wert übergeben, gibt die Funktion false zurück.
- MYSQLI_OPT_CONNECT_TIMEOUT: Verbindungs-Timeout in Sekunden.
- MYSQLI_OPT_READ_TIMEOUT: Lese-Timeout für TCP/IP-Verbindungen (ab PHP 7.2).
- MYSQLI_OPT_LOCAL_INFILE: Aktiviert oder deaktiviert
LOAD DATA LOCAL INFILE. - MYSQLI_INIT_COMMAND: SQL-Befehl, der nach jeder erfolgreichen Verbindung ausgeführt wird.
- MYSQLI_SET_CHARSET_NAME: Setzt den Standard-Zeichensatz der Verbindung.
- MYSQLI_OPT_INT_AND_FLOAT_NATIVE: Gibt Integer- und Float-Werte als native PHP-Typen zurück (Mysqlnd).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Ein MySQLi-Verbindungsobjekt, das zuvor mit mysqli_init() erzeugt wurde. |
|
| $option Pflicht | int | Die zu setzende Option, angegeben als eine der vordefinierten Konstanten, z. B. MYSQLI_OPT_CONNECT_TIMEOUT, MYSQLI_SET_CHARSET_NAME oder MYSQLI_INIT_COMMAND. |
|
| $value Pflicht | string|int | Der Wert der zu setzenden Option. Bei Timeout-Optionen ein Integer, bei Zeichensatz-Optionen oder SQL-Befehlen ein String. |
Rückgabewert
true zurück, wenn die Option erfolgreich gesetzt wurde, andernfalls false, etwa wenn eine ungültige Option oder ein ungültiger Wert übergeben wurde.Beispiele
Verbindungs-Timeout und Zeichensatz setzen
<?php
// Verbindungsobjekt initialisieren
$mysql = mysqli_init();
if (!$mysql) {
die('mysqli_init() fehlgeschlagen');
}
// Timeout auf 5 Sekunden setzen
if (!mysqli_options($mysql, MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Fehler beim Setzen des Timeouts');
}
// Zeichensatz auf UTF-8 setzen
if (!mysqli_options($mysql, MYSQLI_SET_CHARSET_NAME, 'utf8mb4')) {
die('Fehler beim Setzen des Zeichensatzes');
}
// Verbindung aufbauen
if (!mysqli_real_connect($mysql, 'localhost', 'benutzer', 'passwort', 'datenbank')) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
echo 'Verbindung erfolgreich hergestellt.';
mysqli_close($mysql);
SQL-Initialisierungsbefehl nach Verbindungsaufbau ausführen
<?php
// Verbindungsobjekt initialisieren
$mysql = mysqli_init();
if (!$mysql) {
die('mysqli_init() fehlgeschlagen');
}
// SQL-Befehl, der nach jeder Verbindung automatisch ausgeführt wird
// Hier: Setzt die Zeitzone der Sitzung auf 'Europe/Berlin'
mysqli_options($mysql, MYSQLI_INIT_COMMAND, "SET time_zone = '+01:00'");
// LOAD DATA LOCAL INFILE deaktivieren (Sicherheitsmassnahme)
mysqli_options($mysql, MYSQLI_OPT_LOCAL_INFILE, 0);
if (!mysqli_real_connect($mysql, 'localhost', 'benutzer', 'passwort', 'datenbank')) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
$result = mysqli_query($mysql, 'SELECT @@session.time_zone AS tz');
$row = mysqli_fetch_assoc($result);
echo 'Sitzungs-Zeitzone: ' . $row['tz'];
mysqli_close($mysql);
// Wichtig · Fallstricke
Reihenfolge beachten: mysqli_options() muss zwingend nach mysqli_init() und vor mysqli_real_connect() aufgerufen werden. Bei Verwendung mit dem Konstruktor new mysqli() oder mysqli_connect() ist die Funktion nicht verwendbar, da diese den Verbindungsaufbau direkt durchführen.
Sicherheitshinweis: Die Option MYSQLI_OPT_LOCAL_INFILE sollte in produktiven Umgebungen deaktiviert werden (0), sofern nicht explizit benötigt, da LOAD DATA LOCAL INFILE in bestimmten Konfigurationen ein Sicherheitsrisiko darstellen kann.
Mysqlnd-abhängige Optionen: Einige Optionen wie MYSQLI_OPT_INT_AND_FLOAT_NATIVE stehen nur zur Verfügung, wenn PHP mit dem nativen MySQL-Treiber (mysqlnd) kompiliert wurde und nicht mit der libmysqlclient-Bibliothek.