Способы соединения с MySQL через расширение mysqli в PHP
Подключение к MySQL через mysqli
Как выполнить надежное подключение к MySQL с помощью расширения mysqli в объектно-ориентированном стиле?
Наиболее эффективным и современным способом является использование класса mysqli в объектно-ориентированном стиле. Этот подход обеспечивает лучшую читаемость, поддержку исключений и удобство работы с методами. Пример базового подключения:
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'test';
$mysqli = new mysqli($host, $user, $password, $database);
if ($mysqli->connect_error) {
die('Ошибка подключения: ' . $mysqli->connect_error);
}
echo 'Подключение успешно';
Phpmyadmin php (phpmyadmin в php)
Возможные проблемы:
- Ошибка Connection refused – неверный хост или порт.
- Ошибка Access denied – неправильные логин или пароль.
- Ошибка Unknown database – указанная база данных не существует.
Решение: проверить параметры подключения, права доступа пользователя и существование базы данных. Для детальной диагностики используйте mysqli_connect_errno() и mysqli_connect_error().
Как подключиться к MySQL в процедурном стиле mysqli?
Процедурный стиль использует функции, такие как mysqli_connect(). Он подходит для скриптов, где предпочтительна функциональная парадигма или при миграции со старого кода.
$link = mysqli_connect('localhost', 'root', '', 'test');
if (!$link) {
die('Ошибка: ' . mysqli_connect_error());
}
echo 'Подключение установлено';
Php having (оператор having в sql (php))
Ошибка: функция mysqli_connect() возвращает false при неудаче, но не бросает исключение. Приходится вручную проверять результат.
Решение: всегда проверять возвращаемое значение и использовать mysqli_connect_error() для вывода ошибки.
Как использовать PDO как альтернативу mysqli для подключения к MySQL?
PDO (PHP Data Objects) – универсальный интерфейс для работы с разными базами данных. Хотя статья посвящена mysqli, PDO часто рассматривают как более гибкую альтернативу. Пример:
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'Подключение через PDO успешно';
} catch (PDOException $e) {
echo 'Ошибка: ' . $e->getMessage();
}
Проблема: PDO требует установки драйвера pdo_mysql. Если расширение отсутствует, возникает исключение.
Решение: проверить наличие расширения в php.ini и установить его.
Расширенные примеры подключения с пояснениями
Подключение с указанием порта и сокета
Иногда MySQL работает на нестандартном порту или через Unix-сокет. В mysqli можно передать дополнительные параметры:
$mysqli = new mysqli('127.0.0.1', 'root', '', 'test', 3307, '/tmp/mysql.sock');
if ($mysqli->connect_error) {
die('Ошибка: ' . $mysqli->connect_error);
}
echo 'Подключение через порт 3307 и сокет';
Подключение через порт 3307 и сокет
Обработка исключений в объектно-ориентированном стиле
Включение режима исключений позволяет централизованно отлавливать ошибки:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$mysqli = new mysqli('localhost', 'root', '', 'test');
echo 'Подключение без ручной проверки ошибок';
} catch (mysqli_sql_exception $e) {
echo 'Исключение: ' . $e->getMessage();
}
Подключение без ручной проверки ошибок
Установка кодировки после подключения
Для корректной работы с кириллицей необходимо задать кодировку:
$mysqli = new mysqli('localhost', 'root', '', 'test');
if (!$mysqli->set_charset('utf8mb4')) {
printf('Ошибка установки кодировки: %s\n', $mysqli->error);
} else {
echo 'Кодировка utf8mb4 установлена';
}
Кодировка utf8mb4 установлена
Подключение к удаленному серверу с SSL
Для безопасного соединения с удаленным сервером можно указать SSL-ключи:
$mysqli = new mysqli();
$mysqli->ssl_set('/path/to/client-key.pem', '/path/to/client-cert.pem', '/path/to/ca-cert.pem', NULL, NULL);
$mysqli->real_connect('remote-host.example.com', 'user', 'pass', 'db', 3306, NULL, MYSQLI_CLIENT_SSL);
if ($mysqli->connect_error) {
die('SSL ошибка: ' . $mysqli->connect_error);
}
echo 'Подключение по SSL успешно';
Проверка успешности с помощью метода connect_errno
Метод connect_errno возвращает код ошибки (0 – успех):
$mysqli = @new mysqli('localhost', 'root', 'wrong_password', 'test');
if ($mysqli->connect_errno) {
echo 'Код ошибки: ' . $mysqli->connect_errno . ' - ' . $mysqli->connect_error;
} else {
echo 'Подключение успешно';
}
Код ошибки: 1045 - Access denied for user 'root'@'localhost' (using password: YES)