Способы соединения PHP приложений с MySQL сервером

Раздел: Базы данных PHP -> Подключение к базе данных

Введение

Взаимодействие PHP скриптов с базами данных MySQL требует установки соединения между ними. Выбор метода зависит от версии PHP, требований к безопасности и необходимости поддержки других СУБД. Рассмотрим два основных подхода: расширение PDO и расширение mysqli. Первое рекомендуется для новых проектов благодаря универсальности и объектно-ориентированному интерфейсу.

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

Решение: использование PDO (PHP Data Objects) – универсального интерфейса для доступа к базам данных. Подключение осуществляется через DSN строку, содержащую информацию о хосте, имени базы, кодировке.

<?php
$host = 'localhost';
$dbname = 'test';
$user = 'root';
$pass = '';
$dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";
try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Соединение установлено';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>

Php подключение к бд mysql (подключение к базе данных mysql в php)

Пояснение: DSN строится по схеме mysql:host=...;dbname=...;charset=.... После создания объекта PDO можно настроить режим обработки ошибок – в примере включено исключение при любой ошибке. Если подключение не удаётся, блок catch перехватывает исключение и выводит сообщение.

Типичные проблемы и их решения

  • Ошибка Access denied for user – неверное имя пользователя или пароль. Решение: проверить учётные данные.
  • Ошибка Unknown database – указана несуществующая база. Решение: создать базу или исправить имя.
  • Ошибка Connection refused – сервер MySQL не запущен или порт занят. Решение: убедиться, что сервер работает, и указать корректный порт.
  • Ошибка кодировки – некорректный charset. Решение: использовать utf8mb4 для полной поддержки Unicode.

Цель использования PDO – написание переносимого кода, который может работать с разными СУБД (MySQL, PostgreSQL, SQLite) без изменения логики.

Альтернативные способы подключения

Как подключиться к MySQL через mysqli в объектном стиле?

Расширение mysqli (MySQL Improved) предлагает объектно-ориентированный и процедурный интерфейсы. ООП-версия удобна для современного PHP.

<?php
$mysqli = new mysqli('localhost', 'root', '', 'test');
if ($mysqli->connect_error) {
    die('Ошибка: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
echo 'Соединение установлено';
$mysqli->close();
?>

Пояснение: конструктор класса mysqli принимает хост, пользователя, пароль и имя базы. После создания проверяется свойство connect_error – если оно не пустое, значит произошла ошибка. Метод set_charset задаёт кодировку соединения.

Типичные ошибки те же, что и для PDO. Дополнительно: Warning: mysqli::mysqli(): (HY000/2002): No such file or directory – указывает на проблему с сокетом. Решение: явно задать порт или путь к сокету.

Вариант подходит для проектов, использующих исключительно MySQL и нуждающихся в специфических функциях, которых нет в PDO (например, множественные запросы).

Как использовать процедурную функцию mysqli_connect?

Процедурный стиль mysqli может быть удобен для коротких скриптов или при миграции с устаревшего расширения mysql.

<?php
$link = mysqli_connect('localhost', 'root', '', 'test');
if (!$link) {
    die('Ошибка: ' . mysqli_connect_error());
}
mysqli_set_charset($link, 'utf8mb4');
echo 'Соединение установлено';
mysqli_close($link);
?>

Функция mysqli_connect возвращает ресурс соединения или false при ошибке. Для получения текста ошибки используется mysqli_connect_error(). Кодировка устанавливается функцией mysqli_set_charset.

Распространённая проблема: mysqli_connect() expects parameter 1 to be string, ... – неверный порядок аргументов. Решение: проверить сигнатуру функции: хост, пользователь, пароль, база, порт, сокет.

Этот метод чаще всего выбирают для быстрого прототипирования или поддержки legacy-кода.

Заключение

Для новых проектов рекомендуется PDO из-за гибкости и безопасности. Если требуется глубокая интеграция с MySQL, выбирают mysqli (ООП или процедурный). Каждый подход имеет свои цели и случаи использования, описанные выше.

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

Ниже приведены подробные примеры с комментариями и выводом результатов.

Пример 1: PDO с указанием порта и кодировки

Пример
<?php
$dsn = 'mysql:host=127.0.0.1;port=3307;dbname=test;charset=utf8mb4';
$user = 'root';
$pass = '';
try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'OK';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>

Пояснение: DSN содержит порт 3307, отличный от стандартного. Если сервер слушает на другом порту, соединение будет установлено. При успехе выводится строка "OK".

OK

Пример 2: PDO с постоянным соединением (persistent)

Пример
<?php
$options = [
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '', $options);
echo 'Постоянное соединение установлено';
?>

Постоянные соединения повторно используются разными запросами, что повышает производительность в высоконагруженных системах. Результат – подтверждение.

Постоянное соединение установлено

Пример 3: mysqli ООП с конфигурационным массивом

Пример
<?php
$config = [
    'host' => 'localhost',
    'user' => 'root',
    'pass' => '',
    'db'   => 'test',
    'charset' => 'utf8mb4'
];
$mysqli = new mysqli($config['host'], $config['user'], $config['pass'], $config['db']);
if ($mysqli->connect_error) {
    throw new Exception($mysqli->connect_error);
}
$mysqli->set_charset($config['charset']);
echo 'Соединение установлено с использованием конфигурации';
?>

Использование ассоциативного массива упрощает управление параметрами и их замену.

Соединение установлено с использованием конфигурации

Пример 4: mysqli процедурный с выбором базы данных после подключения

Пример
<?php
$link = mysqli_connect('localhost', 'root', '');
if (!$link) {
    die('Ошибка подключения: ' . mysqli_connect_error());
}
if (!mysqli_select_db($link, 'test')) {
    echo 'Ошибка выбора БД: ' . mysqli_error($link);
} else {
    echo 'База выбрана успешно';
}
mysqli_close($link);
?>

Этот подход позволяет подключаться к серверу без указания базы и выбирать её позже.

База выбрана успешно

Пример 5: PDO с использованием внешнего файла конфигурации

config.php (возвращает массив):

Пример
<?php
return [
    'dsn' => 'mysql:host=localhost;dbname=test;charset=utf8mb4',
    'user' => 'root',
    'pass' => ''
];
?>

connect.php:

Пример
<?php
$config = require 'config.php';
try {
    $pdo = new PDO($config['dsn'], $config['user'], $config['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Подключение из конфигурационного файла выполнено';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>

Разделение конфигурации и логики улучшает поддерживаемость кода.

Подключение из конфигурационного файла выполнено

Пример 6: PDO с таймаутом подключения к удалённому серверу

Пример
<?php
$options = [
    PDO::ATTR_TIMEOUT => 5,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
try {
    $pdo = new PDO('mysql:host=192.168.1.100;dbname=test', 'user', 'pass', $options);
    echo 'Удалённое соединение установлено';
} catch (PDOException $e) {
    echo 'Не удалось подключиться: ' . $e->getMessage();
}
?>

Атрибут ATTR_TIMEOUT задаёт максимальное время ожидания (в секундах) при попытке соединения.

Удалённое соединение установлено (или сообщение об ошибке, если сервер недоступен)

Подключение к базе данных MySQL в PHP - comments

En
Php подключение к бд mysql (php)