Codeigniter 3多库操作会话写入数据库报Query Builder未启用错误如何解决
问题根因
你触发报错的核心原因是数据库配置文件和Session初始化产生了循环依赖:
CodeIgniter加载框架的顺序是先读取database.php配置,再初始化Session库。而你在database.php里提前调用了get_instance()获取实例、加载Session库,此时Session的数据库驱动还没拿到完整的数据库配置,无法校验到Query Builder状态,所以抛出异常。
解决步骤
- 清理database.php中的错误代码
删除database.php里这两行提前加载Session的代码:
$CI = & get_instance(); $CI->load->library('session');
同时删除$db['db2']的整段配置,不要在数据库配置文件里依赖Session取值配置第二个数据库。
- 给默认数据库配置显式开启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 // 新增这行 );
- 业务层动态加载第二个数据库
将第二个数据库的加载逻辑移到控制器父类(如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的方法即可。
- 可选校验
确认你的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
相关产品推荐
相关产品推荐

