codeigniter 3 加载 sqlite 驱动需启用 pdo_sqlite 扩展、配置 dsn(如 sqlite:/abs/path/app.db)、设 dbdriver='pdo',并验证连接与权限;不支持 dbdriver='sqlite'。

CodeIgniter 3 怎么加载 SQLite 驱动
CI3 原生不支持 SQLite,必须手动启用 pdo_sqlite 扩展并配置为 PDO 驱动。直接设 dbdriver = 'sqlite' 会报错——CI3 没这个内置驱动名。
实际能用的只有 pdo,且必须满足两个前提:
-
php.ini中已启用extension=php_pdo_sqlite.dll(Windows)或extension=pdo_sqlite.so(Linux/macOS) - PHP 版本 ≥ 5.3.7(CI3 最低要求),且
pdo和pdo_sqlite同时出现在phpinfo()输出里
否则 $this->load->database() 会静默失败或抛出 Class 'CI_DB_pdo_sqlite_driver' not found。
application/config/database.php 怎么配 SQLite
不能复用 MySQL 那套字段逻辑。SQLite 是文件型数据库,hostname、port、username、password 全部无效,填了也忽略;关键在 dsn 和 dbdriver。
正确写法示例:
$db['sqlite']['dsn'] = 'sqlite:/var/www/myapp/db/app.db'; $db['sqlite']['dbdriver'] = 'pdo'; $db['sqlite']['dbprefix'] = ''; $db['sqlite']['pconnect'] = FALSE; $db['sqlite']['db_debug'] = TRUE; $db['sqlite']['cache_on'] = FALSE; $db['sqlite']['cachedir'] = ''; $db['sqlite']['char_set'] = 'utf8'; $db['sqlite']['dbcollat'] = 'utf8_general_ci'; $db['sqlite']['swap_pre'] = ''; $db['sqlite']['autoinit'] = TRUE; $db['sqlite']['stricton'] = FALSE; $db['sqlite']['failover'] = array(); $db['sqlite']['port'] = '';
注意点:
-
dsn必须以sqlite:开头,路径需是绝对路径,且 Web 服务器用户(如www-data)有读写权限 - 如果路径不存在,CI 不会自动创建文件,连接会失败(错误信息可能是
unable to open database file) -
database字段留空或删掉,填了反而可能干扰 DSN 解析
怎么验证 SQLite 连接是否真通了
光靠 $this->load->database('sqlite', TRUE) 返回对象不等于连上了——它只表示驱动加载成功,没做实际连接校验。
必须执行一次轻量查询,比如 PRAGMA table_info(table_name) 或 SELECT 1:
$db = $this->load->database('sqlite', TRUE);
if ($db && $db->conn_id) {
$result = $db->query("SELECT 1")->result();
if ($result !== NULL) {
// 真正连上了
} else {
// 可能是文件不可写、路径错、权限不足
}
}
常见卡点:
- 路径用了相对路径(如
./db/app.db),PHP 工作目录不确定,容易找错位置 - Apache/Nginx 用户无权写入目标目录,
touch /var/www/myapp/db/app.db成功不代表 Web 进程能写 - 误把
dbdriver设成sqlite3或sqlite,CI3 会直接 fatal error
为什么 Query Builder 在 SQLite 上容易报错
CI3 的 Query Builder 默认生成 MySQL 风格 SQL,而 SQLite 对语法更敏感:不支持 INSERT IGNORE、REPLACE INTO、LIMIT 在子查询中、部分时间函数(如 NOW())等。
典型报错包括:
-
SQLSTATE[HY000]: General error: 1 near "IGNORE": syntax error→ 改用insert()+ 手动检查主键是否存在 -
SQLSTATE[HY000]: General error: 1 near "AS": syntax error→ 避免在select()中用别名嵌套过深 -
SQLSTATE[HY000]: General error: 1 no such table→ 表名大小写敏感,SQLite 默认区分,MySQL 不区分
建议开发期打开 db_debug = TRUE,并用 $db->last_query() 抓出实际执行的 SQL,再贴到 SQLite 命令行工具里手动试跑。
SQLite 文件路径、权限、DSN 格式、PDO 扩展状态——这四点漏查任意一个,都会让连接看起来“配置对了”,实则完全不通。











