ちょっとハマったPHP/PDOでのSQLite操作

小さな仕事でSQLiteを使う事になりそうになり、事前調査をしていてハマったので、まとめておく。


先ず、SQLiteのデータベースは、PHPで作成できる。勿論PDOでも作成できる。
手元でコードを作成し、仮のサーバにアップロードしてみると、pdo_sqliteはあるものの、sqlitePHPモジュールがない事が判明。

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...

との事なので、SQLSQLiteじゃ通らないのかと思って手元で試してみるが、特に問題なく動く。

更に調べてみると以下のページがヒットした。

[PHP][SQLite] SQLiteのデータベースには複数の形式があり、ドライバが対応できていなければ扱えない。 - SumiTomohikoの日記

非常に細かく調べているので長いが、要するに「PDOとSQLiteの扱えるバージョンが違う」という事らしい。

実は最初にSQLiteのファイルを作成した際に、少しは考えて、リモートでファイルを作成していたりしたのだが、sqliteのコマンドをPHPで直接作成していた。しかし、その後はPDOからのアクセスだったので、エラーが起きてしまったのだった。

  • PDOでアクセスするなら、PDOからDBファイルを作成
  • sqliteでアクセスするならsqliteからDBファイルを作成

という風にすべしという事らしい。まぁ今更直接sqliteの関数を使う必要はないと思うけどね。


勉強にはなったけど、本番サーバはPHPもバージョン4系らしいし(サポート切れもある事だし)、MySQLもあるんだけど、DB増やすとお金かかるとか、DBユーザ増やせないっぽいとか(他のプログラムと衝突したりとかイヤ)、しょっぱいサーバ使わないで欲しいなぁなんて。ああ・・書いてて気が付いたけど、PDO使えないのか。Adminpanelっていう、PHP5の機能を使えるページは調べておいたけど。