小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


SQLite3のexec関数でattempt to write a readonly databaseのエラーが出る件

最近、Mac OS X 10.6 Snow Leopard上でPHP5とSQLite3を動かしながら遊んでいます。以前までのエントリは、こちら。

今日は、PHPで作成したWeb画面からSQLite3にデータを挿入しようとしてつまづきました。

SQLite3::exec関数でattempt to write a readonly databaseのエラー

SQLite3クラスのexec関数でSQLのinsert文を実行したら、次のようなエラーになりました。

Warning: SQLite3::exec() [sqlite3.exec]: attempt to write a readonly database in ファイル名

どうやら、データベースファイルへの書き込み権がないことが原因のようです。
データベースファイル(hoge.db)のアクセス件を777にして、再度実行すると、今度は別のエラーになりました。

SQLite3::exec関数でunable to open database fileのエラー

Warning: SQLite3::exec() [sqlite3.exec]: unable to open database file in ファイル名

ネットで調べてみると、データベースファイルが格納されているディレクトリの書き込み権がないと上記のようなエラーになるようです。

いろいろやってたらどうも読めるけど書けない,ということに気づきました。も,もしや,と思って「データベースファイルを置いてあるディレクトリ」の書き込み属性を on にしたら OK になりました。

どういうことかざっくり書くと,

drwxr-xr-x dbdir/
drwxrwxrwx dbdir/target.db

というように,データベースファイルの書き込み権限だけで安心してちゃだめで,

drwxrwxrwx dbdir/
drwxrwxrwx dbdir/target.db
SQLite が unable to open database file で困った - daily dayflower はてなブックマーク - SQLite が unable to open database file で困った - daily dayflower

このため、phpスクリプトとデータベースファイルが格納されていたディレクトリの書き込み権限を777にしたら正しくinsertできるようになりました。

あとがき

ディレクトリのセキュリティが777の場合、ローカルで動かしている分には良いですが、外側に公開するときにはセキュリティ的にザルなので、なんらかのアクセス権を設定する必要があります。
この件は、以下のエントリを参考に別の機会に調べてみたいと思います。