You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:46:59