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

CodeIgniter4调用getFieldNames()报null成员函数错误求助

错误原因
  • 你重写UsersModel的构造方法时,没有调用父类Model的构造函数,CI4框架核心Model类原本会在自身构造方法中自动初始化数据库连接实例并赋值给$this->db属性,被自定义构造方法覆盖后该初始化逻辑没有执行。
  • 构造方法中\Config\Database::connect()返回的连接实例被赋值给了局部变量$db,并没有赋值给类属性$this->db,导致调用getColumns()方法时$this->db值为null,调用成员方法自然抛出空对象错误。
修复方法

推荐使用CI4模型的标准写法,不需要手动初始化数据库连接和查询构造器,只需要指定对应表名、重写构造时调用父类构造即可:

class UsersModel extends Model
{
    // 指定模型绑定的表名,框架会自动完成连接、查询构造器初始化
    protected $table = 'users';

    public function __construct()
    {
        // 必须调用父类构造方法,执行核心初始化逻辑
        parent::__construct();
    }

    public function getColumns()
    {
        $names = $this->db->getFieldNames($this->table);
        foreach ($names as $field) {
            echo $field;
        }
        exit;
    }
}

如果需要手动控制数据库连接,需要把连接实例赋值给$this->db类属性,不能只用局部变量存储:

class UsersModel extends Model
{
    public function __construct()
    {
        // 将连接实例赋值给类属性$this->db
        $this->db = \Config\Database::connect();
        $this->builder = $this->db->table('users');
    }

    public function getColumns()
    {
        $names = $this->db->getFieldNames('users');
        foreach ($names as $field) {
            echo $field;
        }
        exit;
    }
}

注意:非特殊场景不推荐第二种手动连接的写法,CI4的Model已经封装了完整的表操作逻辑,手动初始化很容易遗漏属性赋值导致各类报错。

内容的提问来源于stack exchange,提问作者sana khalid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:15:30