CodeIgniter 使用 PDO 连接数据库需同时满足三条件:PHP 已启用对应 PDO 扩展、CI 配置正确(CI3 用 dbdriver=>'pdo'+完整 DSN,CI4 用 DBDriver='PDO'+DSN 字符串)、DSN 规范完整且含 charset=utf8mb4;缺一即报错。

CodeIgniter 使用 PDO 驱动连接数据库,关键不是“启用驱动”这个动作本身,而是确保 PHP 环境已加载对应扩展、配置写法正确、DSN 完整有效——三者缺一不可。
PDO 及对应数据库扩展必须启用
CI 本身不自带驱动,完全依赖 PHP 底层扩展。若扩展未启用,哪怕配置全对,也会报 Class 'PDO' not found 或 Driver not found。
- 运行
php -m | grep pdo,确认输出包含pdo和pdo_mysql(MySQL)、pdo_sqlite(SQLite)或pdo_pgsql(PostgreSQL) - Linux/macOS:检查
php.ini中是否取消注释extension=pdo.so和extension=pdo_mysql.so等 - Windows:确认
php.ini含extension=php_pdo.dll和extension=php_pdo_mysql.dll - 重启 Web 服务(如 Apache/Nginx)或 PHP-FPM 才能使改动生效
CI3 与 CI4 的配置写法差异
两者都支持 PDO,但配置结构和字段名不同,不能混用。
-
CI3:在
application/config/database.php中使用数组格式,'dbdriver' => 'pdo',且'dsn'必须完整(例如:'mysql:host=localhost;dbname=test;charset=utf8mb4') -
CI4:在
app/Config/Database.php中修改$default实例属性:
•public $DBDriver = 'PDO';(注意大小写)
•public $DSN = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
• 其他字段如$username、$password仍需填写,即使 DSN 已含部分信息
DSN 字符串必须规范且完整
DSN 是 PDO 连接的核心,漏掉任何必要部分都会导致连接失败。
- MySQL 示例:
mysql:host=127.0.0.1;port=3306;dbname=myapp;charset=utf8mb4(推荐用127.0.0.1而非localhost,避免 socket 连接歧义) - SQLite 示例:
sqlite:/var/www/myapp/app.db(路径必须为绝对路径,且 PHP 进程有读写权限) - PostgreSQL 示例:
pgsql:host=localhost;port=5432;dbname=myapp;user=postgres;password=123 - 务必显式声明
charset=utf8mb4,否则可能存不了 emoji 或某些中文生僻字
验证连接是否真正生效
配置写完不等于连上了,要实际测试。
- CI3:在控制器中执行
$this->db->simple_query('SELECT 1');,返回true表示通 - CI4:用
esc($this->db->query('SELECT 1')->getRow())或直接调用$this->db->connect()检查返回对象 - 开启
db_debug = TRUE(CI3)或public $DBDebug = true;(CI4),错误会直接抛出,便于定位是权限、库名还是字符集问题



















