CodeIgniter多行插入实现:问卷视图多行数据(no_soal与jawaban)提交
在CodeIgniter中实现问卷多行题目与答案的批量插入
嘿,我来帮你搞定这个问卷多行数据插入的问题!下面一步步给你拆解实现方案:
第一步:完善你的视图代码
先把你给出的视图片段补全,确保每个题目对应的no_soal和jawaban能正确关联。这里分两种情况处理:
情况1:单选问卷(推荐)
如果是单选类型,把checkbox改成radio,并给每个题目对应的答案组设置统一的命名jawaban[题目编号],避免提交时数据混乱:
<form method="post" action="<?= base_url('survey/submit') ?>"> <table> <!-- 题目1 --> <tr> <td>1</td> <td> <input type="hidden" value="1" name="no_soal[]"> apakah anda sehat </td> <td><input type="radio" value="-5" name="jawaban[1]" required></td> <td><input type="radio" value="-3" name="jawaban[1]" required></td> <td><input type="radio" value="-1" name="jawaban[1]" required></td> <td><input type="radio" value="1" name="jawaban[1]" required></td> <td><input type="radio" value="3" name="jawaban[1]" required></td> <td><input type="radio" value="5" name="jawaban[1]" required></td> </tr> <!-- 题目2 --> <tr> <td>2</td> <td> <input type="hidden" value="2" name="no_soal[]"> apakah anda tidur nyenyak </td> <td><input type="radio" value="-5" name="jawaban[2]" required></td> <td><input type="radio" value="-3" name="jawaban[2]" required></td> <td><input type="radio" value="-1" name="jawaban[2]" required></td> <td><input type="radio" value="1" name="jawaban[2]" required></td> <td><input type="radio" value="3" name="jawaban[2]" required></td> <td><input type="radio" value="5" name="jawaban[2]" required></td> </tr> <!-- 更多题目以此类推 --> <tr> <td colspan="8"> <button type="submit" name="submit">Kirim Jawaban</button> </td> </tr> </table> </form>
情况2:多选问卷
如果是多选,把答案命名改成jawaban[题目编号][],这样每个题目会提交一个答案数组:
<input type="checkbox" value="-5" name="jawaban[1][]"> <input type="checkbox" value="-3" name="jawaban[1][]"> <!-- 其他选项同理 -->
第二步:控制器处理提交数据
在你的控制器(比如Survey.php)里创建提交处理方法,整理表单数据后传给模型:
public function submit() { if ($this->input->post('submit')) { // 获取提交的题目编号和答案 $no_soal_list = $this->input->post('no_soal'); $jawaban_list = $this->input->post('jawaban'); // 整理批量插入的数据 $insert_data = []; foreach ($no_soal_list as $no_soal) { // 单选情况:直接取对应答案 $jawaban = isset($jawaban_list[$no_soal]) ? $jawaban_list[$no_soal] : null; // 多选情况:把答案数组转成逗号分隔的字符串存储 // $jawaban = isset($jawaban_list[$no_soal]) ? implode(',', $jawaban_list[$no_soal]) : null; if ($jawaban !== null) { $insert_data[] = [ 'no_soal' => $no_soal, 'jawaban' => $jawaban, 'created_at' => date('Y-m-d H:i:s') // 可选:添加提交时间 ]; } } // 调用模型插入数据 if (!empty($insert_data)) { $this->load->model('Survey_model'); $is_success = $this->Survey_model->save_batch_answers($insert_data); if ($is_success) { $this->session->set_flashdata('success', 'Jawaban berhasil disimpan!'); redirect('survey/thankyou'); } else { $this->session->set_flashdata('error', 'Terjadi kesalahan saat menyimpan data'); redirect('survey'); } } else { $this->session->set_flashdata('error', 'Silakan isi jawaban terlebih dahulu'); redirect('survey'); } } else { redirect('survey'); } }
第三步:模型实现批量插入
创建Survey_model.php模型,利用CodeIgniter的insert_batch方法高效批量插入:
class Survey_model extends CI_Model { public function __construct() { parent::__construct(); $this->load->database(); } // 批量插入问卷答案 public function save_batch_answers($data) { // 假设你的数据库表名为survey_jawaban return $this->db->insert_batch('survey_jawaban', $data); } }
关键注意事项
- 数据库表
survey_jawaban需要包含no_soal(题目编号)、jawaban(答案)字段,建议添加自增主键id和时间字段created_at。 - 多选场景下,未选中的checkbox不会被提交,你可以在控制器里给未作答的题目设置默认值(比如
0),或者跳过插入。 - 可以结合CodeIgniter的表单验证类,添加必填项校验,让逻辑更严谨。
内容的提问来源于stack exchange,提问作者Mukhammad Arifin
相关产品推荐
相关产品推荐

