You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP更新SQLite表触发错误8:尝试写入只读数据库

解决LightSail LAMP PHP8.1环境下SQLite写入只读数据库错误

问题核心原因

CLI运行正常但Apache环境下报错,本质是Apache进程没有数据库文件所在目录的写入权限——SQLite写入时除了需要数据库文件本身的权限,还需要所在目录的写入权限(用于生成WAL日志、临时文件等),你之前仅修改了文件权限,忽略了目录权限的要求。

具体解决方案

针对你的Bitnami环境(数据库路径为/home/bitnami/bot.db),执行以下操作:

  1. 调整数据库所在目录的权限
    先给/home/bitnami目录添加可写权限,确保Apache运行用户daemon能读写该目录:

    chmod 775 /home/bitnami
    

    或者将daemon用户加入bitnami用户组,继承目录权限:

    usermod -aG bitnami daemon
    

    执行完成后重启Apache服务:

    sudo /opt/bitnami/ctlscript.sh restart apache
    
  2. 修正SQLite打开模式(可选但推荐)
    你的代码仅使用SQLITE3_OPEN_READWRITE,若数据库文件意外丢失会直接报错,建议追加SQLITE3_OPEN_CREATE参数,确保文件不存在时自动创建:

    $db = new SQLite3('/home/bitnami/bot.db', SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
    
  3. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:25:50