Как исправить ошибку php mysql connect error: практические советы

Раздел: Администрирование -> Отладка и ошибки

Ошибка подключения к MySQL: причины и решения

Проблема: при попытке соединиться с базой данных MySQL из PHP возникает ошибка (например, "Connection refused", "Access denied", "Unknown database").

Как проверить и исправить параметры подключения в PHP?

Наиболее эффективный способ - использовать исключения и полную проверку всех параметров через mysqli или PDO.


// Файл: db_connect.php
$host = '127.0.0.1';
$user = 'root';
$pass = 'secret';
$dbname = 'test';

$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_error) {
    die('Ошибка подключения (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Успешное подключение к MySQL.';
  

Error php file src (обработка ошибок php файла)

Ошибка подключения (2002) Connection refused
  

Php fatal error function home (фатальная ошибка функции в php)

Цель: получить точное сообщение об ошибке для дальнейшей диагностики. Случай использования: начальная настройка подключения.

Типичная ошибка: mysqli_connect(): (HY000/1045): Access denied for user - неверный пароль или пользователь. Решение: сбросить пароль через MySQL командой ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';.

Как проверить работу сервера MySQL?

Если PHP не может подключиться, стоит убедиться, что MySQL запущен и слушает нужный порт.


# Проверка статуса (Linux)
systemctl status mysql
# или
service mysql status

# Проверка порта (по умолчанию 3306)
netstat -tlnp | grep 3306
  

Index php не работает (проблемы с index.php)

● mysql.service - MySQL Community Server
   Active: active (running)
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1234/mysqld
  

Php mysql connect error (ошибка подключения к mysql)

Цель: убедиться, что СУБД функционирует. Случай использования: после обновления или перезагрузки сервера.

Как изменить хост и порт подключения?

Часто ошибка возникает из-за того, что MySQL слушает только localhost, а PHP подключается к 127.0.0.1 (или наоборот) либо используется нестандартный порт.


// Пример с указанием порта
$mysqli = new mysqli('127.0.0.1', 'root', 'pass', 'db', 3307);
  

почему не работает php (почему не работает php)

Ошибка: Connection refused - порт не открыт или MySQL настроен на localhost через сокет. Решение: в PHP использовать ini_get('mysqli.default_socket') или задать сокет явно: $mysqli = new mysqli('localhost', ...); (использует сокет по умолчанию).

Как использовать PDO для подключения с обработкой исключений?

PDO предоставляет более гибкий механизм и единый интерфейс для разных СУБД.


try {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Подключение через PDO успешно.';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
  
Ошибка: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)
  

Цель: предотвратить остановку скрипта при ошибке и получить детали. Случай использования: продакшн-среда, где нужно логировать ошибки.

Как проверить расширение PHP для MySQL?

Отсутствие установленного расширения mysqli или pdo_mysql приводит к ошибке Call to undefined function.


php -m | grep -i mysql
  
mysqli
pdo_mysql
  

Решение: установить расширение через менеджер пакетов (например, apt install php-mysql) или включить в php.ini строку extension=mysqli.

Как настроить права пользователя MySQL?

Ошибка Access denied часто решается предоставлением привилегий с правильного хоста.


CREATE USER 'app'@'%' IDENTIFIED BY 'strong_pass';
GRANT ALL PRIVILEGES ON mydb.* TO 'app'@'%';
FLUSH PRIVILEGES;
  
Query OK, 0 rows affected
  

Цель: разрешить подключение с любого хоста (знак %) или с конкретного IP. Случай использования: веб-сервер и БД на разных машинах.

Как использовать Unix-сокет для подключения?

Если PHP и MySQL на одном сервере, через сокет может быть быстрее.


$mysqli = new mysqli('localhost', 'root', 'pass', 'db', null, '/var/run/mysqld/mysqld.sock');
  

Ошибка: No such file or directory - путь к сокету неверный. Решение: найти правильный путь командой mysql_config --socket.

Расширенные примеры для диагностики и решения

Пример 1: Подключение с разными хостами и портами (таблица)

Пример

// Тестирование разных комбинаций
$hosts = ['localhost', '127.0.0.1', '::1'];
$ports = [3306, 3307, null];
foreach ($hosts as $host) {
    foreach ($ports as $port) {
        $mysqli = @new mysqli($host, 'root', 'password', 'test', $port);
        if ($mysqli->connect_error) {
            echo "$host:$port - " . $mysqli->connect_error . "\n";
        } else {
            echo "$host:$port - Успешно\n";
            $mysqli->close();
        }
    }
}
localhost:3306 - Успешно
localhost:3307 - Connection refused
127.0.0.1:3306 - Успешно
...

Пояснение: показывает, какие комбинации работают. Часто localhost через сокет, 127.0.0.1 через TCP.

Пример 2: Использование PDO с SSL

Пример

$options = [
    PDO::MYSQL_ATTR_SSL_KEY    => '/etc/ssl/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT   => '/etc/ssl/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA     => '/etc/ssl/ca-cert.pem',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
];
try {
    $pdo = new PDO(
        'mysql:host=db.example.com;port=3306;dbname=mydb',
        'user', 'pass',
        $options
    );
    echo 'SSL-подключение установлено.';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
Ошибка: SQLSTATE[HY000] [2002] Connection timed out

Пояснение: SSL требует корректных сертификатов. При ошибке таймаута проверяют сетевую доступность и имя хоста.

Пример 3: Подключение через mysql_connect (устаревший) с подавлением ошибок

Пример

// Не рекомендуется, но может встретиться в старом коде
$link = @mysql_connect('localhost', 'root', 'pass');
if (!$link) {
    echo 'Ошибка: ' . mysql_error();
} else {
    echo 'Подключено.';
    mysql_close($link);
}
Ошибка: Access denied for user 'root'@'localhost' (using password: YES)

Пояснение: расширение mysql удалено в PHP 7, лучше перейти на mysqli или PDO.

Пример 4: Поиск конфигурации MySQL через PHP

Пример

// Вывод параметров подключения
$default_socket = ini_get('mysqli.default_socket');
$default_host = ini_get('mysqli.default_host');
$default_port = ini_get('mysqli.default_port');
echo "Сокет: $default_socket\n";
echo "Хост: $default_host\n";
echo "Порт: $default_port\n";
Сокет: /var/run/mysqld/mysqld.sock
Хост: localhost
Порт: 3306

Пояснение: эти значения используются по умолчанию в mysqli_connect() без параметров.

Пример 5: Проверка прав пользователя MySQL через командную строку

Пример

# Вход от root
mysql -u root -p
# Просмотр пользователей
SELECT User, Host, Password_expired FROM mysql.user WHERE User='app';
# Дать права
GRANT ALL PRIVILEGES ON test.* TO 'app'@'%' IDENTIFIED BY 'pass';
FLUSH PRIVILEGES;
+------+------+------------------+
| User | Host | Password_expired |
+------+------+------------------+
| app  | %    | N                |
+------+------+------------------+

Пояснение: если пароль истек (Y), нужно сбросить ALTER USER 'app'@'%' IDENTIFIED BY 'newpass';.

Ошибка подключения к MySQL - comments

En
Php mysql connect error (php)