Как исправить ошибку 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';.