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

Codeigniter 3多库操作会话写入数据库报Query Builder未启用错误如何解决

问题根因

你触发报错的核心原因是数据库配置文件和Session初始化产生了循环依赖:
CodeIgniter加载框架的顺序是先读取database.php配置,再初始化Session库。而你在database.php里提前调用了get_instance()获取实例、加载Session库,此时Session的数据库驱动还没拿到完整的数据库配置,无法校验到Query Builder状态,所以抛出异常。

解决步骤

  1. 清理database.php中的错误代码
    删除database.php里这两行提前加载Session的代码:
$CI = & get_instance();
$CI->load->library('session');

同时删除$db['db2']的整段配置,不要在数据库配置文件里依赖Session取值配置第二个数据库。

  1. 给默认数据库配置显式开启Query Builder
    在$db['default']数组中添加一行配置,避免多库场景下全局配置不生效:
'query_builder' => TRUE,

修改后的$db['default']示例:

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'ip',
    'username' => 'name',
    'password' => 'pass',
    'database' => 'db',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE,
    'query_builder' => TRUE // 新增这行
);
  1. 业务层动态加载第二个数据库
    将第二个数据库的加载逻辑移到控制器父类(如MY_Controller)的构造方法中,此时Session已经完成初始化,可以正常读取Session值配置数据库:
public function __construct()
{
    parent::__construct();
    // 从Session取值构造第二个数据库的配置
    $db2_config = [
        'dsn'   => '',
        'hostname' => $this->session->firma_db_ip,
        'username' => $this->session->firma_db_kullanici,
        'password' => $this->session->firma_db_sifre,
        'database' => $this->session->firma_db,
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => [],
        'save_queries' => TRUE,
        'query_builder' => TRUE
    ];
    // 加载第二个数据库,返回连接实例
    $this->db2 = $this->load->database($db2_config, TRUE);
}

后续业务代码中需要操作第二个数据库时,直接调用$this->db2的方法即可。

  1. 可选校验
    确认你的ci_sessions表结构符合CodeIgniter官方要求,避免后续出现其它Session存储错误:
CREATE TABLE IF NOT EXISTS `ci_sessions` (
    `id` varchar(128) NOT NULL,
    `ip_address` varchar(45) NOT NULL,
    `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
    `data` blob NOT NULL,
    PRIMARY KEY (`id`),
    KEY `ci_sessions_timestamp` (`timestamp`)
);

内容的提问来源于stack exchange,提问作者Tolga Daron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:30:04