HTML属性名重复时更新MySQL单条或多条指定行
解决PHP更新MySQL多行数据失败的问题
我看到你在尝试更新MySQL多行数据时遇到了困扰,咱们一步步拆解问题,找到解决方案:
1. 最核心的错误:隐藏字段未正确输出ID值
你的modal.php里,隐藏输入框的value属性漏掉了echo,导致recipe_id没有被正确传递到后端:
// 错误写法:没有输出值 <input type="hidden" name="recipe_id[]" value="<?php $row2['recipe_id']; ?>" readonly>
修改成下面这样,确保ID值被正确输出:
// 正确写法:添加echo输出ID <input type="hidden" name="recipe_id[]" value="<?php echo $row2['recipe_id']; ?>" readonly>
这是导致更新失败的关键原因——后端拿到的$_POST['recipe_id']数组是空的,UPDATE语句找不到对应的行。
2. 修复严重的SQL注入漏洞
你当前直接把用户输入拼到SQL语句里,存在极高的安全风险,必须改用预处理语句。同时预处理语句也能避免数据类型不匹配的问题,修改后的PHP更新代码如下:
// 先校验POST数据是否存在 if(isset($_POST['recipe_id'], $_POST['hardware'], $_POST['action'])){ $rid = $_POST['recipe_id']; $recipe_hardware = $_POST['hardware']; $recipe_action = $_POST['action']; // 遍历每个要更新的条目 foreach ($rid as $key => $id) { // 确保对应索引的硬件和动作值存在 if(!isset($recipe_hardware[$key], $recipe_action[$key])){ $this->errors[] = "缺少食谱ID: $id 的对应数据"; continue; } // 预处理SQL语句 $sql = "UPDATE recipes SET recipe_hardware = ?, recipe_action = ? WHERE recipe_id = ?"; $stmt = $this->db_connection->prepare($sql); // 绑定参数:s=字符串,i=整数(如果recipe_id是整数类型,把最后一个s改成i) $stmt->bind_param("ssi", $recipe_hardware[$key], $recipe_action[$key], $id); // 执行更新并反馈结果 if($stmt->execute()){ $this->messages[] = "食谱ID $id 更新成功"; } else { $this->errors[] = "更新食谱ID $id 失败: " . $stmt->error; } $stmt->close(); } } else { $this->errors[] = "未收到更新数据"; }
3. 额外的排查小技巧
- 打开浏览器开发者工具的「Network」标签,查看表单提交时的参数,确认
recipe_id[]、hardware[]、action[]三个数组的长度一致,且每个索引对应的值正确。 - 确认
recipe_id是recipes表的主键,并且数据类型匹配(比如是整数的话,绑定参数时用i而不是s)。 - 测试时可以临时在循环里输出生成的SQL语句(仅用于调试),检查WHERE条件的ID是否正确。
按照上面的修改,应该就能成功更新指定的MySQL行了。
内容的提问来源于stack exchange,提问作者Qusai
相关产品推荐
相关产品推荐

