Задать вопрос

Что не так с параметром — password = root?

Сейчас не могу в точности воспроизвести проблему, но дело было так (код примерный):

$container = new Container();

$container->set('settings', fn() => [
    'database' => [
        'dsn' => 'mysql:host=' . env('DB_HOST', 'example') . ';dbname=' . env('DB_NAME', 'example'),
        'username' => env('DB_USER', 'example'),
        'password' => env('DB_PASS', 'example')
    ]
]);

$settings = $container->get('settings');

var_dump($settings); // 'database' => ['dsn' => 'mysql:host=127.0.0.1;dbname=example', 'username' => 'root', 'password' => 'root']

$container->set(PDO::class, function() use ($settings) {
    $database = $settings['database'];

    return new PDO(
        $database['dsn'],
        $database['username'],
        $database['password'] // потом БУДЕТ ошибка в этой строке
    );
});

var_dump($container->get(PDO::class)); // ожидается object(PDO), но получаем - Connection refused, ошибка в строке, в которой прописано - $database['password']


и там ещё в трассировке было (по памяти всё пишу), что-то вроде:

new PDO('mysql:host=127.0.0.1;dbname=example', 'root', '[какой-то_неприкосновенный_параметр]'), дословно текст не помню про параметр, там не неприкосновенный, а как-то ещё написано было

Я понимаю, что конфликт с паролем - root, но никогда не сталкивался с такой проблемой и нет опыта правильного её решения. Дело в том, что использовал ранее разные линуксы, с такой ошибкой не сталкивался и на последнем, который использовал - AltLinux Рабочая станция К 10 всё работало, вчера установил AltLinux Рабочая станция К 11 BETA, развернул мускул по Этому мануалу и поймал ошибку эту.

Как исправить правильно?
  • Вопрос задан
  • 3072 просмотра
Подписаться 3 Простой 21 комментарий
Решения вопроса 1
borisdenis
@borisdenis
Ленив и вреден...
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';

У вас пользователь 'root'@'localhost', а вы пытаетесь подключиться под 'root'@'127.0.0.1', в некоторых системах это довольно большая разница.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@edsaulys
Проблема, которую вы описываете, связана с ошибкой подключения к MySQL через PDO с сообщением "Connection refused". Это указывает на то, что соединение с базой данных не удалось установить. Давайте разберёмся шаг за шагом, почему это может происходить, и как правильно исправить ситуацию, особенно с учётом того, что вы используете AltLinux Рабочая станция К 11 BETA и настраивали MySQL по мануалу.
Возможные причины проблемы

Пароль root не совпадает с реальным паролем MySQL
Вы указываете password => 'root' в настройках, но это может не соответствовать текущему паролю пользователя root в MySQL. После установки MySQL по умолчанию пароль для root может быть пустым, сгенерированным автоматически или заданным в процессе установки. Если вы следовали мануалу, возможно, там был шаг с установкой пароля, который вы пропустили или неверно интерпретировали.

MySQL не запущен или не слушает указанный хост/порт

Ошибка "Connection refused" часто возникает, когда сервер MySQL не работает или не настроен для прослушивания на 127.0.0.1 (localhost) через TCP/IP. В некоторых конфигурациях MySQL по умолчанию использует сокет вместо TCP, что может вызвать конфликт.

Конфликт с настройками окружения
Вы используете функцию env(), которая берёт значения из переменных окружения. Если переменная DB_PASS не определена или содержит неверное значение, то в коде будет подставлено значение по умолчанию (example), что также может привести к ошибке.

Проблема с версией MySQL или драйвером PDO
В AltLinux Рабочая станция К 11 BETA могла измениться версия MySQL или PHP, что иногда вызывает несовместимость или требует дополнительных настроек.

Некорректная строка DSN
В вашем примере DSN выглядит как 'mysql:host=127.0.0.1;dbname=example'. Если база данных example не существует или MySQL не настроен для доступа через TCP, это тоже вызовет ошибку.

Шаги для диагностики и исправления
1. Проверьте, работает ли MySQL
Убедитесь, что сервер MySQL запущен:
sudo systemctl status mysql

Если он не работает, запустите его:
sudo systemctl start mysql

И включите автозапуск:
sudo systemctl enable mysql

2. Проверьте доступ к MySQL через командную строку
Попробуйте подключиться к MySQL с теми же данными, которые вы используете в коде:

mysql -u root -p

После ввода команды вас попросят ввести пароль. Введите root (или оставьте пустым, если пароль не задан). Если подключение удалось, значит проблема не в пароле, а в настройках PDO или сервера. Если подключение не удалось, вы получите сообщение об ошибке, которое поможет понять причину (например, "Access denied" — неверный пароль, или "Connection refused" — сервер не доступен).
3. Проверьте настройки MySQL
Файл конфигурации MySQL обычно находится в /etc/my.cnf или /etc/mysql/my.cnf. Откройте его:

sudo nano /etc/my.cnf

Ищите секцию [mysqld] и проверьте параметры:
bind-address — должен быть 127.0.0.1 или 0.0.0.0, чтобы сервер слушал TCP-соединения.


port — по умолчанию 3306, убедитесь, что он не изменён.

Если там указано skip-networking, закомментируйте эту строку (добавьте # в начало), чтобы разрешить TCP/IP-соединения.

После изменений перезапустите MySQL:

sudo systemctl restart mysql

4. Убедитесь, что база данных существует
Ваш DSN указывает на базу example. Проверьте, существует ли она:

mysql -u root -p -e "SHOW DATABASES;"

Если базы example нет, создайте её:

mysql -u root -p -e "CREATE DATABASE example;"

5. Проверьте правильность пароля root
Если пароль root не работает, сбросьте его. Войдите в MySQL как root (если пароль пустой, просто нажмите Enter):

mysql -u root

И выполните:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
EXIT;


Теперь пароль точно будет root.
6. Исправьте код
Попробуйте упростить подключение для теста, убрав зависимость от контейнера и env():

$dsn = 'mysql:host=127.0.0.1;dbname=example';
$username = 'root';
$password = 'root';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Подключение успешно!";
} catch (PDOException $e) {
    echo "Ошибка подключения: " . $e->getMessage();
}


Сохраните это в файл, например test.php, и запустите:

php test.php

Если ошибка сохраняется, вы увидите точное сообщение, которое поможет дальше.
7. Убедитесь, что порт открыт
MySQL по умолчанию использует порт 3306. Проверьте, слушает ли он этот порт:

sudo netstat -tuln | grep 3306

Если ничего не выводится, MySQL не использует TCP. В этом случае добавьте в DSN порт явно:
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=example';


8. Проверьте переменные окружения
Если вы используете env(), убедитесь, что переменные DB_HOST, DB_NAME, DB_USER, DB_PASS заданы правильно. Например, в файле .env:

DB_HOST=127.0.0.1
DB_NAME=example
DB_USER=root
DB_PASS=root


Или задайте их в терминале перед запуском:

export DB_HOST=127.0.0.1
export DB_NAME=example
export DB_USER=root
export DB_PASS=root
php your_script.php


Почему password = root может быть проблемой?
Сам по себе параметр password = root не является "неприкосновенным" или зарезервированным. Ошибка, скорее всего, не в самом значении 'root', а в том, что:
MySQL отклоняет соединение из-за неверного пароля.

Сервер не доступен по указанному хосту/порту.

В трассировке вы могли видеть что-то вроде "immutable parameter" или "invalid parameter", но это, вероятно, связано с внутренней обработкой PDO, а не с самим паролем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы