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

如何实现数据库已有数据的数值累加更新?附代码示例

实现数据库数值累加更新的正确方法

你的需求是把提交的数值和数据库中已有的inhouse字段值相加,再更新回数据库,原代码存在几个关键问题,下面直接给你修正方案:

原代码的核心问题

  • 更新脚本里用的$in变量仅在HTML列表循环中存在,表单提交时并未传到后端,SQL语句无法执行正确累加
  • 直接将用户输入变量拼入SQL,存在严重SQL注入漏洞,易被攻击篡改数据
  • 未对提交的数量做合法性校验,无法阻止负数、非数字等无效数据

正确实现方式

让数据库自行完成累加操作(原子操作,可避免并发更新问题),同时用预处理语句防止注入,具体如下:

修正后的PHP更新脚本

include("../../connection.php");

if(isset($_POST['update'])){
    // 过滤并校验提交的数据
    $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
    $new_quantity = filter_input(INPUT_POST, 'quantity', FILTER_VALIDATE_INT);

    // 验证数据合法性
    if($id === false || $new_quantity === false || $new_quantity < 0){
        $_SESSION['error'] = "请输入有效的非负整数数量";
        header("location: ../stocks.php");
        exit;
    }

    // 使用预处理语句执行累加更新
    $sql = "UPDATE inv_tbl SET inhouse = inhouse + ? WHERE id = ?";
    $stmt = mysqli_prepare($connections, $sql);
    // 绑定参数:i代表整数类型
    mysqli_stmt_bind_param($stmt, "ii", $new_quantity, $id);
    mysqli_stmt_execute($stmt);

    addLog($connections,"Added a stock");
    header("location: ../stocks.php");
    exit;
}

关键说明

  1. 数据库端累加:SQL语句inhouse = inhouse + ?让MySQL直接取出当前行的inhouse值,与提交的数量相加后更新,无需提前查询旧值,高效且避免并发冲突
  2. 预处理语句:通过mysqli_prepare和mysqli_stmt_bind_param绑定参数,彻底杜绝SQL注入风险
  3. 数据校验:用filter_input验证ID和数量是否为合法整数,且数量非负,避免无效数据进入数据库

HTML部分优化(可选)

你的HTML代码无需大改,可给数量输入框添加默认值0,提升用户体验:

<input class="form-control" min="0" type="number" name="quantity" value="0">

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:36:32