返回

CodeIgniter 3 嵌套 foreach 中的多重输入选择问题及解决方法

mysql

解决 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 循环是遍历数组或对象的最佳选择,因为它允许轻松访问数组或对象的元素。