CodeIgniter执行查询获取学生科目总分后如何在视图中正确输出
CodeIgniter 科目总分统计展示修正方案
现有代码核心问题
- 模型中
$this->db->get()方法传入了字段参数$totField,而非需要查询的表名$table,导致查询直接报错 - 视图中直接执行数据库查询不符合MVC规范,且直接输出查询结果对象而非查询结果值,无法正常展示分数
- 缺少空值判断,无匹配数据时会抛出PHP错误
第一步:修正模型代码
public function SubjectTotal($subject_id,$class_id,$section_id,$session_id,$table,$totField) { $this->db->select_sum($totField, 'total_score'); $this->db->where('subject_id', $subject_id); $this->db->where('class_id', $class_id); $this->db->where('section_id', $section_id); $this->db->where('session_id', $session_id); $this->db->group_by('subject_id'); $query = $this->db->get($table); // 空值判断,无数据返回0 if($query->num_rows() > 0){ return $query->row()->total_score; } return 0; }
第二步:调整控制器逻辑
不要单独封装返回总分的控制器方法,直接在加载成绩页的方法中预计算所有科目的总分,统一传入视图:
public function marksheet() { // 从请求/SESSION获取筛选参数,根据实际业务调整取值逻辑 $class_id = $this->input->post('class_id'); $section_id = $this->input->post('section_id'); $session_id = $this->session->userdata('current_session_id'); $table = '你的成绩表实际表名'; $totField = '你要统计的分数字段实际名称'; // 获取当前班级所有科目列表,该方法需自行实现查询科目表 $subject_list = $this->student_model->get_class_subjects($class_id); $subject_score_map = []; // 循环计算每个科目的总分 foreach($subject_list as $subject){ $subject_score_map[$subject['subject_id']] = $this->student_model->SubjectTotal( $subject['subject_id'], $class_id, $section_id, $session_id, $table, $totField ); } // 把数据传入视图 $data['subject_list'] = $subject_list; $data['subject_score_map'] = $subject_score_map; $this->load->view('studentview', $data); }
第三步:修正视图代码
视图中仅做数据渲染,不要写任何数据库查询逻辑:
<table> <?php foreach($subject_list as $sub): ?> <tr> <td style="border: 1px solid black;font-size:12px;width:5px;white-space: nowrap;"></td> <td style="border: 1px solid black;font-size:12px;width:30px;text-align:left;"><?php echo $sub['subject_name'];?></td> <td style="border: 1px solid black;font-size:12px;width:30px;text-align:center;"> <?php echo $subject_score_map[$sub['subject_id']];?> </td> </tr> <?php endforeach; ?> </table>
注意事项
- 所有传入查询的参数建议做合法性校验,避免SQL注入风险,CI查询构造器自带参数绑定,不要手动拼接SQL字符串
- 表名、字段名请替换为你业务中的实际值
- 如果只需要查询单个科目的总分,可直接在控制器中计算后传给视图,不需要循环遍历
内容的提问来源于stack exchange,提问作者MaryPebbles
相关产品推荐
相关产品推荐

