CodeIgniter 3 默认不支持 PHP 8.1+ 的 mysql_* 扩展,须用 mysqli 或 pdo 驱动并正确配置于 application/config/database.php;CI 4 则需在 app/Config/Database.php 中设置,通过 \Config\Database::connect() 获取实例,且注意 strict mode 兼容性。

CodeIgniter 3 默认不支持 PHP 8.1+ 的 mysql_connect() 和废弃的 mysql_* 扩展,直接“连库失败”八成是驱动没配对或配置写错位置。
确认你用的是 CI 3 还是 CI 4
CI 3 和 CI 4 的数据库配置方式、驱动名、加载逻辑完全不同,混用会导致 Class 'CI_DB' not found 或 Database: Unable to connect to your database server:
- CI 3:配置在
application/config/database.php,驱动名是mysqli(不是mysql)或pdo - CI 4:配置在
app/Config/Database.php,使用PDO实例化,默认驱动是MySQLi,但类结构和加载方式彻底重构 - 如果你从 CI 2 升级上来,
mysql驱动已完全移除,必须改mysqli或pdo
CI 3 中正确配置 mysqli 数据库连接
重点不是“怎么填”,而是填对地方、用对键名、避开过时写法:
-
$db['default']['hostname'] = 'localhost';(不要写127.0.0.1除非明确需要 IPv4,本地用localhost更稳妥) -
$db['default']['username'] = 'root';(密码为空时,'password' => ''不能省略) -
$db['default']['database'] = 'myapp';(库名必须已存在,CI 不自动建库) -
$db['default']['dbdriver'] = 'mysqli';(绝对不要写mysql,否则报Unknown driver) -
$db['default']['char_set'] = 'utf8mb4';(推荐,避免 emoji 存储异常) - 如果 MySQL 启用了 strict mode,建议加:
$db['default']['stricton'] = FALSE;,否则某些 INSERT 可能报错
CI 4 中启用数据库并验证连接
CI 4 不再靠 $this->load->database(),而是通过服务容器获取实例,常见连不上是因为没启用或配置未生效:
立即学习“PHP免费学习笔记(深入)”;
- 确保
app/Config/Database.php中public $default组的DSN为空(CI 4 推荐拆解配置而非拼 DSN) - 检查
public $default的hostname、username、password、database是否赋值,且DBDriver是MySQLi(首字母大写) - 在控制器中用:
$db = \Config\Database::connect();,而不是$this->db(除非你已在 BaseController 中初始化) - 调试连接是否成功:
var_dump($db->connID !== false);—— 返回bool(true)才算通 - 注意:CI 4 默认开启
strictOn,若 MySQL 版本较老(如 5.6),可能需设为false避免语法兼容问题
连得上但查不出数据?检查 active record 模式和错误抑制
CI 的查询失败常常静默,尤其在生产环境 display_errors = Off 时:
- 开发阶段务必打开调试:
define('ENVIRONMENT', 'development');并确认app/Config/Logger.php中$threshold≥ 1 - 执行查询后立即检查:
if ($this->db->error()['code'] !== 0) { print_r($this->db->error()); } - CI 3 中
$this->db->get()默认返回对象,但若表不存在或字段名错,不会抛异常,只会返回空结果;可用$this->db->last_query()看实际发了什么 SQL - CI 4 中对应的是
$builder->getCompiledSelect()或$db->getLastQuery()->getQuery()
真正卡住的地方往往不是“怎么连”,而是驱动名写错、配置文件路径不对、MySQL 用户没远程权限(localhost ≠ 127.0.0.1 的权限体系)、或 CI 自带的缓存机制把旧错误配置记住了——删掉 application/cache/ 下所有文件再试一次,比反复改配置更有效。










