Signatur
Beschreibung
mysqli_connect() ist der prozedurale Pendant zur objektorientierten new mysqli()-Syntax und stellt eine Verbindung zu einem MySQL- oder MariaDB-Datenbankserver her. Die Funktion gibt bei Erfolg ein mysqli-Verbindungsobjekt zurück, das für alle nachfolgenden Datenbankoperationen benötigt wird.
Die Verbindungsparameter wie Host, Benutzername, Passwort, Datenbankname, Port und Socket können direkt übergeben werden. Werden Parameter weggelassen oder als null übergeben, verwendet PHP die in der php.ini definierten Standardwerte (z. B. mysqli.default_host, mysqli.default_user etc.).
Im Host-Parameter können spezielle Präfixe verwendet werden: p: vor dem Hostnamen aktiviert persistente Verbindungen (Connection Pooling), was bei häufigen Datenbankzugriffen die Performance verbessern kann. Bei der Verwendung persistenter Verbindungen sollte jedoch auf unerwartete Zustände geachtet werden.
Für moderne PHP-Anwendungen empfiehlt sich oft PDO als datenbankabstrahierende Alternative, da es mehrere Datenbanksysteme unterstützt. mysqli_connect() ist jedoch weiterhin die erste Wahl, wenn ausschließlich MySQL/MariaDB eingesetzt wird und die prozedurale Schreibweise bevorzugt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $host | string | ini_get('mysqli.default_host') | Hostname oder IP-Adresse des MySQL-Servers. Das Präfix p: aktiviert persistente Verbindungen. Wird null übergeben, wird der php.ini-Standardwert verwendet. |
| $username | string | ini_get('mysqli.default_user') | MySQL-Benutzername für die Anmeldung. Wird null übergeben, wird der php.ini-Standardwert verwendet. |
| $password | string | ini_get('mysqli.default_pw') | Passwort des MySQL-Benutzers. Wird null übergeben, wird der php.ini-Standardwert verwendet. |
| $database | string | Name der Standarddatenbank, die nach dem Verbindungsaufbau ausgewählt werden soll. Kann auch nachträglich mit mysqli_select_db() gesetzt werden. |
|
| $port | int | ini_get('mysqli.default_port') | TCP-Port des MySQL-Servers. Standardmäßig 3306, sofern in der php.ini kein anderer Wert konfiguriert ist. |
| $socket | string | ini_get('mysqli.default_socket') | Pfad zum Unix-Socket oder Name der Named Pipe. Wird nur verwendet, wenn der Host localhost oder 127.0.0.1 ist. |
Rückgabewert
mysqli-Objekt zurück. Im Fehlerfall wird false zurückgegeben und ein Fehler der Stufe E_WARNING ausgelöst. Der Fehlertext ist über mysqli_connect_error() und der Fehlercode über mysqli_connect_errno() abrufbar.Beispiele
Einfache Datenbankverbindung mit Fehlerbehandlung
<?php
$host = 'localhost';
$user = 'mein_benutzer';
$password = 'geheimes_passwort';
$database = 'meine_datenbank';
$conn = mysqli_connect($host, $user, $password, $database);
if (!$conn) {
die('Verbindungsfehler (' . mysqli_connect_errno() . '): ' . mysqli_connect_error());
}
echo 'Verbindung erfolgreich hergestellt.';
// Datenbankoperationen ...
mysqli_close($conn);
Persistente Verbindung mit benutzerdefiniertem Port
<?php
// Persistente Verbindung über Präfix 'p:' und nicht standardmäßigen Port
$conn = mysqli_connect('p:db.example.com', 'app_user', 'sicheres_pw', 'shop', 3307);
if (!$conn) {
fprintf(STDERR, "Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit(1);
}
// Zeichensatz auf UTF-8 setzen
mysqli_set_charset($conn, 'utf8mb4');
$result = mysqli_query($conn, 'SELECT COUNT(*) AS anzahl FROM produkte');
$row = mysqli_fetch_assoc($result);
echo 'Anzahl Produkte: ' . $row['anzahl'];
mysqli_close($conn);
Vergleich prozedural vs. objektorientiert
<?php
// Prozedural (mysqli_connect)
$conn1 = mysqli_connect('localhost', 'user', 'pass', 'testdb');
// Objektorientiert (äquivalent)
$conn2 = new mysqli('localhost', 'user', 'pass', 'testdb');
// Beide liefern dasselbe mysqli-Objekt
var_dump($conn1 instanceof mysqli); // bool(true)
var_dump($conn2 instanceof mysqli); // bool(true)
mysqli_close($conn1);
$conn2->close();
// Wichtig · Fallstricke
Sicherheitshinweis: Speichere Zugangsdaten niemals direkt im Quellcode. Verwende stattdessen Umgebungsvariablen oder externe Konfigurationsdateien, die außerhalb des Web-Roots liegen und nicht öffentlich zugänglich sind.
SQL-Injection: Eine geöffnete Verbindung allein schützt nicht vor SQL-Injection. Verwende stets mysqli_prepare() mit gebundenen Parametern (Prepared Statements), um Benutzereingaben sicher in SQL-Abfragen einzubetten.
Zeichensatz: Setze nach dem Verbindungsaufbau explizit den Zeichensatz mit mysqli_set_charset($conn, 'utf8mb4'), um Encoding-Problemen und potenziellen Sicherheitslücken vorzubeugen. Das reine Setzen über SQL (SET NAMES) reicht nicht aus.
Persistente Verbindungen (p:): Persistente Verbindungen werden nicht automatisch zurückgesetzt. Temporäre Tabellen, Transaktionen oder geänderte Sitzungsvariablen aus einem vorherigen Request können noch vorhanden sein. Bereinige den Zustand daher manuell oder verzichte in solchen Fällen auf persistente Verbindungen.