CodeIgniter模型无数据时报错问题及代码优化建议请求
解决CodeIgniter中无数据时的“Trying to get property of non-object”错误
我完全懂你遇到的困扰——当数据表有匹配数据时程序跑的好好的,一旦没数据就抛出那个烦人的非对象属性访问错误,咱们来一步步优化解决:
问题根源
你的模型在无数据时返回了false,但后续代码(不管是控制器还是视图)大概率直接把这个返回值当成对象去访问属性了,比如$result->r_gun,而false是布尔值不是对象,自然就触发报错了。
优化方案
1. 统一返回类型(最推荐)
把模型的返回值统一成对象类型,无数据时返回一个空的标准对象,避免混合返回类型带来的问题。修改你的模型代码:
public function denemelik($tarih){ $this->db->select('*'); $this->db->from('randevular'); $this->db->join('hasta_karti', 'randevular.h_id=hasta_karti.id', 'left'); $this->db->where('r_gun', $tarih); $query = $this->db->get(); // 有数据返回查询对象,无数据返回空的标准对象 return $query->row() ?? new stdClass(); }
这样不管有没有数据,返回的都是对象,后续访问属性时只会得到null而不会报错,你还可以在视图里简单判断属性是否存在来显示对应内容。
2. 在调用处提前做判断
如果不想改动模型,那就在调用模型的地方(比如控制器)先检查返回值的有效性:
// 控制器中调用模型 $randevu_data = $this->your_model_name->denemelik($tarih); // 先确认是有效对象再访问属性 if ($randevu_data && is_object($randevu_data)) { // 处理有数据的逻辑 echo $randevu_data->hasta_ad; } else { // 无数据时的提示 echo "当前日期暂无预约记录"; }
3. 改用数组返回(适合习惯数组操作的场景)
如果你更倾向于用数组处理数据,也可以修改模型返回数组,无数据时返回空数组:
public function denemelik($tarih){ $this->db->select('*'); $this->db->from('randevular'); $this->db->join('hasta_karti', 'randevular.h_id=hasta_karti.id', 'left'); $this->db->where('r_gun', $tarih); $query = $this->db->get(); return $query->row_array() ?? []; }
调用时只需检查数组是否为空:
$randevu_data = $this->your_model_name->denemelik($tarih); if (!empty($randevu_data)) { echo $randevu_data['hasta_ad']; } else { echo "当前日期暂无预约记录"; }
额外小建议
尽量把数据判断逻辑放在控制器里处理好,再把干净的数据传给视图,这样视图代码会更简洁易维护;如果用空对象方案,还可以给空对象预设一些默认属性值,比如$empty_obj->hasta_ad = "无数据",视图里就能直接渲染不用额外判断啦。
内容的提问来源于stack exchange,提问作者Fatih Ay
相关产品推荐
相关产品推荐

