change_user
Découvrez la fonction mysqli_change_user() en PHP pour changer l'utilisateur d'une connexion MySQL ouverte, avec paramètres et exemples.
La fonction mysqli_change_user() modifie l'utilisateur — et éventuellement la base de données par défaut — d'une connexion MySQL déjà ouverte, sans la fermer ni en créer une nouvelle. Cette page explique ce que fait la fonction, ses paramètres et sa valeur de retour, quand elle s'avère vraiment utile, et les pièges qui surprennent les développeurs lors d'une première utilisation.
Ce que fait mysqli_change_user()
mysqli_change_user() ré-authentifie la connexion existante en tant qu'un autre utilisateur MySQL. La connexion TCP/socket reste ouverte ; seule l'identité (et donc les privilèges) qui lui est associée change. Il s'agit d'un wrapper fin autour de la commande MySQL COM_CHANGE_USER.
Elle est disponible à la fois comme fonction procédurale et comme méthode orientée objet :
// Procedural style
mysqli_change_user($mysqli, $username, $password, $database);
// Object-oriented style (used in the examples below)
$mysqli->change_user($username, $password, $database);Paramètres
| Paramètre | Requis | Description |
|---|---|---|
username | Oui | L'utilisateur MySQL avec lequel s'authentifier. |
password | Oui | Le mot de passe de cet utilisateur. |
database | Non | Base de données à définir par défaut. Passez null pour n'en sélectionner aucune. |
Valeur de retour
La fonction retourne true en cas de succès et false en cas d'échec (par exemple, identifiants incorrects ou privilèges insuffisants). Vérifiez toujours la valeur de retour avant d'exécuter d'autres requêtes.
Un exemple de base
Vous appelez la méthode sur un objet MySQLi valide en lui passant le nouveau nom d'utilisateur et le nouveau mot de passe. L'argument de base de données est optionnel :
<?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();
?>On ouvre une connexion, puis on appelle change_user() pour se ré-authentifier en tant qu'un autre utilisateur sur la même connexion. On vérifie la valeur de retour pour confirmer que le changement a bien eu lieu avant d'exécuter d'autres requêtes.
Changer l'utilisateur et la base de données simultanément
Le troisième argument permet de modifier la base de données par défaut en même temps que l'utilisateur. Cela évite un appel séparé à select_db() :
<?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();
?>Si vous omettez l'argument de base de données (ou passez null), la connexion se retrouve sans aucune base de données par défaut sélectionnée — notez que ce n'est pas la même chose que conserver la précédente. Si vous avez besoin de continuer à travailler avec la même base de données, passez son nom explicitement.
Dans quel cas utiliser cette fonction ?
mysqli_change_user() est un outil de niche. L'usage réel le plus courant est le pooling de connexions : une connexion longue durée mise en pool est distribuée à différentes requêtes, et change_user() la remet dans un état propre pour le prochain consommateur. Elle est également utile lorsqu'un seul script doit effectuer certaines opérations avec des privilèges élevés et d'autres avec un compte restreint, sans payer le coût de l'ouverture d'une deuxième connexion.
Pour la plupart des applications courantes, il suffit d'ouvrir une connexion avec le bon utilisateur et de ne jamais appeler cette fonction.
Pièges à surveiller
- L'état est réinitialisé.
change_user()remet la connexion dans l'état d'une connexion fraîchement ouverte : elle annule la transaction en cours, désactiveLOCK TABLES, libère les tables temporaires et réinitialise les variables de session (sauf le jeu de caractères, qui est préservé). N'appelez pas cette fonction au milieu d'une transaction importante. - La base de données n'est pas conservée. Comme indiqué ci-dessus, omettre le troisième argument efface la base de données par défaut plutôt que de conserver celle en cours.
- Les privilèges suivent le nouvel utilisateur. Après le changement, chaque requête est évaluée selon les droits du nouvel utilisateur. Une requête qui fonctionnait auparavant peut maintenant échouer avec une erreur de permissions — c'est un comportement attendu, pas un bug.
- Ne pas confondre avec la modification des données d'un utilisateur. Cette fonction modifie quel compte MySQL utilise la connexion. Elle ne met pas à jour des lignes dans une table
users; pour cela, exécutez une requêteUPDATEordinaire avecmysqli_query().
Conclusion
mysqli_change_user() ré-authentifie une connexion MySQL ouverte en tant qu'un nouvel utilisateur, en sélectionnant éventuellement une nouvelle base de données par défaut, et retourne true/false pour vous permettre de vérifier le changement. Savoir qu'elle réinitialise l'état de la connexion et efface la base de données par défaut lorsque le troisième argument est omis vous permet de l'utiliser en toute sécurité — le plus souvent pour le pooling de connexions ou la commutation de privilèges sur une connexion partagée.
Pour continuer à explorer l'extension MySQLi, consultez mysqli_connect() et mysqli_query().