7.

PHP could not find driver (PDO) の原因と対処

編集
この記事の要点
  • PHP の例外 PDOException: could not find driverPDO ドライバ未インストール / 未有効化
  • 原因 1: php-mysql / php-pgsql / php-sqlite3 等の拡張パッケージが未導入
  • 原因 2: php.iniextension=pdo_mysql がコメントアウト or extension_dir ミス
  • 原因 3: Web (Apache/Nginx) と CLI で php.ini が異なる → 両方確認
  • 確認は php -m | grep pdo、修正後は Apache/PHP-FPM 再起動

エラーメッセージ

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 で別 iniphpinfo() の「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 '<?php phpinfo();' | sudo tee /var/www/html/info.php
# ブラウザで http://server/info.php

# 探すべき項目:
#   Loaded Configuration File   /etc/php/8.2/apache2/php.ini   ← CLI と別!
#   PDO drivers                  (空 or mysql の有無)
#
# 終わったら必ず削除
sudo rm /var/www/html/info.php

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 専用ドライバは存在しません(互換)。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Fatal error: Maximum execution time of 30 seconds exceeded in...
  2. Fatal error: Uncaught Error: Cannot use object of type stdClass as array in ...
  3. Warning: Use of undefined constant ... - assumed '...' (this will throw an Error)
  4. ERROR: Call to undefined method Maatwebsite\Excel\Excel::load()
  5. Maximum execution time of 30 seconds exceeded
  6. Your requirements could not be resolved to an installable set of packages. ... To enable extensions, verify that they are enabled in your .ini files:
  7. could not find driver
  8. the requested PHP extension mbstring is missing from your system.
  9. the requested PHP extension dom is missing from your system.
  10. A non well formed numeric value encountered
  11. Warning: Cannot modify header information - headers already sent by ...
  12. php_network_getaddresses: getaddrinfo failed: Name or service not known
  13. XMLWriter::openUri(): Unable to resolve file path
  14. Object of class stdClass could not be converted to string
  15. Class 'Google_Service_Youtube' not found

最近更新/作成されたページ