W3docs

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().

Практика

Практика
Что делает mysqli_change_user() с существующим соединением MySQL?
Что делает mysqli_change_user() с существующим соединением MySQL?
Was this page helpful?