Signatur
Beschreibung
mysqli_change_user() ermöglicht es, den Datenbankbenutzer einer bereits geöffneten Verbindung zu wechseln, ohne die Verbindung zu schließen und neu aufzubauen. Dabei wird der neue Benutzer authentifiziert, und der gesamte Verbindungsstatus wird zurückgesetzt – das bedeutet, alle laufenden Transaktionen werden zurückgerollt, temporäre Tabellen werden gelöscht, Sitzungsvariablen werden zurückgesetzt und gesetzte Locks werden aufgehoben.
Diese Funktion ist nützlich in Szenarien, in denen eine Applikation innerhalb derselben Verbindung (z. B. aus einem Connection-Pool) unter verschiedenen Datenbankbenutzern arbeiten muss – etwa beim Wechsel zwischen Applikationsrollen oder beim Implementieren von Row-Level-Security durch unterschiedliche Datenbankbenutzer.
Als optionaler Parameter kann eine Datenbank angegeben werden, auf die nach dem Benutzerwechsel gewechselt wird. Wird null übergeben, bleibt die aktuelle Datenbank erhalten, ohne eine neue auszuwählen. Die Funktion steht sowohl im prozeduralen (mysqli_change_user()) als auch im objektorientierten Stil ($mysqli->change_user()) zur Verfügung.
Schlägt die Authentifizierung des neuen Benutzers fehl, bleibt die Verbindung unter dem ursprünglichen Benutzer aktiv. Es empfiehlt sich, den Rückgabewert stets zu prüfen, um sicherzustellen, dass der Benutzerwechsel tatsächlich erfolgreich war.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Ein MySQLi-Verbindungsobjekt, das von mysqli_connect() oder mysqli_init() zurückgegeben wurde. |
|
| $username Pflicht | string | Der MySQL-Benutzername, auf den gewechselt werden soll. | |
| $password Pflicht | string | Das Passwort des neuen Datenbankbenutzers. | |
| $database Pflicht | ?string | Die Datenbank, die nach dem Benutzerwechsel ausgewählt werden soll. Bei null wird keine Datenbank ausgewählt und die aktuelle Datenbankauswahl bleibt erhalten. |
Rückgabewert
true zurück, wenn der Benutzerwechsel erfolgreich war, andernfalls false. Bei einem Fehler kann die Fehlermeldung über mysqli_error() abgerufen werden.Beispiele
Benutzerwechsel auf einer bestehenden Verbindung (prozedural)
<?php
// Verbindung mit dem Standard-Admin-Benutzer aufbauen
$mysqli = mysqli_connect('localhost', 'admin', 'adminpassword', 'mydb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
echo "Aktueller Benutzer: ";
$result = mysqli_query($mysqli, "SELECT CURRENT_USER()");
$row = mysqli_fetch_row($result);
echo $row[0] . PHP_EOL;
// Zu einem anderen Benutzer wechseln
if (mysqli_change_user($mysqli, 'readonly_user', 'readonlypass', 'mydb')) {
echo "Benutzerwechsel erfolgreich!" . PHP_EOL;
$result = mysqli_query($mysqli, "SELECT CURRENT_USER()");
$row = mysqli_fetch_row($result);
echo "Neuer Benutzer: " . $row[0] . PHP_EOL;
} else {
echo "Benutzerwechsel fehlgeschlagen: " . mysqli_error($mysqli) . PHP_EOL;
}
mysqli_close($mysqli);
Benutzerwechsel im objektorientierten Stil mit Statusreset-Nachweis
<?php
$mysqli = new mysqli('localhost', 'admin', 'adminpassword', 'mydb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Sitzungsvariable setzen
$mysqli->query("SET @session_var = 'Hallo'");
$result = $mysqli->query("SELECT @session_var");
$row = $result->fetch_row();
echo "Vor Benutzerwechsel: @session_var = " . $row[0] . PHP_EOL;
// Benutzer wechseln — setzt Sitzungsstatus zurück
if ($mysqli->change_user('readonly_user', 'readonlypass', 'mydb')) {
$result = $mysqli->query("SELECT @session_var");
$row = $result->fetch_row();
// Die Sitzungsvariable wurde durch den Benutzerwechsel zurückgesetzt
echo "Nach Benutzerwechsel: @session_var = " . ($row[0] ?? 'NULL') . PHP_EOL;
} else {
echo "Benutzerwechsel fehlgeschlagen: " . $mysqli->error . PHP_EOL;
}
$mysqli->close();
// Wichtig · Fallstricke
Sicherheitshinweis: Übergeben Sie Benutzername und Passwort niemals direkt aus Benutzereingaben ohne vorherige Validierung. Obwohl mysqli_change_user() keine SQL-Injection-Gefahr im klassischen Sinne darstellt, könnten manipulierte Werte unerwünschte Authentifizierungsversuche auslösen.
Verbindungsstatus-Reset: Der vollständige Zurücksetzung des Verbindungsstatus ist eine wichtige Eigenschaft der Funktion – alle nicht abgeschlossenen Transaktionen werden zurückgerollt, temporäre Tabellen und Sperren werden verworfen. Planen Sie dieses Verhalten bewusst ein.
Datenbankparameter: Wird null als Datenbankparameter übergeben, wird keine Datenbank ausgewählt. Vor der Ausführung von Abfragen muss dann explizit mysqli_select_db() aufgerufen oder die Datenbank in den SQL-Abfragen qualifiziert werden.
Connection-Pool: Beim Einsatz in Connection-Pools empfiehlt es sich, nach der Rückgabe einer Verbindung mysqli_change_user() aufzurufen, um sicherzustellen, dass keine Zustandsreste des vorherigen Nutzers erhalten bleiben.