PHP и MySQL: настройка соединения и выбор драйвера

Раздел: Администрирование серверов -> Настройка окружения

Поддержка MySQL в PHP: настройка окружения

Настройка взаимодействия PHP с MySQL - базовая задача при развертывании веб-приложений. В зависимости от версии PHP и требований проекта используются разные расширения. Рассмотрим основные варианты, их установку, типичные ошибки и способы их устранения.

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

Наиболее современным и рекомендуемым решением является использование расширения PDO (PHP Data Objects) с драйвером pdo_mysql. PDO предоставляет единый интерфейс для разных СУБД, что удобно при смене базы данных. Для работы с MySQL необходимо установить пакет php-mysql (или php8.x-mysql в зависимости от версии).

# Установка на Ubuntu/Debian
sudo apt update
sudo apt install php-mysql

# После установки проверить, что модуль загружен
php -m | grep -i pdo

Php localhost 8000 (запуск php встроенного сервера на порту 8000)

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

<?php
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = 'secret';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
    echo "Соединение с MySQL установлено через PDO";
} catch (\PDOException $e) {
    echo "Ошибка подключения: " . $e->getMessage();
}

Php без сервера (запуск php без веб-сервера (cli))

Типичная проблема:

После установки php-mysql может появиться ошибка "could not find driver". Причина - отсутствие или неправильная загрузка драйвера pdo_mysql. Решение: убедиться, что в php.ini раскомментирована строка extension=pdo_mysql или extension=mysqli. На Ubuntu можно переустановить пакет: sudo apt install php-mysql и перезапустить веб-сервер.

Как использовать расширение mysqli (MySQL Improved)?

Расширение mysqli является предпочтительным для проектов, работающих исключительно с MySQL. Поддерживает как процедурный, так и объектно-ориентированный стиль. Установка аналогична:

sudo apt install php-mysql  # включает и mysqli, и pdo_mysql

где создать php (где создать php файл)

Пример подключения (процедурный стиль):

<?php
$connection = mysqli_connect('127.0.0.1', 'root', 'secret', 'test');

if (!$connection) {
    die('Ошибка соединения: ' . mysqli_connect_error());
}
echo 'Успешное соединение через mysqli';

где лог php (где находится лог php)

Ошибка при использовании mysqli:

"Call to undefined function mysqli_connect()" - расширение не активировано. Проверить php.ini: должна быть строка extension=mysqli (без точки с запятой в начале). После исправления перезагрузить веб-сервер (Apache, Nginx или php-fpm).

Как проверить, какие расширения MySQL уже установлены?

Перед настройкой полезно выяснить текущее состояние. Используется команда php -m или функция phpinfo(). Создайте файл info.php с содержимым:

<?php phpinfo(); ?>

Php s localhost (запуск php сервера с localhost)

Откройте его в браузере. Найдите секцию pdo_mysql или mysqli. Если их нет - расширения не загружены.

Что делать, если используется устаревшее расширение mysql?

Расширение mysql (без i) удалено из PHP 7.0 и выше. Начиная с PHP 5.5 оно помечено устаревшим. Если проект требует его поддержки, необходимо обновить код до mysqli или PDO. Замена тривиальна: mysql_connectmysqli_connect.

Ошибка при переходе на новую версию PHP:

"Fatal error: Call to undefined function mysql_connect()". Решение - переписать подключение с использованием mysqli или PDO. Альтернатива - понизить версию PHP, но это не рекомендуется по соображениям безопасности.

Как настроить поддержку MySQL в PHP через Docker?

При использовании Docker образ PHP часто не включает расширения MySQL. Нужно указать их установку в Dockerfile:

FROM php:8.2-fpm
RUN docker-php-ext-install pdo_mysql mysqli
# После сборки проверить: docker run --rm your-image php -m | grep mysql

где php код (где находится php код)

Также можно подключиться к MySQL через хост-сеть:

docker run -d --name myapp -p 8080:80 my-php-image

Важно: в контейнере указать хост MySQL как host.docker.internal (для Windows/Mac) или IP-адрес контейнера MySQL.

Выбор подходящего варианта зависит от требований проекта. Для новых приложений рекомендуется PDO, для миграций с устаревших систем - mysqli. Убедитесь, что версии PHP и MySQL совместимы, и всегда проверяйте наличие расширений через phpinfo().

Расширенные примеры работы с MySQL в PHP

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

Пример 1. Подключение через PDO с подготовленными запросами

Пример
<?php
// файл connect.php
$host = 'localhost';
$dbname = 'shop';
$user = 'web';
$pass = 'secure_pass_123';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    // Подготовленный запрос
    $stmt = $pdo->prepare('SELECT * FROM products WHERE price > :min_price');
    $stmt->execute(['min_price' => 100]);
    $products = $stmt->fetchAll();

    foreach ($products as $product) {
        echo $product['name'] . " - " . $product['price'] . "<br>";
    }
} catch (PDOException $e) {
    echo "Произошла ошибка: " . $e->getMessage();
}
?>
Результат:
Товар1 - 150
Товар2 - 200

Пояснение:

Подготовленные запросы защищают от SQL-инъекций. Параметры передаются отдельно. Атрибут FETCH_ASSOC возвращает ассоциативный массив.

Пример 2. Работа с mysqli (объектно-ориентированный стиль)

Пример
<?php
$mysqli = new mysqli('localhost', 'root', 'rootpass', 'test');

if ($mysqli->connect_errno) {
    die('Не удалось подключиться: ' . $mysqli->connect_error);
}

// Вставка данных с использованием prepared statement
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);

$name = "Иван";
$email = "ivan@example.com";
$stmt->execute();

echo "Новый пользователь с ID: " . $mysqli->insert_id;

$stmt->close();
$mysqli->close();
?>
Результат:
Новый пользователь с ID: 1

Пример 3. Проверка версии MySQL и PHP

Пример
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
echo 'Версия MySQL: ' . $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
echo '<br>';
echo 'Версия PHP: ' . phpversion();
?>
Версия MySQL: 8.2.0
Версия PHP: 8.1.12

Пример 4. Обработка исключений в PDO

Пример
<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=nonexistent', 'root', '');
} catch (PDOException $e) {
    // Логирование ошибки
    error_log('MySQL error: ' . $e->getMessage());
    // Пользовательское сообщение
    echo 'База данных временно недоступна. Пожалуйста, попробуйте позже.';
}
?>
Результат:
База данных временно недоступна. Пожалуйста, попробуйте позже.

Пример 5. Настройка драйвера через php.ini (на Windows)

Пример
; Раскомментировать строки в php.ini:
extension=mysqli
extension=pdo_mysql
; Путь к папке ext должен быть правильным: extension_dir = "ext"

После изменений перезапустить Apache или выполнить команду: php -c "путь к php.ini" -m | grep mysql для проверки.

Проблема: расширение не видно, хотя установлено

Решение: проверить права на файл php_mysqli.dll (Windows) или наличие пакета php-mysql (Linux). Иногда требуется явно указать extension=php_pdo_mysql.dll (Windows).

Поддержка MySQL в PHP - comments

En
Php mysql поддержка (php)