CodeIgniter MVC表格填充时报Invalid argument supplied for foreach()错误
报错原因
- 核心原因是数据赋值和视图加载的执行顺序颠倒:现有代码中,先执行了
$this->load->view('crm/reports/totallistings',$content,true)将$content传入视图渲染,之后才执行$content['groupedleads'] = $this->leads_model->get_listingstatus($fdate,$tdate)给groupedleads赋值。视图渲染时$groupedleads变量未定义,默认值为NULL,把NULL传入foreach就会触发该错误。 - 潜在的次要原因:就算调整顺序后,如果模型
get_listingstatus方法在无匹配数据时返回的不是数组(比如返回false、NULL或空字符串),同样会触发该报错。
修复方案
- 首先调整控制器代码的执行顺序,先完成所有数据查询赋值,再加载视图,修改后的控制器代码如下:
public function totallistings($slug='') { $this->load->library('pagination'); $main['page_title']=$this->config->item('site_name').' - Listings Reports'; $main['header']=$this->adminheader(); $main['footer']=$this->adminfooter(); $main['left']=$this->adminleftmenu(); $content = []; // 初始化为数组而非空字符串,写法更规范 $fdate = $this->input->post("fdate"); $tdate = $this->input->post("tdate"); // 日期赋值逻辑可简化 $content['fdate'] = $fdate ?? ''; $content['tdate'] = $tdate ?? ''; // 先查询数据,再加载视图 $content['groupedleads'] = $this->leads_model->get_listingstatus($fdate,$tdate); // 额外加一层兜底,保证传给视图的一定是数组 if (!is_array($content['groupedleads'])) { $content['groupedleads'] = []; } $main['content']=$this->load->view('crm/reports/totallistings',$content,true); $main['jsArray'] = array('public/assets/plugins/datatables/jquery.dataTables.min.js' ); $main['cssArray'] = array('public/assets/plugins/datatables/jquery.dataTables.min.css','public/assets/css/reports.css'); $this->load->view('crm/main',$main); }
- 建议同步调整模型的
get_listingstatus方法,保证查询结果始终返回数组:查询结果用result_array()接收,无数据时直接返回空数组[],避免返回非数组类型值。 - 也可以在视图的
foreach遍历前加判断,只在$groupedleads为非空数组时遍历:
<?php if (!empty($groupedleads) && is_array($groupedleads)): ?> <?php foreach ($groupedleads as $item): ?> <!-- 表格渲染逻辑 --> <?php endforeach; ?> <?php else: ?> <tr><td colspan="对应列数">暂无匹配数据</td></tr> <?php endif; ?>
内容的提问来源于stack exchange,提问作者user17071484
相关产品推荐
相关产品推荐

