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
相关产品推荐
相关产品推荐

