ちょっとハマったPHP/PDOでのSQLite操作
小さな仕事でSQLiteを使う事になりそうになり、事前調査をしていてハマったので、まとめておく。
先ず、SQLiteのデータベースは、PHPで作成できる。勿論PDOでも作成できる。
手元でコードを作成し、仮のサーバにアップロードしてみると、pdo_sqliteはあるものの、sqliteのPHPモジュールがない事が判明。
pecl install sqlite
としてインストールしようとしたら、makeの途中でコケる。調べてみると以下のページがヒットした。
http://www.mone.jp/mt/linux/2006/04/fedora_5_phpsqlite.html
/tmp以下にダウンロードされているので、そこで以下の様にソースを修正、configure/make/make installした。
修正箇所は、以下をコメントアウトし、
static unsigned char arg3_force_ref[] = {3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
function_entry sqlite_functions[] = { PHP_FE(sqlite_open, arg3_force_ref) PHP_FE(sqlite_popen, arg3_force_ref)
を以下に変更する。
function_entry sqlite_functions[] = { PHP_FE(sqlite_open, third_arg_force_ref) PHP_FE(sqlite_popen, third_arg_force_ref)
上のページでは書かれていないが、php.iniに
extension=sqlite.so
を追記してApacheを再起動すれば、
if (!extension_loaded("sqlite")) { dl("sqlite.so"); }
をする必要は無い。
さて、拡張モジュールを入れたし、さあ大丈夫だろうとPDOからアクセスしてみると、PDO->prepare()でコケる。エラーメッセージを読むと、
Fatal error: Call to a member function bindValue() on a non-object...
との事なので、SQLがSQLiteじゃ通らないのかと思って手元で試してみるが、特に問題なく動く。
更に調べてみると以下のページがヒットした。
[PHP][SQLite] SQLiteのデータベースには複数の形式があり、ドライバが対応できていなければ扱えない。 - SumiTomohikoの日記
非常に細かく調べているので長いが、要するに「PDOとSQLiteの扱えるバージョンが違う」という事らしい。
実は最初にSQLiteのファイルを作成した際に、少しは考えて、リモートでファイルを作成していたりしたのだが、sqliteのコマンドをPHPで直接作成していた。しかし、その後はPDOからのアクセスだったので、エラーが起きてしまったのだった。
という風にすべしという事らしい。まぁ今更直接sqliteの関数を使う必要はないと思うけどね。
勉強にはなったけど、本番サーバはPHPもバージョン4系らしいし(サポート切れもある事だし)、MySQLもあるんだけど、DB増やすとお金かかるとか、DBユーザ増やせないっぽいとか(他のプログラムと衝突したりとかイヤ)、しょっぱいサーバ使わないで欲しいなぁなんて。ああ・・書いてて気が付いたけど、PDO使えないのか。Adminpanelっていう、PHP5の機能を使えるページは調べておいたけど。