質問: FreeBSDでサーバーを立てていて、その中にMySQLを入れています。 SQLインジェクションを防ぐため、プレースフォルプレースフォルダを使用するべく PDOを使いDB接続を試みているのですが Error:could not find driver ブラウザ上で上記のエラーメッセージが表示されます。 色々調べたのですが、CentOSでの解決策ばかりで、FreeBSD向けの解決策の発見には至りませんでした。 PDOファイル自体はあるのですが、何が原因で「ドライバーがない」と言われているのかがわからず、苦戦しております。 どなたか解決策、もしくは考えられるであろう原因をご教授お願いいたします。 ### 発生している問題・エラーメッセージ ``` Error:could not find driver ``` ### 環境 version FreeBSD 11.0 MySQL 5.6 PHP 5.6
回答: シェルにログイン出来るのでしたら、 ``` $ php -i | grep pdo pdo_mysql pdo_sqlite ``` こんな感じで、なんのDB用のモジュールがロードされているかが確認できます。 `pdo_mysql`が表示されない場合はPDOのMySQL用のモジュールが読み込まれていないです。 ロードされていない場合はextension_dirを調べます。 ``` $ php -i | grep extension_dir extension_dir => /usr/local/lib/php/xxxxxxxx => /usr/local/lib/php/xxxxxxxx $ ls -l /usr/local/lib/php/xxxxxxxx | grep pdo -r--r--r-- 1 root wheel 101784 4月 5 2016 pdo.so -r--r--r-- 1 root wheel 24320 4月 5 2016 pdo_mysql.so -r--r--r-- 1 root wheel 24752 4月 5 2016 pdo_sqlite.so ``` エクステンションディレクトリに`pdo_mysql.so`がない場合は、モジュールがインストールされていない可能性が高いです。 上のコメントを見る限りインストールはされているようなので、iniファイルに設定がないか、設定はあるがsoファイルが所定のディレクトリにないので正常にロードされていないかのどちらかだと思われます。 設定が存在する場合はiniファイルを調べます。 ``` $ php -i | grep ini Loaded Configuration File => /usr/local/etc/php.ini Scan this dir for additional .ini files => /usr/local/etc/php ``` * `Loaded Configuration File`のiniファイル * `Scan this dir for additional .ini files`のディレクトリにあるiniファイル のどちらかに`extension=pdo_mysql.so`がない場合は追記します。 自分はいつもpkgでインストールしているので、`/usr/local/etc/php/extensions.ini`に自動的に追記されます。 portsから入れた場合はもしかしたら追記されないかもしれません... ``` $ cat /usr/local/etc/php.ini | grep pdo $ find /usr/local/etc/php/ -name '*.ini' | xargs grep pdo /usr/local/etc/php/extensions.ini:extension=pdo.so /usr/local/etc/php/extensions.ini:extension=pdo_sqlite.so /usr/local/etc/php/extensions.ini:extension=pdo_mysql.so ←これがない場合使えない ``` PDO自体のエラーが出ないということは、pdo.soはロードされていると思われますので、`extension=pdo.so`が書かれている下の行あたりに`extension=pdo_mysql.so`を追記すれば使えるようになるかと思います。 ちなみにこの手のミドルウェアのハウツーはインストール方法やパスは違えど、CentOSやUbuntuのノウハウでもなんら変わりありませんので、食わず嫌いせず一応確認してみるとよいと思います。