最近、Mac OS X 10.6 Snow Leopard上でPHP5とSQLite3を動かしながら遊んでいます。以前までのエントリは、こちら。
- Mac OS X. 10.6 Snow LeopardでPHP5.3を動かしてみたよ。 - 大人になったら肺呼吸
- PHPのSQLite3クラスを使ってSQLite3を操作する - 大人になったら肺呼吸
- Mac OS X. 10.6 Snow Leopardで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
このため、phpスクリプトとデータベースファイルが格納されていたディレクトリの書き込み権限を777にしたら正しくinsertできるようになりました。
あとがき
ディレクトリのセキュリティが777の場合、ローカルで動かしている分には良いですが、外側に公開するときにはセキュリティ的にザルなので、なんらかのアクセス権を設定する必要があります。
この件は、以下のエントリを参考に別の機会に調べてみたいと思います。