W3docs

change_user

Aprende a usar mysqli_change_user() en PHP para cambiar el usuario de una conexión MySQL abierta sin cerrarla ni reconectar.

La función mysqli_change_user() cambia el usuario —y opcionalmente la base de datos predeterminada— de una conexión MySQL ya abierta, sin cerrarla ni reconectar. Esta página explica qué hace la función, sus parámetros y valor de retorno, cuándo resulta genuinamente útil y los errores comunes que sorprenden a quienes la usan por primera vez.

Qué hace mysqli_change_user()

mysqli_change_user() vuelve a autenticar la conexión existente como un usuario de MySQL diferente. La conexión TCP/socket permanece abierta; solo cambia la identidad (y, por lo tanto, los privilegios) asociada a ella. Es un envoltorio delgado alrededor del comando COM_CHANGE_USER de MySQL.

Está disponible tanto como función de estilo procedural como método orientado a objetos:

// Procedural style
mysqli_change_user($mysqli, $username, $password, $database);

// Object-oriented style (used in the examples below)
$mysqli->change_user($username, $password, $database);

Parámetros

ParámetroRequeridoDescripción
usernameEl usuario de MySQL con el que autenticarse.
passwordLa contraseña de ese usuario.
databaseNoBase de datos a establecer como predeterminada. Pasa null para no seleccionar ninguna.

Valor de retorno

Devuelve true si tiene éxito y false si falla (por ejemplo, credenciales incorrectas o privilegios insuficientes). Comprueba siempre el valor de retorno antes de ejecutar más consultas.

Un ejemplo básico

Se llama al método sobre un objeto MySQLi válido y se pasan el nuevo nombre de usuario y la contraseña. El argumento de base de datos es opcional:

<?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();
?>

Abrimos una conexión y luego llamamos a change_user() para reautenticarnos como un usuario diferente en la misma conexión. Verificamos el valor de retorno para confirmar que el cambio fue exitoso antes de ejecutar más consultas.

Cambiar el usuario y la base de datos al mismo tiempo

El tercer argumento permite cambiar la base de datos predeterminada al mismo tiempo que el usuario. Esto evita una llamada separada a 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 omites el argumento de base de datos (o pasas null), la conexión queda sin base de datos predeterminada seleccionada — ten en cuenta que esto no es lo mismo que mantener la anterior. Si necesitas seguir trabajando con la misma base de datos, pasa su nombre explícitamente.

¿Cuándo usaría esto?

mysqli_change_user() es una herramienta de nicho. El uso más común en el mundo real es la agrupación de conexiones (connection pooling): una conexión de larga duración en el pool se entrega a diferentes solicitudes, y change_user() la restablece a un estado limpio para el siguiente consumidor. También resulta útil cuando un único script debe realizar algunas tareas con privilegios elevados y otras con una cuenta restringida, sin incurrir en el coste de abrir una segunda conexión.

Para la mayoría de las aplicaciones cotidianas simplemente abres una conexión con el usuario correcto y nunca llamas a esta función.

Errores comunes a tener en cuenta

  • El estado se restablece. change_user() restablece la conexión como si acabara de abrirse: revierte la transacción actual, desactiva LOCK TABLES, libera las tablas temporales y restablece las variables de sesión (excepto el juego de caracteres, que se conserva). No la llames en medio de una transacción que te importe.
  • La base de datos no se conserva. Como se indica arriba, omitir el tercer argumento borra la base de datos predeterminada en lugar de mantener la actual.
  • Los privilegios siguen al nuevo usuario. Tras el cambio, cada consulta se evalúa con los permisos del nuevo usuario. Una consulta que funcionaba antes puede fallar ahora con un error de permisos — ese es el comportamiento esperado, no un error.
  • No lo confundas con cambiar los datos de un usuario. Esta función cambia qué cuenta de MySQL usa la conexión. No actualiza filas en una tabla users; para eso ejecutas una consulta UPDATE ordinaria con mysqli_query().

Conclusión

mysqli_change_user() vuelve a autenticar una conexión MySQL abierta como un nuevo usuario, seleccionando opcionalmente una nueva base de datos predeterminada, y devuelve true/false para que puedas verificar el cambio. Saber que restablece el estado de la conexión y borra la base de datos predeterminada cuando se omite el tercer argumento te permite usarla de forma segura — habitualmente para agrupación de conexiones o cambio de privilegios en una conexión compartida.

Para seguir explorando la extensión MySQLi, consulta mysqli_connect() y mysqli_query().

Práctica

Práctica
¿Qué hace mysqli_change_user() en una conexión MySQL existente?
¿Qué hace mysqli_change_user() en una conexión MySQL existente?
Was this page helpful?