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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:40:15