PHPのPDOドライバ不足の対処法

冒頭まとめ PHPでPDOを使ってデータベースへ接続しようとすると、次の例外が出ることがあります。 PDOException: could not find driver 接続文字列が指定する種類のPDOドライバを、実行中のPHPが見つけられなかったことを示します。PDOは、データベースを共通の方法で操作する仕組みです。PDO本体と、MySQLなどの種類ごとのドライバは分けて確認する必要があります。 まず接続文字列の先頭と PDO::getAvailableDrivers() の結果を照合します。必要なドライバが無ければ、エラーを出したPHPの環境へ導入・有効化してください。 接続前にDSNの先頭とドライバを照合する DSNは、接続先を表す文字列です。たとえば mysql:host=localhost;dbname=myapp なら、最初のコロンより前の mysql がドライバ名です。 PHP 8.5.12の実装では、この名前に対応する登録済みのドライバを探し、見つからなければ could not find driver を投げます。この段階では、そのドライバによる接続処理へ進んでいません。 そのため、このエラーからホスト名やパスワードの正しさは判断できません。先にドライバの問題を解消し、その後に接続先の確認へ進みます。 同じ実装のコメントには、パスワードが含まれる可能性があるためDSNをエラー文に入れないと書かれています。調査のためにDSN全体や認証情報を公開せず、必要なドライバ名を切り分けて確認してください。 実行中のPHPで利用できるドライバを確認する CLIでエラーが出た場合は、同じPHPで次を実行します。 php -r "print_r(PDO::getAvailableDrivers());" php -m php --ini PDO::getAvailableDrivers()の公式説明では、現在利用できるPDOドライバ名の配列が返ります。ドライバが無ければ空の配列になります。 DSNが mysql: なら一覧に mysql が必要です。php -m にPDOと表示されていても、それだけではMySQL用ドライバが使えるとは判断できません。また、mysqliとPDO_MYSQLは別の拡張なので、mysqliの有効化だけで済ませないようにします。 Webの処理で失敗する場合は、対象アプリの管理者用の診断処理やログで確認します。 <?php error_log('PHP=' . PHP_VERSION . ' SAPI=' . PHP_SAPI); error_log('PDO drivers=' . implode(',', PDO::getAvailableDrivers())); error_log('php.ini=' . (php_ini_loaded_file() ?: '(none)')); CLIの結果と比較し、同じPHPの版と設定かを確認してください。もしここでPDOクラス自体が無いという別のエラーになるなら、各ドライバより先にPDO本体を確認します。 DSNはmysql・pgsql・sqliteの名前に合わせる 使用するデータベースとDSNの先頭を確認します。MySQL用の説明では mysql:、PostgreSQL用の説明では pgsql:、SQLite用の説明では sqlite: を使います。 PostgreSQLだから postgresql:、という指定にはしません。必要な拡張が入っていても、登録名と異なる指定なら見つかりません。公式の小文字の表記に合わせてください。 対応する拡張名は、MySQLなら pdo_mysql、PostgreSQLなら pdo_pgsql、SQLiteなら pdo_sqlite です。設定ファイルに書く拡張名と、DSNに書く名前は同じ文字列ではありません。 フレームワークを使っている場合は、アプリの設定からどのデータベース用のDSNが生成されているかを確認します。エラーを消すために実際の接続先とは違う種類へ変更するのではなく、意図した接続先とドライバを合わせます。 Windowsでは読み込むphp.iniと拡張ファイルを確認する PDOの導入手順では、WindowsのPDO本体は既定で有効で、データベースごとのドライバをphp.iniで有効にするよう案内されています。MySQL用の例は次です。 extension=pdo_mysql 既存の行が ;extension=pdo_mysql なら、先頭のセミコロンはコメントを意味します。必要な拡張ファイルが extension_dir に存在することを確認してから有効にしてください。行を追加するだけで、存在しない拡張ファイルが導入されるわけではありません。 ...

2026年10月25日 · ErrorLog