Start · Sprachen · PHP · Referenz · mysqli_real_connect

mysqli_real_connect

Funktion

Baut eine Verbindung zu einem MySQL-Server auf und bietet dabei mehr Konfigurationsoptionen als <code>mysqli_connect()</code>.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_real_connect(mysqli $mysql, ?string $host = null, ?string $username = null, ?string $password = null, ?string $database = null, ?int $port = null, ?string $socket = null, int $flags = 0): bool

Beschreibung

mysqli_real_connect() stellt eine Verbindung zu einem MySQL-Datenbankserver her. Im Gegensatz zu mysqli_connect() setzt diese Funktion voraus, dass das mysqli-Objekt zuvor mit mysqli_init() erzeugt wurde. Das ermöglicht es, vor dem eigentlichen Verbindungsaufbau Optionen über mysqli_options() zu setzen, z. B. SSL-Zertifikate oder Verbindungs-Timeouts.

Über den Parameter flags lassen sich spezielle Verbindungsoptionen aktivieren, darunter MYSQLI_CLIENT_SSL für SSL-Verschlüsselung, MYSQLI_CLIENT_COMPRESS für Komprimierung des Datenstroms oder MYSQLI_CLIENT_FOUND_ROWS, um die Anzahl gefundener statt betroffener Zeilen zurückzugeben.

Diese Funktion ist besonders dann sinnvoll, wenn eine bestehende (persistente) Verbindung wiederverwendet werden soll oder wenn vor der Verbindung spezifische SSL-Parameter oder andere Low-Level-Optionen gesetzt werden müssen. Mit MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT kann die Zertifikatsprüfung deaktiviert werden – dies sollte in Produktionsumgebungen jedoch vermieden werden.

Im objektorientierten Stil steht die Methode mysqli::real_connect() zur Verfügung, die identisch funktioniert.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Ein zuvor mit mysqli_init() erstelltes mysqli-Objekt.
$host ?string null Hostname oder IP-Adresse des MySQL-Servers. Wird null oder ein leerer String übergeben, wird der Wert aus der PHP-Konfiguration (mysqli.default_host) verwendet. Ein vorangestelltes p: öffnet eine persistente Verbindung.
$username ?string null MySQL-Benutzername. Bei null wird der Wert aus mysqli.default_user genutzt.
$password ?string null Passwort des MySQL-Benutzers. Bei null wird der Wert aus mysqli.default_pw genutzt.
$database ?string null Name der Standarddatenbank, die nach dem Verbindungsaufbau ausgewählt werden soll. Kann null sein, wenn keine Datenbank vorausgewählt werden soll.
$port ?int null TCP/IP-Port, über den die Verbindung hergestellt wird. Bei null wird der Wert aus mysqli.default_port genutzt.
$socket ?string null Pfad zum Unix-Socket oder zur Named Pipe. Bei null wird der Wert aus mysqli.default_socket genutzt. Das Setzen dieses Parameters erzwingt nicht die Verbindungsart; dafür muss host entsprechend gesetzt sein.
$flags int 0 Bitmaske aus Verbindungsflags. Mögliche Werte: MYSQLI_CLIENT_COMPRESS, MYSQLI_CLIENT_FOUND_ROWS, MYSQLI_CLIENT_IGNORE_SPACE, MYSQLI_CLIENT_INTERACTIVE, MYSQLI_CLIENT_SSL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei erfolgreicher Verbindung zurück, false bei einem Fehler. Im Fehlerfall können Details über mysqli_connect_error() bzw. mysqli_connect_errno() abgefragt werden.

Beispiele

Einfache Verbindung mit mysqli_init und mysqli_real_connect

<?php
$mysqli = mysqli_init();

if (!$mysqli) {
    die('mysqli_init() fehlgeschlagen');
}

// Optional: Verbindungs-Timeout setzen
mysqli_options($mysqli, MYSQLI_OPT_CONNECT_TIMEOUT, 5);

$connected = mysqli_real_connect(
    $mysqli,
    'localhost',
    'db_user',
    'geheimes_passwort',
    'meine_datenbank',
    3306
);

if (!$connected) {
    die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}

echo 'Verbindung erfolgreich aufgebaut.' . PHP_EOL;

$result = mysqli_query($mysqli, 'SELECT VERSION() AS version');
$row = mysqli_fetch_assoc($result);
echo 'MySQL-Version: ' . $row['version'] . PHP_EOL;

mysqli_close($mysqli);
Verbindung erfolgreich aufgebaut. MySQL-Version: 8.0.33

SSL-gesicherte Verbindung mit mysqli_real_connect

<?php
$mysqli = mysqli_init();

if (!$mysqli) {
    die('mysqli_init() fehlgeschlagen');
}

// SSL-Zertifikate konfigurieren
mysqli_ssl_set(
    $mysqli,
    '/etc/ssl/client-key.pem',   // Privater Schlüssel
    '/etc/ssl/client-cert.pem',  // Client-Zertifikat
    '/etc/ssl/ca-cert.pem',      // CA-Zertifikat
    null,
    null
);

$connected = mysqli_real_connect(
    $mysqli,
    'db.example.com',
    'ssl_user',
    'sicheres_passwort',
    'produktions_db',
    3306,
    null,
    MYSQLI_CLIENT_SSL
);

if (!$connected) {
    die('SSL-Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}

echo 'SSL-Verbindung erfolgreich aufgebaut.' . PHP_EOL;

// SSL-Status prüfen
$result = mysqli_query($mysqli, "SHOW STATUS LIKE 'Ssl_cipher'");
$row = mysqli_fetch_assoc($result);
echo 'SSL-Cipher: ' . $row['Value'] . PHP_EOL;

mysqli_close($mysqli);
SSL-Verbindung erfolgreich aufgebaut. SSL-Cipher: TLS_AES_256_GCM_SHA384

// Wichtig · Fallstricke

Sicherheit: Verwende in Produktionsumgebungen niemals MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, da dies Man-in-the-Middle-Angriffe ermöglicht. Setze stattdessen ein gültiges CA-Zertifikat über mysqli_ssl_set().

Passwörter: Speichere Datenbankpasswörter niemals im Quellcode. Nutze Umgebungsvariablen oder gesicherte Konfigurationsdateien außerhalb des Web-Roots.

Persistente Verbindungen: Wird dem Hostnamen ein p: vorangestellt, wird eine persistente Verbindung aus dem Verbindungspool wiederverwendet. Dies kann die Performance verbessern, erfordert aber sorgfältige Handhabung von Transaktionszuständen, da Verbindungen wiederverwendet werden können.

Fehlerbehandlung: Seit PHP 8.1 ist mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) standardmäßig aktiv, sodass Fehler als Exceptions geworfen werden. In älteren Versionen muss der Rückgabewert explizit geprüft werden.