タイトル: could not find driver
SEOタイトル: PHP could not find driver (PDO) の原因と対処
| この記事の要点 |
|
エラーメッセージ
PDOException: could not find driver
SQLSTATE[HY000] [2002] could not find driver
# Laravel
Illuminate\Database\QueryException
could not find driver (SQL: select * from users)
# 例外スタック
PDO->__construct('mysql:host=...', ...) at PDO.php:0
PHP の PDO (PHP Data Objects) は本体 (pdo) と DB 毎のドライバ (pdo_mysql / pdo_pgsql / pdo_sqlite / pdo_sqlsrv) に分かれています。本体はあってもドライバが無いと、コネクション文字列のスキーム部分を解決できず「could not find driver」が出ます。
原因の切り分け
| 確認 | 方法 | 該当する場合の対処 |
|---|---|---|
| ドライバがロードされているか | php -m | grep -i pdo | 不足ならパッケージ追加 (対処1) |
| PHP 拡張ファイル存在 | ls /usr/lib/php/*/pdo_mysql.so | 無ければ apt install php-mysql |
| php.ini で有効化 | php --ini + extension=pdo_mysql 行 | コメント解除(対処2) |
| CLI と Web で別 ini | phpinfo() の「Loaded Configuration File」 | 両方確認(対処3) |
| DSN スキーム正しいか | 接続文字列の頭 | mysql: / pgsql: / sqlite: |
対処1: ドライバパッケージのインストール
Ubuntu / Debian
# 自分の PHP バージョン確認
php -v
# PHP 8.2.x
# MySQL / MariaDB
sudo apt install -y php-mysql
# またはバージョン指定
sudo apt install -y php8.2-mysql
# PostgreSQL
sudo apt install -y php-pgsql php8.2-pgsql
# SQLite
sudo apt install -y php-sqlite3 php8.2-sqlite3
# SQL Server (Microsoft Drivers for PHP)
sudo apt install -y php-sqlsrv
# よくセットで使うもの
sudo apt install -y php-mysql php-curl php-mbstring php-xml php-zip php-bcmath
# 反映 (Apache or php-fpm)
sudo systemctl restart apache2
sudo systemctl restart php8.2-fpm
RHEL / Rocky / AlmaLinux
sudo dnf install -y php-mysqlnd php-pdo
# PostgreSQL
sudo dnf install -y php-pgsql
# SQLite
sudo dnf install -y php-sqlite3
# Remi 等のサードパーティリポを使う場合
sudo dnf module enable -y php:remi-8.2
sudo dnf install -y php-mysqlnd
sudo systemctl restart httpd
sudo systemctl restart php-fpm
Alpine (Docker)
FROM php:8.2-fpm-alpine
RUN apk add --no-cache \
$PHPIZE_DEPS \
oniguruma-dev libxml2-dev libpq-dev \
&& docker-php-ext-install pdo pdo_mysql pdo_pgsql mbstring xml
対処2: php.ini で有効化
パッケージは入っているが ini で extension がコメントアウトされている場合:
# どの php.ini が使われているか
php --ini
# Configuration File (php.ini) Path: /etc/php/8.2/cli
# Loaded Configuration File: /etc/php/8.2/cli/php.ini
# Scan for additional .ini files in: /etc/php/8.2/cli/conf.d
# Additional .ini files parsed: /etc/php/8.2/cli/conf.d/20-pdo.ini, ...; /etc/php/8.2/cli/conf.d/20-pdo_mysql.ini
extension=pdo_mysql
; Windows の場合
extension=php_pdo_mysql.dll
extension_dir = "C:\php\ext"
対処3: Web (Apache/Nginx) と CLI で ini が別物
これが地味に多い罠。CLI で php -m したら出るが、Web から叩くと「could not find driver」というケース:
# CLI 側
php -m | grep pdo
# pdo
# pdo_mysql ← OK
# Web 側を info.php で確認
echo '
Apache 用と CLI 用で conf.d が独立しているディストリ (Debian/Ubuntu の Apache MPM 構成) では、php-mysql インストール後に Apache や php-fpm を再起動しないと反映されません。
Docker でのよくあるハマり
# ❌ よくある誤り: pdo_mysql 入れ忘れ
FROM php:8.2-fpm
COPY . /app
# → 起動時に could not find driver
# ✅ 正しい
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y libzip-dev libpng-dev \
&& docker-php-ext-install pdo_mysql zip gd
# Laravel Sail / 公式以外のイメージを使うときも同様
Laravel での確認手順
# .env 確認
cat .env | grep DB_
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# ...
# config/database.php の該当ドライバ
php artisan config:cache
php artisan tinker
> DB::connection()->getPdo();
# could not find driver が出たら php-mysql 未導入
# 「Connection refused」なら別問題 (DB 未起動 / FW)
SQLite を使うとき
# Laravel テストでよく使う
sudo apt install -y php-sqlite3
# .env
# DB_CONNECTION=sqlite
# DB_DATABASE=/absolute/path/database.sqlite
# ファイル作成
touch database/database.sqlite
php artisan migrate
Windows の場合
; php.ini (C:\php\php.ini)
extension_dir = "C:\php\ext"
; PDO ドライバ
extension=pdo_mysql
extension=pdo_pgsql
extension=pdo_sqlite
extension=mysqli
Apache 同梱の XAMPP / Laragon では、コントロールパネルで Apache 再起動が必須。IIS の場合は handler mapping と php-cgi.exe の場所を確認。
FAQ
Q: php -m では出るのに Web で出ない
A: Apache or php-fpm を再起動。CLI と Web で php.ini が別なケース多数。phpinfo() で「PDO drivers」項目を確認。
Q: composer require で解決できない?
A: PDO ドライバは PHP のネイティブ拡張なので Composer では入りません。OS パッケージマネージャで導入する必要があります。
Q: DSN を mariadb: にすべき?
A: MariaDB でも MySQL でも DSN は mysql:。PDO の MariaDB 専用ドライバは存在しません(互換)。