CodeIgniter新手求助:仅插入选中的考勤复选框数据到数据库
解决CodeIgniter考勤数据仅插入勾选员工的问题
我明白你遇到的问题了——现在不管有没有勾选考勤,所有员工的数据都会被插入数据库,这是因为你的代码在遍历所有员工,而不是只处理被勾选的那些。下面是具体的解决步骤:
1. 调整视图:让表单字段与员工SN关联
首先要修改视图代码,让每个考勤复选框、备注和位置字段都绑定到对应的员工SN,这样提交后我们能区分哪些员工被勾选了。修改后的视图片段如下:
<?php $no=1; foreach($employee AS $list_emp) { $sn = $list_emp->sn; ?> <tr> <td><?= $no ?></td> <td><input type="hidden" name="employee[<?= $sn ?>]" value="<?= $sn ?>"><?= $list_emp->name; ?></td> <td><?= $list_emp->position; ?></td> <?php foreach ($attend_detail AS $list) {?> <td><input type="checkbox" name="detail[<?= $sn ?>]" value="<?= $list['details'] ?>"></td> <?php } ?> <td><input type="text" name="note[<?= $sn ?>]"></td> <input type="hidden" name="location[<?= $sn ?>]" value="<?= $list_emp->branch; ?>"> </tr> <?php $no++;} ?>
这里的核心改动是把表单字段的name属性从普通数组(比如detail[])改成以员工SN为键的关联数组(比如detail[<?= $sn ?>]),这样提交后,只有被勾选的员工会出现在detail数组里,且键就是员工的SN。
2. 修改控制器:只处理被勾选的员工数据
接下来调整控制器的add_attend()函数,不再遍历所有员工,而是直接遍历被勾选的detail数组,这样就能只插入选中的考勤记录:
function add_attend() { $employee = $this->input->post('employee'); $location = $this->input->post('location'); $detail = $this->input->post('detail'); $note = $this->input->post('note'); $errors = []; if (empty($detail)) { $errors['detail'] = 'Please select at least one attendance record'; } if (!empty($errors)){ $info['success'] = false; $info['errors'] = $errors; } else { // 遍历所有被勾选的员工($sn是员工编号,$stat是考勤状态) foreach ($detail as $sn => $stat) { $data = array( 'sn' => $sn, 'lab' => $location[$sn], 'stat' => $stat, 'note' => !empty($note[$sn]) ? $note[$sn] : '' // 处理空备注的情况 ); $this->m_human_capital->insert_attend($data); } $info['success'] = true; } $this->output->set_content_type('application/json')->set_output(json_encode($info)); }
关键说明:
$detail数组现在是关联数组,键是员工SN,值是选中的考勤状态,所以遍历它就能精准获取所有需要插入的员工。- 我们通过SN直接从
location和note数组中获取对应员工的信息,确保数据匹配。
3. 模型无需修改
你的insert_attend()模型函数已经能正常插入单条数据,不需要做任何改动。
这样调整后,只有被勾选考勤的员工数据会被插入数据库,完美解决你的问题!
内容的提问来源于stack exchange,提问作者Mardino Ismail
相关产品推荐
相关产品推荐

