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

