CodeIgniter中自定义库查询结果传递到视图无法正常显示问题求助
CodeIgniter中自定义库查询结果传递到视图无法正常显示问题求助
问题核心分析
你现在碰到的问题其实是两个小问题叠加导致的:一是自定义库函数的返回逻辑和你实际的查询需求不匹配,二是查询结果的获取方法用错了(单行vs多行)。咱们一步步拆解修复:
具体问题拆解
原函数的返回逻辑错误
你调用函数时传的$select是多个字段的组合(比如" 'Product Order Placed' as activity_title..."),但原函数最后试图用return $result[$select];来返回值——这里的问题是,$result数组的键是你定义的字段别名(比如activity_title),而不是整个select参数的字符串,所以这个取值肯定找不到对应键,自然返回null,视图就显示空了。获取查询结果的方法用错
原函数里用了$query->row_array();,这个方法只会返回查询结果的第一行,但你的查询明显应该返回多条数据(你说改返回后有3条结果),所以必须换成result_array()来获取所有行的数组。
另外提一句:你的函数名里带Group,但函数里并没有调用group_by()方法,看起来是函数名起错了,这个不影响功能,但建议后面改个贴合实际的名字,方便维护。
修复方案
第一步:修改library/comment.php中的函数
把函数改成支持返回多行多字段的形式,同时优化where参数的处理逻辑:
function getSelectedOneFieldJoin2TblGroupOrder($select, $table, $where, $join_table1, $join_condition1, $join_table2, $join_condition2, $order_by=null, $order_dir='ASC') { $this->CI->db->select($select); $this->CI->db->from($table); // 优化where参数处理:自动判断是否带WHERE前缀 if (!empty($where)) { if (stripos($where, 'WHERE ') === 0) { $where2 = substr($where, 6); $this->CI->db->where($where2); } else { $this->CI->db->where($where); } } $this->CI->db->join($join_table1, $join_condition1, 'left'); $this->CI->db->join($join_table2, $join_condition2, 'left'); if (!empty($order_by)) { $this->CI->db->order_by($order_by, $order_dir); } $query = $this->CI->db->get(); // 用result_array()获取所有结果行,而不是单行 $result = $query->result_array(); // 返回结果数组,空的话返回空数组(视图循环不会报错) return !empty($result) ? $result : []; }
第二步:修正控制器Dashboard.php中的调用
你原来调用时多传了一个"ASC"参数,原函数没有对应的参数位置,现在修改后的函数增加了$order_dir参数,所以调用要对应上,还要记得把结果传给视图:
$res1 = $this->common->getSelectedOneFieldJoin2TblGroupOrder( " 'Product Order Placed' as activity_title, u.created_on as created_on, m.first_name AS created_by", "tbl_product_order u", "WHERE u.status != 2 and u.status != 0", "tbl_package_master p", "p.id = u.package_id", "tbl_user_master m", "m.user_id = u.user_id", "u.created_on", "ASC" ); // 把查询结果传给视图的$form_data变量 $this->load->view('dashboard', ['form_data' => $res1]);
第三步:优化视图dashboard.php的循环(可选但推荐)
加个空判断,避免没有数据时出现报错,同时优化输出格式:
<?php if (!empty($form_data)): ?> <?php foreach($form_data as $Res): ?> <?php echo $Res['activity_title'] . " :: " . $Res['created_on']; ?> <br> <!-- 加换行让结果更清晰 --> <?php endforeach; ?> <?php else: ?> <p>暂无相关记录</p> <?php endif; ?>
额外小建议
- 函数名
getSelectedOneFieldJoin2TblGroupOrder太长了,而且和实际功能不符(没有用到分组),建议改成比如getJoinedActivityRecords这种简洁且贴合功能的名字,以后维护起来更省心。 - 以后写查询函数时,尽量明确函数的用途:是返回单行还是多行,是单个字段还是多个字段,避免出现这种“一个函数用在两种场景”的情况。
备注:内容来源于stack exchange,提问作者Zac Ang
相关产品推荐
相关产品推荐

