先日PHPからDB(MySQL)に接続する際、どうしても必要なDBドライバが読み込めず、めちゃめちゃハマったのでシェアします。対処法を調べている内に数時間を浪費してしまいました。
そもそもの話としてPHPからDBにアクセスする方法は現在は以下の2通りあります。
- mysqliモジュール
- PDO_MySQLモジュール
PHP5.5以前はmysqlというモジュールが存在しましたが、PHP5.5を境に非推奨となっています。
上記に注意した上で、今回は2番目のPDOを使用した方法で接続したので、その前提で記事を読み進めて頂ければと思います。
今回ハマったこと
詳細
PHPでは設定情報が確認できるphpinfo関数が用意されています。PHPのバージョンやサーバーの情報が表示されるわけですが、当然ながらDBへの接続情報も表示されます。
しかし、表示されない・・・。
「no valueの画像」
先に解決した方法
先に解決した方法を記載します。
後述の方法を試しても直らないのでPHPを再インストールしました。恐らくディレクトリの移動など、行儀の悪い事をやってしまったと予想。以下の方法で直らなかった方は最終手段として考慮するのもアリかなという所です。
確認すべきこと
PHPの公式リファレンス、ブログ、QAサイト等の二次情報を調べ尽くし、以下の方法を試しました。
php.iniが存在するか
PHPの設定ファイルであるphp.iniが存在するかを確認しましょう。
PHPをダウンロード、インストールした初期状態では、php.iniは存在しません。
初期状態では、開発用のサンプルphp.ini-development、本番用のサンプルphp.ini-productionの2つがあります。その為、この2つを参考に、php.iniファイルを作成します。
php.iniファイルが正しく読み込まれていない状態
php.iniファイルが読み込まれていない場合、上図のLoaded Configuration File に対象ファイルのパスが表示されます。
ext(拡張モジュール)のディレクトリパスは正しいか
拡張モジュールが配置されているディレクトリのパスが正しくphp.iniに設定されているか(=指定先のパスが本当に存在するか)を確認しましょう。
php.iniでextension_dirという設定値があるので、該当箇所のパスを確認します。
正しく設定されている場合、phpinfoの該当箇所に拡張モジュールのパスが設定されます。
対象の拡張モジュールのパスが正しいか
読み込みたい拡張モジュールのパスが正しいか確認しましょう。また、先頭のセミコロン(;)はコメントを意味するので、セミコロンがついていないかも確認します。
;extension=pgsql ;extension=shmop extension=php_pdo_mysql.dll
今回はPDOを使用したいので、php.iniに設定する場合は上記のようにモジュールを指定します。
対象の拡張モジュールは存在するか
設定ファイルが読み込めて、拡張モジュールのディレクトリも読み込めました。読む込む拡張モジュールも指定しました。
では、肝心の拡張モジュール本体は実際に存在するかも確認しましょう。
読み込む対象のファイルが存在する。PDOはPHPをダウンロード、インストールすれば一緒に入っているので気にする必要はないですが、念の為。
これだけ確認してダメだったらPHP再インストールも考える
上記確認して状況が変わらなかったらPHPの再インストールも視野に入れてよいかと思います。
私の場合、対処法を調べている内に数時間を浪費してしまったので、それよりも一からやり直してプロダクトを完成に近づけるべきかと思っています。