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

CodeIgniter PHP错误求助:视图文件调用数据库方法失败

解决CodeIgniter中"未定义属性:CI_Loader::$db"及"对非对象调用成员函数get_where()"错误

嘿,我来帮你搞定这个CodeIgniter的数据库错误问题!咱们先理清楚问题根源,再一步步解决:

错误本质分析

你遇到的两个错误其实是同一个问题导致的连锁反应:

  • 首先触发的Notice错误:CI_Loader::$db未定义,是因为你在视图文件templateadmin.php里直接用$this->db访问数据库,但CodeIgniter里视图的底层是CI_Loader实例,它本身并没有绑定数据库对象——数据库类是专门注入给控制器的,视图不该直接操作数据库。
  • 后续的致命错误:对非对象调用get_where(),就是因为$this->db根本不是一个有效的数据库对象(是未定义状态),自然没法调用它的方法。

正确解决步骤(遵循CodeIgniter MVC规范)

按照框架的设计逻辑,数据库操作应该放在控制器或者模型里,处理完数据再传递给视图展示,具体操作如下:

1. 确保数据库类已正确加载

先确认你的项目能正常连接数据库:

  • 打开application/config/database.php,检查主机、用户名、密码、数据库名这些连接参数是否填写正确。
  • 想要自动加载数据库类的话,打开application/config/autoload.php,在$autoload['libraries']数组里添加'database':
$autoload['libraries'] = array('database');

如果不需要全局自动加载,也可以在需要用到数据库的控制器里手动加载:

$this->load->database();

2. 把数据库操作从视图移到控制器/模型

方案一:控制器内处理查询,传递结果到视图

修改你的demo.php控制器(对应错误回溯里的第6行):

<?php
class Demo extends CI_Controller {
    public function index() {
        // 如果没自动加载数据库,先手动加载
        $this->load->database();
        
        // 执行你需要的get_where查询,替换成你的表名和条件
        $query = $this->db->get_where('your_table_name', array('id' => 1));
        // 把查询结果打包成数组传给视图
        $data['query_result'] = $query->result();
        
        // 加载视图并传递数据
        $this->load->view('templateadmin', $data);
    }
}

然后在templateadmin.php的第311行,直接使用传递过来的$query_result变量,不要再调用$this->db了。

方案二:用模型处理数据库逻辑(更规范的MVC写法)

先创建一个模型文件,比如application/models/Admin_model.php:

<?php
class Admin_model extends CI_Model {
    // 封装查询方法
    public function get_target_data($condition) {
        return $this->db->get_where('your_table_name', $condition)->result();
    }
}

然后在控制器里加载模型并调用方法:

<?php
class Demo extends CI_Controller {
    public function index() {
        // 加载模型
        $this->load->model('admin_model');
        // 调用模型方法获取数据
        $data['query_result'] = $this->admin_model->get_target_data(array('id' => 1));
        // 传递数据到视图
        $this->load->view('templateadmin', $data);
    }
}

同样,视图里直接使用$query_result即可。

3. 临时应急方案(不推荐用于正式项目)

如果只是临时测试不想大改代码,也可以在控制器里把数据库对象传递给视图:

$this->load->view('templateadmin', array('db_instance' => $this->db));

然后在视图里用$db_instance->get_where()代替$this->db->get_where(),但这种写法违背MVC设计原则,正式项目别这么用。

验证修复

修改完成后刷新页面,这两个错误应该就消失了。记得始终遵循CodeIgniter的MVC架构,把数据逻辑和视图展示分离,代码会更易维护哦!

内容的提问来源于stack exchange,提问作者Fahmi Muhammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:18:27