real_connect
In diesem Artikel besprechen wir die Funktion mysqli_real_connect() in PHP, mit der eine Verbindung zu einer MySQL-Datenbank hergestellt wird.
In diesem Artikel besprechen wir die Methode real_connect() in PHP, mit der eine Verbindung zu einer MySQL-Datenbank hergestellt wird. (Das prozedurale Äquivalent ist mysqli_real_connect().)
Diese Seite erläutert, was real_connect() von einem einfachen mysqli_connect() unterscheidet, die vollständige Parameterliste, wie SSL und andere Verbindungsflags aktiviert werden und welche häufigen Fallstricke es gibt.
Was ist real_connect() und warum verwenden?
Die Methode real_connect() öffnet eine Verbindung zu einem MySQL-Server, genau wie mysqli_connect(). Der wesentliche Unterschied besteht darin, dass real_connect() auf einem Verbindungs-Handle operiert, das Sie bereits mit mysqli_init() erstellt haben, anstatt in einem einzigen Schritt zu erstellen und zu verbinden.
Dieser zusätzliche Schritt ist wichtig, da er Ihnen ein Fenster zwischen der Erstellung des Handles und der Verbindung gibt, in dem Sie Optionen konfigurieren können, die nur vor dem Aufbau der Verbindung gesetzt werden können. Verwenden Sie real_connect() (statt mysqli_connect()), wenn Sie Folgendes benötigen:
- Verbindungsoptionen mit
mysqli_options()setzen — zum Beispiel ein Verbindungs-Timeout (MYSQLI_OPT_CONNECT_TIMEOUT) oder lokale Infile-Unterstützung. - Eine SSL/TLS-Verbindung mit
ssl_set()und dem FlagMYSQLI_CLIENT_SSLaktivieren. - Client-Flags wie
MYSQLI_CLIENT_COMPRESSoderMYSQLI_CLIENT_FOUND_ROWSübergeben. - Eine persistente Verbindung durch Voranstellen von
p:vor den Host öffnen.
Wenn Sie nichts davon benötigen, ist das einfachere mysqli_connect() völlig ausreichend.
Grundlegende Verwendung
real_connect() folgt stets einem zweistufigen Muster: Handle erstellen, dann verbinden. Hier ist der objektorientierte Ansatz:
<?php
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init failed');
}
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>Zuerst erstellen wir ein MySQLi-Handle mit mysqli_init() und überprüfen, ob es erfolgreich war. Anschließend rufen wir real_connect() auf dem $mysqli-Objekt auf, um die Verbindung herzustellen. Bei einem Fehler geben wir die Fehlermeldung mit connect_errno und connect_error aus und brechen ab; bei Erfolg geben wir die Host-Info aus und geben die Verbindung schließlich mit close() frei.
Parameter
real_connect() akzeptiert die folgenden Parameter, alle optional, in dieser Reihenfolge:
| Parameter | Beschreibung | Standard |
|---|---|---|
host | Hostname oder IP. Mit p: voranstellen für eine persistente Verbindung. | localhost (oder ini-Standard) |
username | MySQL-Benutzername. | aktueller Benutzer |
password | Das Passwort des Benutzers. | "" |
database | Standarddatenbank, die bei der Verbindung ausgewählt wird. | "" |
port | TCP-Portnummer. | 3306 |
socket | Unix-Socket oder benannte Windows-Pipe. | aus ini |
flags | Bitmaske der Client-Flags (siehe unten). | 0 |
Hinweis: Bei der OO-API ist das Handle das Objekt, sodass das erste Argument der
hostist. Bei dem prozeduralenmysqli_real_connect($link, $host, ...)wird der Link zuerst übergeben.
Optionen vor der Verbindung setzen
Dies ist der Hauptgrund, warum real_connect() existiert. Konfigurieren Sie das Handle mit mysqli_options() zwischen init und real_connect:
<?php
$mysqli = mysqli_init();
// These can only be set before connecting:
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->options(MYSQLI_INIT_COMMAND, "SET autocommit = 0");
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Connected with a 5-second timeout.';
$mysqli->close();
?>Verbindung mit SSL und Client-Flags
Der siebte Parameter ist eine Bitmaske von Client-Flags. Um eine verschlüsselte Verbindung zu erfordern, konfigurieren Sie die Zertifikate mit ssl_set() und übergeben Sie MYSQLI_CLIENT_SSL:
<?php
$mysqli = mysqli_init();
$mysqli->ssl_set(null, null, '/path/to/ca-cert.pem', null, null);
$mysqli->real_connect(
'db.example.com', 'username', 'password', 'database',
3306, null,
MYSQLI_CLIENT_SSL
);
echo 'Encrypted connection established.';
$mysqli->close();
?>Häufige Flags, die Sie mit | kombinieren können:
MYSQLI_CLIENT_SSL— SSL/TLS-Verschlüsselung verwenden.MYSQLI_CLIENT_COMPRESS— das komprimierte Protokoll verwenden.MYSQLI_CLIENT_FOUND_ROWS— übereinstimmende Zeilen statt geänderter Zeilen zurückgeben.
Persistente Verbindungen
Das Voranstellen von p: vor den Host verwendet eine vorhandene Verbindung aus dem Pool über mehrere Anfragen hinweg, anstatt jedes Mal eine neue zu öffnen, was den Verbindungsaufwand auf stark ausgelasteten Servern reduzieren kann:
<?php
$mysqli = mysqli_init();
$mysqli->real_connect('p:localhost', 'username', 'password', 'database');
?>Häufige Fallstricke
mysqli_init()vergessen.real_connect()muss auf einem Handle aufgerufen werden, das vonmysqli_init()zurückgegeben wurde. Ein Aufruf auf einem neu konstruiertennew mysqli(), das bereits verbunden ist, schlägt fehl.- Die falsche Fehlereigenschaft prüfen. Bevor eine Verbindung besteht, verwenden Sie
connect_errno/connect_error, nichterrno/error. - Optionen zu spät setzen. Optionen wie das Verbindungs-Timeout haben keine Wirkung, sobald die Verbindung geöffnet ist — sie müssen vor
real_connect()gesetzt werden.
Fazit
Die Methode real_connect() stellt eine MySQL-Verbindung von einem Handle her, das Sie mit mysqli_init() erstellt haben, und gibt Ihnen die Möglichkeit, Timeouts, SSL und Client-Flags zu konfigurieren, die ein einmaliges mysqli_connect() nicht kann. Nach der Verbindung können Sie Anweisungen mit query() ausführen und eine Datenbank mit select_db() auswählen.