При попытке выполнить вход phpMyAdmin или авторизоваться в MySQL вы можете столкнуться с ошибкой HY000/1045:
Warning: mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES) mysqli::real_connect(): (HY000/1045): Access denied for user 'superuser'@'localhost' (using password: NO)
Ошибка возникает, когда используемая комбинация имени пользователя, хоста и пароля не позволяет подключаться к серверу. Например, если пытаться выполнить вход под пользователем, который не существует вовсе, то возникнет именно эта ошибка.
Давайте посмотрим на следующий код, который вызывает эту ошибку:
<?php define("DB_HOST", "localhost"); define("DB_USER", "root"); define("DB_PASSWORD", ""); define("DB_DATABASE", "databasename"); $db = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
Увидели подвох? Устанавливается значение константы DB_USER, а используется для подключения DB_USERNAME, аналогично с DB_HOST и DB_SERVER. То есть в СУБД передаются неверные или пустые данные с которыми невозможно выполнить подключение.
Посмотрите на следующий код, который также вызовет ошибку:
$servername = '127.0.0.1'; $username = 'user_bob'; $password = "sdfasdf$B"; $conn = mysqli_connect($servername, $username, $password, 'any_database');
В пароле содержится специальный символ $. В принципе, в пароле можно (и даже нужно) использовать специальные символы, но некоторые из них имеют специальное значение для языков программирования или для оболочки (если подключение выполняется в командной строке). Одинарная и двойная кавычки хотя и используются одинаково для обозначения строк чтобы символы в них перестали трактоваться как другие элементы языка, но они не являются идентичными. Одинарная кавычка делает так, что любые символы теряют своё специальное значение. А в строке, помещённой в двойные кавычки, некоторые специальные символы сохраняют своё значение. То есть "sdfasdf$B" интерпретатором PHP расценивается как буквальная строка «sdfasdf» за которой следует переменная $B.
Правильно так:
$servername = '127.0.0.1'; $username = 'user_bob'; //НЕ ИСПОЛЬЗУЙТЕ ДВОЙНЫЕ КАВЫЧКИ для строк со специальными символами //$password = "sdfasdf$B"; $password = 'sdfasdf$B'; $conn = mysqli_connect($servername, $username, $password, 'any_database');
Чтобы убедиться, что проблема в пароле содержащим специальные символы, вы можете временно установить пароль на не содержащий специальных символов примерно следующей командой:
GRANT ALL PRIVILEGES ON БАЗА_ДАННЫХ.* TO 'ПОЛЬЗОВАТЕЛЬ'@'%' IDENTIFIED BY '12345';
В этом примере пароль установлен на «12345».
Создание нового пользователя при ошибке HY000/1045
Эта ошибка является вариантом рассмотренной ошибки — но разница в том, что необходимый пользователь действительно отсутствует и его нужно создать:
phpMyAdmin ERROR: mysqli_real_connect(): (HY000/1045): Access denied for user 'pma'@'localhost' (using password: NO)
В данном случае это пользователь pma, но вы можете применять описанные команды для создания любых пользователей, заменяя в командах «pma» на нужное вам имя.
В терминале войдите в MySQL как root. Возможно, вы создали пароль root при первой установке MySQL или пароль может быть пустым, и в этом случае вы можете просто нажать ENTER, когда будет предложено ввести пароль.
sudo mysql -u root -p
Теперь добавьте нового пользователя MySQL с именем пользователя по вашему выбору. В этом примере мы называем его pma. Обязательно замените ЗДЕСЬ ПАРОЛЬ своим собственным. Символ % здесь указывает MySQL разрешить этому пользователю входить в систему из любого места удалённо (а не только с локального компьютера). Если вам нужна повышенная безопасность, вы можете заменить это IP-адресом.
CREATE USER 'pma'@'%' IDENTIFIED BY 'ЗДЕСЬ ПАРОЛЬ';
Теперь мы предоставим нашему новому пользователю привилегию суперпользователя.
GRANT ALL PRIVILEGES ON *.* TO 'pma'@'%' WITH GRANT OPTION;
Теперь перейдите к файлу config.inc.php (может располагаться, например, в /etc/phpmyadmin/config.inc.php) и добавьте туда следующие строки:
/* User for advanced features */ $cfg['Servers'][$i]['controluser'] = 'pma'; $cfg['Servers'][$i]['controlpass'] = 'ЗДЕСЬ ПАРОЛЬ';
Связанные статьи:
- Как установить веб-сервер Apache с PHP 7, MariaDB/MySQL и phpMyAdmin (LAMP) на Ubuntu (63.3%)
- Как включить доступ root к MySQL и MariaDB с любых хостов (63.3%)
- Как установить веб-сервер (Apache, PHP, MySQL, phpMyAdmin) на Linux Mint, Ubuntu и Debian (60.9%)
- Ошибка «ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2 "No such file or directory")» (РЕШЕНО) (59.7%)
- Ошибка «Failed - Network error» во время экспорта в phpMyAdmin (РЕШЕНО) (59.7%)
- Почему не запускается скрипт, ошибка «bash: ./....sh: Отказано в доступе» (РЕШЕНО) (RANDOM - 1.2%)
можно исользовать двойные кавычки, экранируя спецсимволы обратным слешом