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

SQL Array Dublicates:PHP循环更新时多输入值全变为相同值问题

问题成因
  • 取值逻辑错误:代码中用来写入数据库的$earnval错误读取了隐藏域数组$_POST['eid'][$i],完全没有获取前端输入的earn[]数组里的A、B、C值。
  • 更新范围错误:UPDATE语句的筛选条件仅为empid='$empid',每次循环都会覆盖该员工ID对应的所有收入记录,三次循环依次把所有关联记录改为A、B、C,最终全部保留最后一次写入的C值,因此出现全C的故障。
  • 变量类型处理错误:$_POST['eid']是数组格式,直接用trim(strip_tags($_POST['eid']))处理数组会返回空值或抛出类型错误,无法拿到正确的员工ID用于条件筛选。
  • 预处理使用不规范:调用了prepare()方法但直接拼接SQL变量,完全没有起到防注入的作用,存在严重的SQL注入风险。
修复方案

首先明确业务逻辑:前端每行的earn输入值和对应行的eid隐藏值是一一对应的,更新时需要用单条eid作为筛选条件,仅更新当前行对应的收入数据。修正后的代码如下:

include "settings/config.php";
// 关联遍历收入数组,通过索引匹配对应行的eid
foreach ($_POST['earn'] as $index => $earnVal) {
    $earnVal = trim($earnVal);
    $rowEid = trim($_POST['eid'][$index] ?? '');
    // 空值直接跳过不处理
    if (empty($earnVal) || empty($rowEid)) {
        continue;
    }
    // 预处理+参数绑定,避免SQL注入
    $updateStmt = $conn->prepare("UPDATE `emp_ern_cart` SET earnings = ? WHERE eid = ?");
    $updateStmt->execute([$earnVal, $rowEid]);
    echo "第{$index}条数据更新成功";
}

注意:如果你的emp_ern_cart表中对应行唯一标识的字段名不是eid,请将UPDATE语句中的WHERE eid = ?替换为实际字段名。
核心修改点:

  • 改用foreach关联遍历,通过索引保证每行的收入值和行ID一一对应,不会出现取值错位
  • 修正筛选条件,用单条记录的行ID作为更新条件,只会修改当前行的记录,不会覆盖其他行数据
  • 修正取值逻辑,收入值直接取前端输入的earn[]数组对应值
  • 预处理改用参数绑定,彻底规避SQL注入风险
  • 增加参数存在性校验,避免数组下标不存在导致的报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:36:04