如何实现数据库已有数据的数值累加更新?附代码示例
实现数据库数值累加更新的正确方法
你的需求是把提交的数值和数据库中已有的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; }
关键说明
- 数据库端累加:SQL语句
inhouse = inhouse + ?让MySQL直接取出当前行的inhouse值,与提交的数量相加后更新,无需提前查询旧值,高效且避免并发冲突 - 预处理语句:通过
mysqli_prepare和mysqli_stmt_bind_param绑定参数,彻底杜绝SQL注入风险 - 数据校验:用
filter_input验证ID和数量是否为合法整数,且数量非负,避免无效数据进入数据库
HTML部分优化(可选)
你的HTML代码无需大改,可给数量输入框添加默认值0,提升用户体验:
<input class="form-control" min="0" type="number" name="quantity" value="0">
内容的提问来源于stack exchange,提问作者ucduke
相关产品推荐
相关产品推荐

