Codeigniter按下拉框所选年份统计预算利润总和填充输入框错误排查
代码错误点汇总
前端JS部分错误
- 事件监听回调函数缺失闭合括号,会直接报语法错误
- 仅判断了
val === '2021'才发起请求,其余年份选中无响应,如果后续要支持多年份需要移除该判断 - 给只读输入框赋值错误使用了
html()方法,<input>是单标签,赋值需要用val()方法 - 混合使用原生事件监听和jQuery选择器,虽然不影响运行但代码风格不统一
控制器部分错误
- 处理AJAX请求时使用了
redirect()跳转,AJAX请求需要直接返回数据而非跳转页面,跳转后前端拿到的是整个页面的HTML内容,无法拿到利润值 - 没有接收前端POST传递的年份参数,无法传递给模型做动态筛选
- 模型返回的查询结果没有输出给前端,AJAX的success回调无法拿到有效数据
- 不需要设置flashdata,flashdata是页面跳转时用的,AJAX场景完全无效
- 处理AJAX请求时使用了
模型部分错误
like条件的字段写错了:你是要按年份筛选,应该对应表中的日期字段(比如create_time、budget_date等,根据你表的实际字段名修改),现在写的是surplus(利润字段),完全筛选不到对应年份的数据like的字段名用了中文弯引号‘surplus’,PHP会直接报语法错误- 年份筛选写死为
2021-,没有接收控制器传过来的年份参数,无法支持动态年份查询 - 查询完成后没有返回结果,需要取出sum的利润值返回给控制器
修复后代码
视图JS部分
// 直接用jQuery绑定事件,避免混写原生代码 $('#SelectOption').on('change', function() { var val = $(this).val(); console.log(val); if(val) { // 只要选中有效年份就发起请求,不用仅限制2021 $.ajax({ type: "POST", url : "<?php echo base_url(); ?>Reports/get_profit", data:{year:val}, dataType: 'json', // 约定返回json格式数据 success: function(res){ if(res.code === 1) { $('#profitdiv').val(res.profit); // 用val()给input输入框赋值 } else { $('#profitdiv').val('0'); alert(res.msg); } }, error: function() { alert('请求失败,请重试'); } }); } else { $('#profitdiv').val(''); // 未选中年份时清空输入框 } });
控制器部分
public function get_profit() { // 接收前端传递的年份参数 $year = $this->input->post('year'); $res = ['code' => 0, 'msg' => '查询失败', 'profit' => 0]; if(empty($year)) { echo json_encode($res); exit; } $this->load->model('Reports_model'); $profit = $this->Reports_model->select_profit($year); if($profit !== false) { $res['code'] = 1; $res['msg'] = '查询成功'; $res['profit'] = $profit ?: 0; } // 直接输出json结果给前端,禁止跳转 echo json_encode($res); exit; }
模型部分
function select_profit($year) { $this->db->select_sum("surplus"); $this->db->from("budget_tbl"); // 此处的date_field请替换为你预算表中存储日期的实际字段名,比如budget_date、create_time等 $this->db->like('date_field', $year.'-', 'after'); $qry = $this->db->get(); if($qry->num_rows() > 0) { // 返回求和后的利润值 return $qry->row()->surplus; } return false; }
内容的提问来源于stack exchange,提问作者Mathee
相关产品推荐
相关产品推荐

