PDOException: could not find driver
#Что происходит
При создании new PDO('mysql:host=...') PHP ищет драйвер pdo_mysql. Если расширение не загружено, возникает ошибка could not find driver. Часто виновата не установка, а несоответствие окружений: расширение подключено для CLI, но не для PHP-FPM; установлено для одной версии PHP, а сайт работает на другой; закомментирована строка в php.ini; в DSN указан неверный префикс (например, mysqli: вместо mysql:).
#Причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Расширение не установленоМинимальная сборка. | Список драйверов пуст. | Установите пакет php-mysql. |
| Закомментирована строкаВ php.ini. | Расширение не грузится. | Раскомментируйте. |
| Разные php.ini для CLI и FPMПравили не тот файл. | В консоли работает, на сайте нет. | Правьте файл FPM. |
| Несколько версий PHPСайт на другой. | Версии не совпадают. | Установите расширение для нужной. |
| Ошибка в DSNОпечатка в префиксе. | Драйвер 'mysqli' не существует. | Используйте mysql:. |
| Хостинг отключил расширениеОграничения. | Нет в списке. | Включите в панели. |
#Порядок
- Определите, на каком PHP возникает ошибкаЕсли сообщение появилось на сайте, войдите в панель хостинга и откройте настройки именно этого домена: запишите версию PHP и режим обработки (PHP-FPM, CGI и т. п.). При выполнении скрипта из консоли откройте терминал сервера и выполните
php -v. Это два разных окружения: успешная проверка в консоли не доказывает исправность сайта. Не публикуйте страницу с полнымphpinfo()в интернете. - Узнайте название нужного драйвераОткройте конфигурацию приложения на сервере и найдите строку подключения PDO (DSN). Начало
mysql:требуетpdo_mysql,pgsql:—pdo_pgsql,sqlite:—pdo_sqlite. Проверьте, что случайно не указаноmysqli:— это другое расширение. Не копируйте пароль, логин и полный DSN в сообщения поддержки или публичные отчёты. - Проверьте драйвер именно в рабочем обработчикеДля консоли можно выполнить
php -r "print_r(PDO::getAvailableDrivers());". Для сайта создайте на короткое время закрытую от посетителей диагностическую страницу в служебном каталоге с выводомPHP_VERSIONиPDO::getAvailableDrivers()и откройте её через тот же домен. Сравните результат с нужным драйвером. После проверки удалите страницу. Если нет доступа к серверу, попросите хостера показать список PDO-драйверов веб-обработчика. - Установите или включите расширение без смешения версийПри управляемом хостинге откройте настройки PHP → «Расширения» у нужного домена и активируйте найденный модуль; расположение пункта зависит от панели. На собственном Debian/Ubuntu администратор сначала проверяет версию PHP-FPM, затем подбирает пакет для неё в репозитории (например, пакет
php8.2-mysqlсодержитpdo_mysqlдля PHP 8.2). Нельзя механически устанавливать пакет для другой версии PHP и ожидать, что он появится на сайте. - Перезапустите нужный обработчик, если это требуетсяПосле установки пакета администратор определяет точное имя службы командой
systemctl list-units --type=service | grep phpи только затем перезапускает соответствующий PHP-FPM, напримерsudo systemctl restart php8.2-fpmлишь если это действительно активная служба данного сайта. На хостинге обычно достаточно сохранить параметры PHP; при отсутствии прав перезапуск делает поддержка. Не меняйте наугад другие сайты и версии. - Проверьте исправление и соберите сведения о сбоеСнова откройте диагностический список: имя
mysql/pgsql/sqliteдолжно присутствовать вPDO::getAvailableDrivers(). Удалите диагностический файл. Затем повторите исходную операцию приложения. Если ошибка осталась, сопоставьте фактическую версию PHP веб-сайта, префикс DSN и список драйверов и передайте эти данные администратору без учётных данных и паролей. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Проверка подключения
После включения проверьте подключение к базе: new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8mb4', $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);. Если появляется другая ошибка (Access denied, Connection refused), драйвер работает, и дальше нужно проверять логин, пароль и адрес сервера БД.
#Особенности разных окружений
В Docker-образах php:*-fpm расширения не включены по умолчанию: добавьте в Dockerfile строку RUN docker-php-ext-install pdo pdo_mysql (для PostgreSQL потребуются заголовки libpq-dev и pdo_pgsql) и пересоберите образ. В XAMPP и OpenServer расширения включают в панели или в php.ini соответствующей версии PHP, а после правки нужно перезапустить Apache. На виртуальном хостинге ISPmanager и cPanel версия и набор модулей выбираются отдельно для каждого сайта: переключатель находится в разделе «PHP» домена.
Если драйвер установлен, но ошибка остаётся, проверьте нет ли в окружении нескольких бинарников PHP: команда which -a php покажет их все, а php -v из консоли может относиться к другой версии, чем та, на которой запущен сайт.
which -a phpls /usr/sbin/php-fpm* 2>/dev/null