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

使用PHP更新SQLite数据库时更新操作无响应、记录不更新问题求助

问题根因

  • 更新逻辑中尝试从$_POST['id']获取记录ID,但表单内未设置ID对应的提交字段,仅在表单action的查询参数中携带了ID,$_POST数组不存在id键,导致$id为未定义变量,拼接进SQL后WHERE条件失效,执行逻辑异常。
  • UPDATE语句直接拼接$id变量,存在SQL注入风险,同时因$id取值异常会触发SQL执行错误,若关闭了服务端错误显示则会表现为页面卡顿后返回自定义错误。

修复步骤

  1. 首先在表单内部新增隐藏字段,提交记录ID:
<form action="<?php echo htmlentities($_SERVER['PHP_SELF'] . "?id=" . $r['id']); ?>" method="post">
    <!-- 新增隐藏ID字段 -->
    <input type="hidden" name="id" value="<?php echo htmlspecialchars($r['id']); ?>">

    <label for="sname">学生姓名</label>
    <input type="text" name="sname" required value="<?php echo htmlspecialchars($r['sname']); ?>">

    <label for="score">分数</label>
    <input type="number" name="score" required value="<?php echo htmlspecialchars($r['score']); ?>">

    <button type="submit" name="submit">提交</button>
</form>
  1. 修改更新逻辑的ID取值与SQL语句,增加参数绑定避免注入,同时将提示内容改为中文:
} else {
    try {
        // 过滤获取POST提交的ID,校验合法性
        $id = filter_input(INPUT_POST, "id", FILTER_VALIDATE_INT);
        if (!$id) {
            die("无效的记录ID");
        }

        $db = new PDO("sqlite:database.db");
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // 修改SQL,ID也使用参数绑定,不直接拼接
        $sql = "UPDATE students_tb SET sname = :sname, score = :score WHERE id = :id";
        $stat = $db->prepare($sql);

        $sname = filter_input(INPUT_POST, "sname");
        $stat->bindValue(":sname", $sname, PDO::PARAM_STR);

        $score = filter_input(INPUT_POST, "score");
        $stat->bindValue(":score", $score, PDO::PARAM_INT);
        
        // 绑定ID参数
        $stat->bindValue(":id", $id, PDO::PARAM_INT);
        
        $success = $stat->execute();

        if ($success) {
            echo "学生信息已更新到数据库。";
            echo "<p><a href='/'>返回首页</a></p>";
        } else {
            echo "学生信息更新失败。";
            echo "<p><a href='/'>返回首页</a></p>";
        }

        $db = null;

    } catch (PDOException $e) {
        print "出错:" . $e->getMessage() . "<br>";
        die();
    }
}
  1. (可选)将原有查询逻辑中的提示也改为中文:
// 检查数组内容
if (!$r) {
    echo "未找到对应记录";
} else {
    echo "已找到记录";
}

内容的提问来源于stack exchange,提问作者erlango3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:15:05