change_user
Erklärung der mysqli_change_user()-Funktion in PHP zum Wechseln des Benutzers einer offenen MySQL-Verbindung.
Die Funktion mysqli_change_user() ändert den Benutzer — und optional die Standarddatenbank — einer bereits offenen MySQL-Verbindung, ohne die Verbindung zu trennen und neu aufzubauen. Diese Seite erklärt, was die Funktion bewirkt, welche Parameter und Rückgabewerte sie hat, wann sie wirklich nützlich ist und welche Fallstricke beim erstmaligen Einsatz auftreten können.
Was mysqli_change_user() macht
mysqli_change_user() authentifiziert die bestehende Verbindung neu als einen anderen MySQL-Benutzer. Die TCP/Socket-Verbindung bleibt offen; lediglich die Identität (und damit die Berechtigungen) ändert sich. Es handelt sich um einen schlanken Wrapper um den MySQL-Befehl COM_CHANGE_USER.
Die Funktion ist sowohl als prozedurale Funktion als auch als objektorientierte Methode verfügbar:
// Procedural style
mysqli_change_user($mysqli, $username, $password, $database);
// Object-oriented style (used in the examples below)
$mysqli->change_user($username, $password, $database);Parameter
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
username | Ja | Der MySQL-Benutzer, als der authentifiziert werden soll. |
password | Ja | Das Passwort dieses Benutzers. |
database | Nein | Datenbank, die als Standard gesetzt wird. Übergeben Sie null, um keine Standarddatenbank zu verwenden. |
Rückgabewert
Die Funktion gibt true bei Erfolg und false bei Misserfolg zurück (z. B. falsche Anmeldedaten oder unzureichende Berechtigungen). Überprüfen Sie den Rückgabewert immer, bevor Sie weitere Abfragen ausführen.
Ein einfaches Beispiel
Sie rufen die Methode auf einem gültigen MySQLi-Objekt auf und übergeben den neuen Benutzernamen und das neue Passwort. Das Datenbankargument ist optional:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
// Switch to a new user on the existing connection
if (!$mysqli->change_user("newusername", "newpassword", null)) {
echo "Error changing user: " . $mysqli->error;
exit();
}
// Run queries with the new user's privileges from here on
// ...
$mysqli->close();
?>Wir öffnen eine Verbindung und rufen dann change_user() auf, um uns auf der gleichen Verbindung als anderen Benutzer neu zu authentifizieren. Wir prüfen den Rückgabewert, um sicherzustellen, dass der Wechsel erfolgreich war, bevor wir weitere Abfragen ausführen.
Benutzer und Datenbank gleichzeitig wechseln
Das dritte Argument ermöglicht es, die Standarddatenbank gleichzeitig mit dem Benutzer zu ändern. Dadurch entfällt ein separater select_db()-Aufruf:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
// Switch to a different user and select a new default database
if (!$mysqli->change_user("newusername", "newpassword", "newdatabase")) {
echo "Error changing user: " . $mysqli->error;
exit();
}
// Queries now run as "newusername" against "newdatabase"
// ...
$mysqli->close();
?>Wenn Sie das Datenbankargument weglassen (oder null übergeben), endet die Verbindung ohne ausgewählte Standarddatenbank — beachten Sie, dass dies nicht dasselbe ist wie das Beibehalten der vorherigen. Wenn Sie weiterhin mit derselben Datenbank arbeiten möchten, übergeben Sie deren Namen explizit.
Wann würde ich das verwenden?
mysqli_change_user() ist ein Nischenwerkzeug. Der häufigste Praxisanwendungsfall ist Connection Pooling: Eine langlebige gepoolte Verbindung wird verschiedenen Anfragen übergeben, und change_user() setzt sie für den nächsten Verbraucher in einen sauberen Zustand zurück. Es ist auch praktisch, wenn ein einzelnes Skript einen Teil der Arbeit mit erhöhten Rechten und einen anderen Teil mit einem eingeschränkten Konto durchführen muss, ohne die Kosten für das Öffnen einer zweiten Verbindung zu tragen.
Bei den meisten alltäglichen Anwendungen öffnen Sie einfach eine Verbindung als der richtige Benutzer und rufen diese Funktion nie auf.
Fallstricke, auf die Sie achten sollten
- Der Zustand wird zurückgesetzt.
change_user()setzt die Verbindung zurück, als wäre sie neu geöffnet worden: Es rollt die aktuelle Transaktion zurück, deaktiviertLOCK TABLES, gibt temporäre Tabellen frei und setzt Sitzungsvariablen zurück (außer dem Zeichensatz, der erhalten bleibt). Rufen Sie diese Funktion nicht mitten in einer Transaktion auf, die Sie benötigen. - Die Datenbank wird nicht beibehalten. Wie oben erwähnt, löscht das Weglassen des dritten Arguments die Standarddatenbank, anstatt die aktuelle beizubehalten.
- Berechtigungen folgen dem neuen Benutzer. Nach dem Wechsel wird jede Abfrage anhand der Berechtigungen des neuen Benutzers ausgewertet. Eine Abfrage, die zuvor funktioniert hat, kann jetzt mit einem Berechtigungsfehler fehlschlagen — das ist erwartetes Verhalten, kein Fehler.
- Verwechseln Sie es nicht mit dem Ändern von Benutzerdaten. Diese Funktion ändert, welches MySQL-Konto die Verbindung verwendet. Sie aktualisiert keine Zeilen in einer
users-Tabelle; dafür führen Sie eine gewöhnlicheUPDATE-Abfrage mitmysqli_query()aus.
Fazit
mysqli_change_user() authentifiziert eine offene MySQL-Verbindung als neuen Benutzer neu, wählt optional eine neue Standarddatenbank aus und gibt true/false zurück, damit Sie den Wechsel überprüfen können. Wenn Sie wissen, dass diese Funktion den Verbindungsstatus zurücksetzt und die Standarddatenbank löscht, wenn das dritte Argument weggelassen wird, können Sie sie sicher verwenden — meist für Connection Pooling oder das Wechseln von Berechtigungen auf einer gemeinsam genutzten Verbindung.
Um die MySQLi-Extension weiter zu erkunden, lesen Sie mysqli_connect() und mysqli_query().