change_user
Функция mysqli_change_user() в PHP: смена пользователя и базы данных в открытом соединении MySQL.
Функция mysqli_change_user() меняет пользователя — и, опционально, базу данных по умолчанию — уже открытого соединения MySQL, не разрывая и не переустанавливая его. На этой странице объясняется, что делает функция, её параметры и возвращаемое значение, когда она действительно полезна, а также подводные камни, с которыми сталкиваются при первом использовании.
Что делает mysqli_change_user()
mysqli_change_user() повторно аутентифицирует существующее соединение от имени другого пользователя MySQL. TCP/сокет-соединение остаётся открытым; меняется только идентификатор (а значит, и привилегии), привязанный к нему. Это тонкая обёртка над командой MySQL COM_CHANGE_USER.
Функция доступна как в процедурном стиле, так и в объектно-ориентированном:
// Procedural style
mysqli_change_user($mysqli, $username, $password, $database);
// Object-oriented style (used in the examples below)
$mysqli->change_user($username, $password, $database);Параметры
| Параметр | Обязателен | Описание |
|---|---|---|
username | Да | Пользователь MySQL, от имени которого выполняется аутентификация. |
password | Да | Пароль этого пользователя. |
database | Нет | База данных, устанавливаемая по умолчанию. Передайте null, чтобы не задавать базу данных по умолчанию. |
Возвращаемое значение
Функция возвращает true при успехе и false при ошибке (например, неверные учётные данные или недостаточно привилегий). Всегда проверяйте возвращаемое значение перед выполнением дальнейших запросов.
Простой пример
Метод вызывается на допустимом объекте MySQLi с передачей нового имени пользователя и пароля. Аргумент базы данных необязателен:
<?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();
?>Мы открываем соединение, затем вызываем change_user(), чтобы повторно аутентифицироваться от имени другого пользователя на том же соединении. Мы проверяем возвращаемое значение, чтобы убедиться в успешности переключения, прежде чем выполнять дальнейшие запросы.
Одновременная смена пользователя и базы данных
Третий аргумент позволяет изменить базу данных по умолчанию одновременно со сменой пользователя. Это избавляет от отдельного вызова 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();
?>Если опустить аргумент базы данных (или передать null), соединение окажется без выбранной базы данных по умолчанию — обратите внимание, что это не то же самое, что сохранить предыдущую. Если нужно продолжить работу с той же базой данных, укажите её имя явно.
Когда это используется?
mysqli_change_user() — нишевый инструмент. Наиболее распространённый практический сценарий — пул соединений: долгоживущее соединение из пула передаётся разным запросам, а change_user() сбрасывает его в чистое состояние для следующего потребителя. Также функция удобна, когда один скрипт должен выполнить часть работы с расширенными привилегиями, а другую — с ограниченной учётной записью, не тратя ресурсы на открытие второго соединения.
В большинстве обычных приложений вы просто открываете соединение от имени нужного пользователя и никогда не вызываете эту функцию.
Подводные камни
- Состояние сбрасывается.
change_user()сбрасывает соединение, как будто оно только что было открыто: откатывает текущую транзакцию, деактивируетLOCK TABLES, освобождает временные таблицы и сбрасывает сессионные переменные (кроме набора символов, который сохраняется). Не вызывайте функцию в середине транзакции, которую вам важно сохранить. - База данных не сохраняется. Как отмечено выше, если не передать третий аргумент, база данных по умолчанию очищается, а не сохраняется.
- Привилегии следуют за новым пользователем. После переключения каждый запрос проверяется по правам нового пользователя. Запрос, который работал раньше, теперь может завершиться ошибкой доступа — это ожидаемое поведение, а не ошибка.
- Не путайте со сменой данных пользователя. Эта функция меняет какую учётную запись MySQL использует соединение. Она не обновляет строки в таблице
users; для этого выполните обычный запросUPDATEс помощьюmysqli_query().
Заключение
mysqli_change_user() повторно аутентифицирует открытое соединение MySQL от имени нового пользователя, опционально выбирая новую базу данных по умолчанию, и возвращает true/false, чтобы вы могли проверить результат переключения. Зная, что функция сбрасывает состояние соединения и очищает базу данных по умолчанию при отсутствии третьего аргумента, вы сможете использовать её безопасно — чаще всего для пула соединений или переключения привилегий на общем соединении.
Чтобы продолжить изучение расширения MySQLi, смотрите mysqli_connect() и mysqli_query().