使用PHP更新SQLite表触发错误8:尝试写入只读数据库
解决LightSail LAMP PHP8.1环境下SQLite写入只读数据库错误
问题核心原因
CLI运行正常但Apache环境下报错,本质是Apache进程没有数据库文件所在目录的写入权限——SQLite写入时除了需要数据库文件本身的权限,还需要所在目录的写入权限(用于生成WAL日志、临时文件等),你之前仅修改了文件权限,忽略了目录权限的要求。
具体解决方案
针对你的Bitnami环境(数据库路径为/home/bitnami/bot.db),执行以下操作:
调整数据库所在目录的权限
先给/home/bitnami目录添加可写权限,确保Apache运行用户daemon能读写该目录:chmod 775 /home/bitnami或者将
daemon用户加入bitnami用户组,继承目录权限:usermod -aG bitnami daemon执行完成后重启Apache服务:
sudo /opt/bitnami/ctlscript.sh restart apache修正SQLite打开模式(可选但推荐)
你的代码仅使用SQLITE3_OPEN_READWRITE,若数据库文件意外丢失会直接报错,建议追加SQLITE3_OPEN_CREATE参数,确保文件不存在时自动创建:$db = new SQLite3('/home/bitnami/bot.db', SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);修复SQL注入风险(重要)
当前代码直接拼接变量生成SQL语句,存在严重的SQL注入漏洞,改用参数绑定的安全写法:$db = new SQLite3('/home/bitnami/bot.db', SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE); // 使用预处理语句绑定参数 $stmt = $db->prepare('INSERT INTO users VALUES (:id, :platform, :name, :chatId, false)'); $stmt->bindValue(':id', $id, SQLITE3_TEXT); $stmt->bindValue(':platform', $platform, SQLITE3_TEXT); $stmt->bindValue(':name', $name, SQLITE3_TEXT); $stmt->bindValue(':chatId', $chatId, SQLITE3_TEXT); $stmt->execute(); $err = $db->LastErrorCode(); logLine("Error code: " . $err);
内容的提问来源于stack exchange,提问作者user1617735
相关产品推荐
相关产品推荐

