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

Laravel中多选框关联数量输入值存入数据库异常问题排查

问题:多选框与数量输入值不匹配的异常问题

我正在尝试将数据插入数据库,功能基本可用,但存在异常:仅勾选第二个多选框时,其对应的数量输入值会取第一个输入框的默认值,而非实际填写的数值。

表单代码

<form action="{{url('/reservation')}}" method="post">
    @csrf
    <div class="row col-12">
        <div>
            <p class='mybox text-dark'><input type="checkbox" name="prod_name[]" value="JasminBooks"/>JasminBooks</p>
        </div>
        <div>
            <input type="number" name="prod_qty[]" min="1" value="1" class="form-control ml-2">
        </div>
    </div>
    <div class="row col-12">
        <div>
            <p class='mybox text-dark'><input type="checkbox" name="prod_name[]" value="KnowHowBooks"/>KnowHowBooks</p>
        </div>
        <div>
            <input type="number" name="prod_qty[]" min="1" value="1" class="form-control ml-2">
        </div>
    </div>
</form>

控制器函数代码

public function reservation(Request $request)
{
    $data = new reservation;
    $data->name = $request->name;
    $data->email = $request->email;
    $data->phone = $request->phone;
    $data->address = $request->address;
    $data->date = $request->date;
    $data->time = $request->time;

    $products = null;
    $checked_array = $_POST['prod_name'];

    foreach($_POST['prod_name'] as $key => $value) {
        if (in_array($_POST['prod_name'][$key], $checked_array)) {
            $products .= $_POST['prod_qty'][$key]." ".$_POST['prod_name'][$key].", ";
        }
    }

    $data->products = $products;
    $data->save();
    return redirect()->back();
}

测试情况

  • 仅勾选第一个多选框,输入数量5,数据库存入“5 JasminBooks, ”,正常;
  • 勾选两个多选框,分别输入数量12和7,数据库存入“12 JasminBooks, 7 KnowHowBooks, ”,正常;
  • 仅勾选第二个多选框,输入数量13,数据库却存入“1 KnowHowBooks, ”,错误取了第一个输入框的默认值。

问题原因

当只勾选第二个复选框时,prod_name[]数组只会提交一个元素,键为0;但两个数量输入框都会提交值(即使第一个没勾选,输入框的默认值1也会被提交),所以$_POST['prod_qty'][0]对应第一个输入框的默认值,而非第二个输入框的实际填写值,导致匹配错位。

修改方案

1. 修改表单代码:给产品和数量设置对应索引

给每个prod_name和prod_qty设置明确的相同索引,确保提交时一一对应:

<form action="{{url('/reservation')}}" method="post">
    @csrf
    <div class="row col-12">
        <div>
            <p class='mybox text-dark'><input type="checkbox" name="prod_name[0]" value="JasminBooks"/>JasminBooks</p>
        </div>
        <div>
            <input type="number" name="prod_qty[0]" min="1" value="1" class="form-control ml-2">
        </div>
    </div>
    <div class="row col-12">
        <div>
            <p class='mybox text-dark'><input type="checkbox" name="prod_name[1]" value="KnowHowBooks"/>KnowHowBooks</p>
        </div>
        <div>
            <input type="number" name="prod_qty[1]" min="1" value="1" class="form-control ml-2">
        </div>
    </div>
</form>

2. 修改控制器代码:通过索引匹配产品和数量

使用Laravel的$request->input()方法,通过选中产品的索引获取对应数量,避免错位:

public function reservation(Request $request)
{
    $data = new reservation;
    $data->name = $request->name;
    $data->email = $request->email;
    $data->phone = $request->phone;
    $data->address = $request->address;
    $data->date = $request->date;
    $data->time = $request->time;

    $products = '';
    // 获取选中的产品(带索引)
    $selectedProducts = $request->input('prod_name', []);
    
    foreach($selectedProducts as $key => $productName) {
        // 通过相同索引获取对应数量,默认值设为1
        $qty = $request->input('prod_qty.' . $key, 1);
        $products .= $qty . " " . $productName . ", ";
    }

    // 去掉末尾多余的逗号和空格(优化存储格式)
    $products = rtrim($products, ', ');
    
    $data->products = $products;
    $data->save();
    return redirect()->back();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:01:26