zaLinux.ru

Ошибка «mysqli_connect(): (HY000/1045): Access denied for user ‘username’@’localhost’» (РЕШЕНО)


При попытке выполнить вход 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'] = 'ЗДЕСЬ ПАРОЛЬ';

Рекомендуемые статьи:

1 Комментарий

  1. айнур

    можно исользовать двойные кавычки, экранируя спецсимволы обратным слешом

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *