冒頭まとめ

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 に存在することを確認してから有効にしてください。行を追加するだけで、存在しない拡張ファイルが導入されるわけではありません。

CLIなら php --ini、Webなら対象アプリでの php_ini_loaded_file() の結果を使い、実際に読むファイルを確認します。PHPの設定ファイルの説明には、実行方式ごとの指定と、追加iniファイルの読み込みがあります。名前が同じphp.iniを別の場所で編集していないかも確認してください。

変更後はPHPを再起動します。Webで常駐しているPHP-FPMやApacheなどは、利用環境の管理手順に従って設定を反映してください。CLIは新たに起動したPHPで確認します。

起動時に拡張を読み込めない警告が出る場合は、その警告を先に調べます。最終的に対象のPHPでドライバ名が一覧に現れたかまで確認してください。

LinuxとDockerはPHPの導入方法に合わせる

LinuxでOSのパッケージとしてPHPを導入している場合は、同じ配布元・PHPの版に対応するPDOドライバのパッケージを確認します。パッケージ名は環境によって異なるため、別の版向けの名前をそのまま使わないでください。

Docker公式PHPイメージでは、公式の拡張導入手順にある docker-php-ext-install などを使います。MySQL用ドライバを追加するDockerfileの構成例です。

FROM php:8.5.12-apache
RUN docker-php-ext-install pdo_mysql

このベースイメージのタグは、確認時点の公式のタグ一覧に記載されています。実際のプロジェクトでは、利用中の実行方式と更新方針に合うベースイメージへ変更してください。拡張によっては、組み立てるための追加ライブラリも必要です。

Dockerfileを変えた後はイメージを作り直し、そのイメージを使うコンテナへ反映します。稼働中のコンテナの中だけで手作業すると、作り直した際に変更が失われるため、構成ファイルへ記録します。

Docker公式PHPイメージへOS配布のPHPパッケージを追加すると、別のPHPが混在する問題があります。公式説明もこの組み合わせを区別しているため、OSのPHPと公式PHPイメージの手順を混ぜないようにします。

ドライバが見えた後に接続結果を確認する

必要な名前が PDO::getAvailableDrivers() に現れたら、同じWeb処理やCLIコマンドで接続を再試行します。CLIだけ成功してWebが同じエラーなら、Web側の設定や起動中のPHPを再確認します。

ドライバが見つかった後は、認証や接続先の問題が別のエラーとして現れる場合があります。PostgreSQLのconnection refusedは接続先に到達できない問題、password authentication failedは認証の問題です。

database does not existは、サーバー側に指定のデータベースが無い場合です。本件のドライバ不足とは、確認する段階が異なります。

エラーメッセージが変わった場合は、新しい文言を記録して次の問題を調べてください。ドライバの有効化と、データベース接続の成功は分けて確認します。

解決手順のまとめ

DSNの先頭と、エラーを出したPHPの利用可能なドライバ名を照合します。必要なドライバが無ければ、Windowsの拡張設定、Linuxの対応パッケージ、Dockerのイメージ構成など、導入方法に合わせて追加します。

設定反映後は同じ実行環境でドライバ一覧を再確認し、接続を試します。CLIでの確認だけでWeb側も直ったと判断せず、実際に失敗していた処理の結果まで確認してください。

本記事は2026年10月25日に確認した公式資料とPHP 8.5.12の実装に基づきます。掲載コード・コマンド、Dockerイメージの組み立てと接続処理は実行未検証です。


免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。