◀ 55.

【Laravelエラー】could not find driver(Windows, MySQL編)

この記事の要点
  • Laravel から MySQL に接続するための PHP 拡張 pdo_mysql が読み込まれていないときのエラー
  • 対処: php.ini の ;extension=pdo_mysql の先頭の ; を外し、php artisan serve や Apache を再起動する
  • php.ini の場所は php --ini で確認。「Loaded Configuration File: (none)」なら php.ini 自体が無い
  • Windows では extension_dir が正しく設定されていないと、行を有効にしても拡張が読み込まれない
  • コマンドライン用と Web サーバー用で別の php.ini が使われていることがある
  • php -m の一覧に pdo_mysql が出れば解決

前提

  • OS: Windows 10 / 11
  • DB: MySQL(MariaDB も同じ pdo_mysql 拡張を使います)
  • PHP: 公式サイト(windows.php.net)の ZIP 版、または XAMPP 同梱の PHP

エラー内容

could not find driver

Laravel のバージョンによっては、次のように接続情報付きで表示されます。

Illuminate\Database\QueryException
could not find driver (Connection: mysql, SQL: select * from ...)

発生条件と原因

php artisan migrate の実行時や、DB にアクセスするページを開いたときなど、MySQL に接続する際に発生するエラーです。

Laravel は PHP の PDO(データベース接続の共通インターフェース)を使って DB に接続します。PDO で MySQL を扱うには、pdo_mysql という拡張モジュールが必要です。Windows 版 PHP には pdo_mysql の DLL(ext\php_pdo_mysql.dll)は同梱されていますが、php.ini で有効にしないと読み込まれません。php.ini の該当行がコメントアウトされたままだと、PDO が MySQL 用のドライバーを見つけられずにこのエラーになります。

対処法

1. 使われている php.ini の場所を確認する

php.ini の場所は以下のコマンドで確認します(出力は一例です)。

$ php --ini
Configuration File (php.ini) Path: C:\Windows
Loaded Configuration File:         C:\Program Files\php-7.4.6-Win32-vc15-x64\php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

「Loaded Configuration File」に表示されたファイルが、実際に読み込まれている php.ini です。ここが (none) になっている場合は php.ini が存在しません。PHP のフォルダにある php.ini-development をコピーして php.ini という名前で保存してください。

2. pdo_mysql を有効にする

php.ini に「;extension=pdo_mysql」の記述があるので、先頭の「;」を削除してコメントアウトを解除します。

; 変更前
;extension=pdo_mysql

; 変更後
extension=pdo_mysql

PHP 7.2 より前のバージョンでは extension=php_pdo_mysql.dll という書き方になっています。Laravel と組み合わせるなら、mbstring、openssl、fileinfo なども同様に有効になっているか確認しておくと、後の別エラーを防げます。

3. extension_dir を設定する(Windows で特に重要)

Windows では、拡張モジュールを探すフォルダ extension_dir が実際の ext フォルダを指していないと、行を有効にしても読み込まれません。php.ini の該当行を、PHP をインストールしたフォルダの ext を指す絶対パスにしておくのが確実です。

extension_dir = "C:\Program Files\php-7.4.6-Win32-vc15-x64\ext"

4. PHP を使っているプロセスを再起動する

php.ini は PHP の起動時に読み込まれます。php artisan serve を使っている場合は Ctrl + C で止めて起動し直します。Apache(XAMPP)や IIS を使っている場合は、Web サーバーを再起動します。

これで MySQL にアクセスできるようになります。

直らないときに確認すること

状況原因と対処
コマンドでは直ったがブラウザでは同じエラーWeb サーバーが別の php.ini を読んでいる。phpinfo() を表示するページを作り、「Loaded Configuration File」を確認して、そちらも修正する
PHP が複数インストールされているwhere php で、コマンドプロンプトがどの php.exe を使っているか確認する。PATH の先頭にある PHP が使われる
起動時に「Unable to load dynamic library」の警告extension_dir の指定が間違っているか、DLL が無い。警告に表示されたパスを確認する
エラーに Connection: sqlite と出ているLaravel 11 以降の初期設定は SQLite。MySQL を使うなら .env の DB_CONNECTION=mysql に変える。SQLite を使うなら pdo_sqlite を有効にする
Docker やレンタルサーバーで発生Windows 以外では php.ini ではなくパッケージの追加が必要なことが多い(例: Docker 公式イメージでは docker-php-ext-install pdo_mysql)

確認方法

読み込まれている拡張モジュールの一覧に pdo_mysql があるか確認します。

php -m | findstr /i pdo

pdo_mysql と表示されれば有効になっています。最後に php artisan migrate などを実行して、エラーが出ないことを確認しましょう。なお、ドライバーが読み込まれた後に「Access denied」や「Connection refused」が出る場合は、拡張の問題は解決しており、.env の接続設定や MySQL の起動状態の問題です。

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)