PHPからSQLite3のDB処理時にエラー発生

PHPからSQLite3のDBファイル処理時に「SQLSTATE[HY000]: General error: 8 attempt to write a readonly database, referer:〜」というエラーが発生したので、その時の調査内容を簡単にまとめています。

※ 本ページはプロモーションが含まれています。

このページの目的と動作環境

最終更新日:2023/5/24

Webサーバ(Apache + PHPという構成)でPHPからSQLite3のファイルDBを使っていたのですが、ある時SQLite3のファイルを変更したらエラーが発生して正常に動作しなくなってしまったので、その時調査した事と解決方法について書いています。

◾️動作環境とバージョン情報です
OS:CentOS7
Apache:2.4
PHP:7.4

エラー内容・調査とエラーメッセージと、SQLite3のDBファイルに書き込み権限を追加

訳あってSQLite3のDBファイルを変更したら、PHPからSQLite3へのDB処理時にエラーが発生するようになりました。(サーバのターミナル上でsqlite3コマンドでSQLite3のファイルDBに接続して、DBのデータを見たり(select)書き込んだり(insert)はできる。)

具体的にはPHPからSQLite3にデータを書き込む処理、つまりInsert SQLが実行された時にエラーが発生しているようで、PHPでSQLite3処理時に例外が発生したらログファイルにエラーログを残すようにしていました。

その時の簡略化したPHPのコードです。

try {
  //SQLite3接続処理コードは省略
  〜
  //insertクエリの実行
  $stmt = $pdo->prepare("insert into hogetable(〜) values (〜)");
  $stmt->execute([〜]);
  〜
} catch (Exception $e) {
  //エラーログファイル(/var/log/httpd/error_log)へ出力
  error_log("[insert hogetable error!] ". $e->getMessage(), 0);
}

私の環境ではログファイルの/var/log/httpd/error_logに出力するようになっていて、このログファイルの中を見たらそれっぽいエラーメッセージを発見。

〜
[insert hogetable error!] SQLSTATE[HY000]: General error: 8 attempt to write a readonly database, referer: 
〜
ん?なんか"readonly database"と書いてあるね。どうやらSQlite3のDBファイルが読み込み専用になってるみたいです。

SQLite3のDBファイルのパーミッション(アクセス権)を確認してみたら、確かにその他ユーザーの権限が読み込みだけになっていました。

$ ls -lht
-rw-r--r-- 1 hogeuser hogeuser 16K  5月 24 16:21 hogedb.sqlite3
という事で、chmondコマンドでその他ユーザグループに書き込み権限も追加します。
$ chmod 646 hogedb.sqlite3
再度パーミッションの確認。
$ ls -lht
-rw-r--rw- 1 hogeuser hogeuser 16K  5月 24 16:26 hogedb.sqlite3

これでPHPからの動作確認をしたら、正常に動作するようになりました!