change_user
Guida alla funzione mysqli_change_user() in PHP per cambiare utente e/o password su una connessione MySQL già aperta.
La funzione mysqli_change_user() cambia l'utente — e facoltativamente il database predefinito — di una connessione MySQL già aperta, senza chiuderla e riaprirla. Questa pagina spiega cosa fa la funzione, i suoi parametri e il valore restituito, quando è davvero utile e le insidie che sorprendono chi la usa per la prima volta.
Cosa fa mysqli_change_user()
mysqli_change_user() ri-autentica la connessione esistente come un utente MySQL diverso. La connessione TCP/socket rimane aperta; cambia solo l'identità (e quindi i privilegi) ad essa associata. È un sottile wrapper attorno al comando COM_CHANGE_USER di MySQL.
È disponibile sia come funzione procedurale che come metodo orientato agli oggetti:
// Procedural style
mysqli_change_user($mysqli, $username, $password, $database);
// Object-oriented style (used in the examples below)
$mysqli->change_user($username, $password, $database);Parametri
| Parametro | Obbligatorio | Descrizione |
|---|---|---|
username | Sì | L'utente MySQL con cui autenticarsi. |
password | Sì | La password di quell'utente. |
database | No | Database da impostare come predefinito. Passa null per non selezionarne nessuno. |
Valore restituito
Restituisce true in caso di successo e false in caso di errore (ad esempio, credenziali errate o privilegi insufficienti). Controlla sempre il valore restituito prima di eseguire ulteriori query.
Un esempio di base
Si chiama il metodo su un oggetto MySQLi valido passando il nuovo nome utente e la nuova password. L'argomento del database è facoltativo:
<?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();
?>Apriamo una connessione, poi chiamiamo change_user() per ri-autenticarci come utente diverso sulla stessa connessione. Controlliamo il valore restituito per confermare che il cambio sia riuscito prima di eseguire ulteriori query.
Cambiare utente e database insieme
Il terzo argomento permette di cambiare il database predefinito contemporaneamente all'utente. Questo evita una chiamata separata 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();
?>Se si omette l'argomento del database (o si passa null), la connessione si ritrova senza database predefinito selezionato — si noti che questo non equivale a mantenere il precedente. Se si ha bisogno di continuare a lavorare con lo stesso database, passarne il nome esplicitamente.
Quando si usa questa funzione?
mysqli_change_user() è uno strumento di nicchia. L'uso più comune nel mondo reale è il connection pooling: una connessione pooled di lunga durata viene assegnata a richieste diverse, e change_user() la reimposta a uno stato pulito per il consumatore successivo. È utile anche quando uno script deve eseguire alcune operazioni con privilegi elevati e altre con un account ristretto, senza dover aprire una seconda connessione.
Per la maggior parte delle applicazioni comuni si apre semplicemente una connessione con l'utente corretto e questa funzione non viene mai chiamata.
Insidie da tenere d'occhio
- Lo stato viene reimpostato.
change_user()reimposta la connessione come se fosse appena aperta: annulla la transazione corrente, disattivaLOCK TABLES, rilascia le tabelle temporanee e azzera le variabili di sessione (eccetto il set di caratteri, che viene preservato). Non chiamarla nel mezzo di una transazione importante. - Il database non viene preservato. Come indicato sopra, omettere il terzo argomento cancella il database predefinito invece di mantenere quello corrente.
- I privilegi seguono il nuovo utente. Dopo il cambio, ogni query viene valutata in base ai grant del nuovo utente. Una query che funzionava prima potrebbe ora fallire con un errore di permessi — questo è il comportamento atteso, non un bug.
- Non confonderla con la modifica dei dati utente. Questa funzione cambia quale account MySQL usa la connessione. Non aggiorna righe in una tabella
users; per quello si esegue una normale queryUPDATEconmysqli_query().
Conclusione
mysqli_change_user() ri-autentica una connessione MySQL aperta come nuovo utente, selezionando facoltativamente un nuovo database predefinito, e restituisce true/false per verificare il cambio. Sapere che reimposta lo stato della connessione e cancella il database predefinito quando il terzo argomento viene omesso permette di usarla in modo sicuro — più spesso per il connection pooling o il cambio di privilegi su una connessione condivisa.
Per continuare ad esplorare l'estensione MySQLi, vedi mysqli_connect() e mysqli_query().