CodeIgniter 3 嵌套 foreach 中的多重输入选择问题及解决方法
2024-03-12 11:22:45
解决 CodeIgniter 3 中嵌套 foreach 中多重输入选择问题
简介
在 CodeIgniter 3 中构建带有多重答案选择项的表单时,在使用嵌套 foreach 循环的情况下,可能会遇到数据保存问题。这是因为默认情况下,当提交表单时,每个输入的名称都会被覆盖,从而导致只保存最后一个输入的值。
问题
嵌套 foreach 循环中的多重输入选择
当在嵌套 foreach 循环中创建表单时,每个输入都会被分配相同的名称。这会导致仅保存最后一个输入的值,而其他选定的值将被覆盖。
解决方案
为每个输入设置唯一的名称
为了解决此问题,需要为每个输入设置唯一的名称。这可以通过在 foreach 循环中动态生成名称来实现,如下所示:
视图 (view)
foreach ($pertanyaan as $keyp) :
foreach ($jawaban as $keyj) :
if ($keyj->id_pertanyaan == $keyp->id_pertanyaan) :
<input type="radio" name="value_jawaban[<?php echo $keyp->id_pertanyaan . '_' . $keyj->id_jawaban ?>]" value="<?php echo $keyj->value_jawaban ?>">
endif;
endforeach;
endforeach;
通过在输入名称中添加问题的 ID 和答案 ID,我们为每个输入分配了唯一的名称。这确保了在提交表单时,每个选定的值都能正确保存。
控制器 (Controller)
在控制器中,我们需要将每个输入值提取到数组中,其中键是输入名称,值是选定的值。
$data = [];
foreach ($this->input->post('value_jawaban') as $key => $value) :
$data[] = [
'id_pertanyaan' => explode('_', $key)[0],
'id_jawaban' => explode('_', $key)[1],
'value_jawaban' => $value
];
endforeach;
模型 (Model)
在模型中,我们可以使用 insert_batch()
方法将数据插入数据库。
$this->db->insert_batch('table_name', $data);
结论
通过为每个输入设置唯一的名称,我们解决了 CodeIgniter 3 中嵌套 foreach 循环中多重输入选择的问题。这确保了在提交表单时,所有选定的值都能被正确保存。
常见问题解答
1. 为什么我需要为每个输入设置唯一的名称?
默认情况下,每个输入的名称都会被覆盖,从而导致仅保存最后一个输入的值。
2. 如何在视图中生成唯一的名称?
在 foreach 循环中,我们可以动态生成名称,其中包括问题的 ID 和答案 ID。
3. 如何在控制器中提取输入值?
我们可以遍历 $_POST
数据并使用数组来存储输入值,其中键是输入名称,值是选定的值。
4. 如何在模型中插入数据?
我们可以使用 insert_batch()
方法将数据批量插入数据库。
5. 为什么选择使用 foreach 循环而不是其他循环?
foreach 循环是遍历数组或对象的最佳选择,因为它允许轻松访问数组或对象的元素。