Как исправить ошибку 'could not find driver' в PHP настройках окружения

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

Почему возникает ошибка 'could not find driver'

Что означает ошибка 'could not find driver' и когда она появляется?

Ошибка could not find driver возникает при попытке создать объект PDO для подключения к базе данных, если в PHP не установлено или не включено соответствующее расширение PDO (например, pdo_mysql, pdo_pgsql, pdo_sqlite). Это стандартное исключение PDOException. Ошибка может появиться как в CLI-скриптах, так и в веб-приложениях.

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

Основное решение - установить соответствующее расширение через пакетный менеджер и включить его в конфигурации PHP.

Шаг 1. Установка расширения

Для Ubuntu/Debian:

sudo apt update
sudo apt install php-mysql

Get env php (получение переменных окружения)

Для CentOS/RHEL (в зависимости от версии PHP):

sudo yum install php-mysqlnd
# или для PHP 8.x:
sudo dnf install php-mysqlnd

Php could not find driver (ошибка "could not find driver" в php)

Для Windows нужно раскомментировать строку в php.ini:

extension=pdo_mysql

Php не является внутренней или внешней командой (php не является внутренней или внешней командой)

Для macOS через Homebrew:

brew install php@8.1
# или если PHP уже установлен:
brew install php-pdo-mysql

Php command line (командная строка php (cli))

После установки перезапустите веб-сервер (Apache, Nginx) или php-fpm.

Шаг 2. Проверка установки

Выполните в терминале:

php -m | grep -i pdo

Usr share php (путь usr/share/php)

Вывод должен содержать строки pdo_mysql или pdo. Если их нет - проверьте php.ini.

Проверьте через скрипт:

<?php
phpinfo();
?>

Найдите раздел pdo_mysql. Если его нет, расширение не загружено.

Типичная проблема: модуль установлен, но не подключается из-за того, что используется не тот файл php.ini. Узнайте путь к активной конфигурации:

php --ini

Или выполните скрипт с phpinfo() и посмотрите поле Loaded Configuration File. Если вы редактировали другой php.ini, скопируйте директиву в правильный файл.

Ещё одна проблема - наличие строки ;extension=pdo_mysql (с точкой с запятой) - её нужно раскомментировать.

Как проверить список доступных драйверов PDO?

Иногда ошибка возникает, потому что драйвер не поддерживается вовсе. Выведите список доступных драйверов:

<?php
$drivers = PDO::getAvailableDrivers();
print_r($drivers);
?>

Результат может быть:

Array
(
    [0] => mysql
    [1] => sqlite
)

Если драйвера, который вам нужен, нет в списке, его нужно установить.

Частая ошибка: драйвер есть в выводе php -m, но недоступен в PDO::getAvailableDrivers(). Это возможно, если расширение pdo не загружено. Проверьте, что само расширение pdo присутствует.

Как решить проблему для специфичных драйверов (Oracle, DB2, Firebird)?

Для Oracle используется pdo_oci, для DB2 - pdo_ibm, для Firebird - pdo_firebird. Установка часто требует дополнительных библиотек. Пример для Oracle на Ubuntu:

sudo apt install php-oci8
# или для PHP 8.x:
sudo apt install php8.1-oci8

На CentOS может потребоваться установка oracle-instantclient и модуля pdo_oci из PECL:

sudo pecl install pdo_oci

После этого добавьте extension=pdo_oci.so в php.ini.

Возможная проблема: при установке через PECL может потребоваться указать путь к Instant Client. Если путь неверный, сборка не удастся. Проверьте, что переменная окружения OCI_INSTANT_CLIENT_LIB указывает на правильную директорию.

Как включить драйвер в Docker-контейнере?

При использовании Docker образов PHP (например, php:8.1-apache) расширения устанавливаются через docker-php-ext-install. Пример Dockerfile:

FROM php:8.1-apache
RUN docker-php-ext-install pdo_mysql
# или для PostgreSQL:
RUN docker-php-ext-install pdo_pgsql

Если контейнер уже запущен, можно выполнить команду внутри него:

docker exec -it <container_name> docker-php-ext-install pdo_mysql
docker restart <container_name>

Проблема: для некоторых драйверов (например, pdo_pgsql) могут потребоваться зависимости (libpq-dev). Установите их сначала:

RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo_pgsql

Не забудьте пересобрать образ.

Какие ещё варианты решения при ошибке на Windows?

На Windows часто проблема в том, что расширение php_pdo_mysql.dll не подключено. Откройте php.ini (обычно в папке PHP) и убедитесь, что строка:

extension=php_pdo_mysql.dll

не закомментирована. Также проверьте, что DLL присутствует в папке ext. Если нет - скачайте соответствующую версию с официального сайта PHP.

Распространённая ошибка: в Windows могут быть разные версии php.ini: для Apache, для CLI, для IIS. Редактировать нужно тот, который использует ваш веб-сервер. Определить можно через phpinfo() в веб-скрипте или из командной строки php --ini.

Расширенные примеры установки и диагностики драйверов PDO

Ниже приведены сценарии для различных окружений и операционных систем, включая нестандартные случаи.

Пример 1. Скрипт полной диагностики PDO

Этот скрипт показывает, какие драйверы доступны, версию PHP, конфигурационные директивы, связанные с PDO, и проверяет наличие конкретного драйвера.

Пример
<?php
echo "Версия PHP: " . phpversion() . "
";
echo "Доступные драйверы PDO: " . implode(', ', PDO::getAvailableDrivers()) . "
";
echo "Загруженные расширения PDO: " . implode(', ', get_loaded_extensions(true)) . "
";
// Проверка наличия pdo_mysql
if (in_array('pdo_mysql', get_loaded_extensions(true))) {
    echo "pdo_mysql загружен.";
} else {
    echo "pdo_mysql НЕ загружен.";
}
?>

Результат (пример вывода):

Версия PHP: 8.1.23
Доступные драйверы PDO: mysql, sqlite
Загруженные расширения PDO: Core, date, libxml, pdo, pdo_mysql, spl, standard
pdo_mysql загружен.

Если драйвер не загружен, проверьте php.ini или переустановите расширение.

Пример 2. Установка всех популярных драйверов PDO в Ubuntu одной командой

Для разработчика может потребоваться сразу несколько драйверов. Выполните:

Пример
sudo apt install php-mysql php-pgsql php-sqlite3 php-oci8 php-firebird

После установки проверьте через php -m | grep pdo. Обратите внимание, что расширения для Oracle и Firebird могут требовать дополнительные библиотеки (libaio1, firebird-dev).

Пример 3. Установка драйвера pdo_pgsql в Alpine Linux (маленький Docker-образ)

В официальных образах php:8.2-alpine часто используется apk:

Пример
FROM php:8.2-alpine
RUN apk add --no-cache postgresql-dev \
    && docker-php-ext-install pdo_pgsql

Если вы используете собственный образ, не забудьте установить postgresql-dev - это требуется для компиляции.

Пример 4. Включение драйвера pdo_mysql в php.ini для разных версий PHP (CLI и Apache)

Иногда бывает, что для CLI и веб-сервера используются разные php.ini. Для CLI:

Пример
# Показать путь:
php --ini
# Редактировать найденный файл, добавить строку (если её нет):
echo "extension=pdo_mysql" >> /etc/php/8.1/cli/php.ini

Для Apache (если используется mod_php):

Пример
# Узнать путь через phpinfo() или:
sudo nano /etc/php/8.1/apache2/php.ini
# Добавить extension=pdo_mysql

Затем перезапустите Apache:

Пример
sudo systemctl restart apache2

Пример 5. Использование PDO::getAvailableDrivers() для выбора подходящего подключения

В сложных приложениях можно динамически выбирать драйвер в зависимости от доступности:

Пример
<?php
$dsn = '';
$drivers = PDO::getAvailableDrivers();
if (in_array('mysql', $drivers)) {
    $dsn = 'mysql:host=localhost;dbname=test';
} elseif (in_array('sqlite', $drivers)) {
    $dsn = 'sqlite:/tmp/test.sqlite';
} else {
    die('Нет доступного драйвера PDO');
}
try {
    $pdo = new PDO($dsn, 'user', 'pass');
    echo 'Подключение успешно';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>

Пример 6. Компиляция PHP с собственными драйверами PDO (продвинутый уровень)

Если стандартные пакеты не подходят, можно скомпилировать PHP с необходимыми опциями:

Пример
./configure --with-pdo-mysql=/usr \
            --with-pdo-pgsql=/usr \
            --with-pdo-sqlite=shared \
            --with-pdo-oci=instantclient,/usr/lib/oracle/21/client64/lib
make -j4
sudo make install

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

Пример
php -m | grep pdo

При сборке могут возникнуть ошибки отсутствующих заголовочных файлов (например, mysql.h). Установите пакеты -dev перед конфигурацией.

Пример 7. Исправление ошибки 'could not find driver' для pdo_sqlite на Windows без установки SQLite

В состав PHP обычно входит расширение php_pdo_sqlite.dll. Если оно не загружается, проверьте наличие DLL в папке ext. Если файла нет, скачайте PHP снова с включённым расширением. Также убедитесь, что в php.ini не стоит ;extension=php_pdo_sqlite.dll. После исправления перезапустите сервер.

Пример 8. Использование composer для проверки необходимых расширений

В вашем composer.json можно указать требуемые расширения. При установке пакетов Composer проверяет их наличие. Если расширение отсутствует, он выдаст ошибку. Пример composer.json:

Пример
{
    "require": {
        "php": ">=8.0",
        "ext-pdo_mysql": "*",
        "ext-pdo_pgsql": "*"
    }
}

Запустите composer install - если расширение не установлено, вы получите сообщение о недостающем требовании.

Ошибка "could not find driver" в PHP - comments

En
Php could not find driver (php)