登录用户更新Tempahan表数据时,同user_id关联的所有记录被同时更新的异常问题求助
问题排查与解决
这个问题的核心原因很明确:你的更新SQL语句只通过user_id过滤记录,而同一个用户的user_id会关联多条tempahan表的记录,执行这条SQL时自然会把所有属于该用户的预订记录全部修改,而非你目标的那一条。
修复步骤:
传递目标记录的主键ID
你需要在编辑表单里添加一个隐藏字段,把要修改的那条记录的tempahan_id(也就是表的主键)传递到后端。比如在显示预订列表的编辑按钮对应的表单里:<!-- 假设$row是从数据库取出的当前记录数据 --> <input type="hidden" name="tempahan_id" value="<?php echo $row['tempahan_id']; ?>">这样提交更新请求时,
$_POST里就会包含这条记录的唯一标识。修改SQL的WHERE条件
更新语句需要同时用tempahan_id(定位唯一记录)和user_id(防止用户越权修改他人记录)作为过滤条件:// 先获取表单传递的目标记录ID $tempahan_id = $_POST["tempahan_id"]; // 修正后的SQL $sql = "UPDATE TEMPAHAN SET noPhone = '$noPhone', alamat = '$alamat', daerah = '$daerah', negeri = '$negeri', poskod = '$poskod', tajuk = '$tajuk', anjuran = '$anjuran' , tarikh = '$tarikh', masa = '$masa' WHERE tempahan_id = '$tempahan_id' AND user_id = '$user_id'";紧急修复:解决SQL注入风险
你现在直接把用户输入拼进SQL的写法存在严重的SQL注入漏洞,哪怕是临时用mysqli,也必须改用预处理语句:// 预处理语句示例(更安全) $stmt = $conn->prepare("UPDATE TEMPAHAN SET noPhone = ?, alamat = ?, daerah = ?, negeri = ?, poskod = ?, tajuk = ?, anjuran = ?, tarikh = ?, masa = ? WHERE tempahan_id = ? AND user_id = ?"); // 绑定参数:"sssssssssis"对应参数类型,s=字符串,i=整数 $stmt->bind_param("sssssssssis", $noPhone, $alamat, $daerah, $negeri, $poskod, $tajuk, $anjuran, $tarikh, $masa, $tempahan_id, $user_id); $stmt->execute(); if($stmt->affected_rows > 0){ echo "<meta http-equiv=\"refresh\"content=\"2;URL=senaraiTempahan.php\" />"; } else { echo "Update failed"; } $stmt->close();
额外验证建议
- 提交表单后可以用
var_dump($_POST)检查是否正确获取到了tempahan_id参数; - 可以对
tempahan_id做简单的合法性校验(比如判断是否为正整数),避免无效参数导致的错误。
内容的提问来源于stack exchange,提问作者nerdgirl
相关产品推荐
相关产品推荐

