根本原因是pdo与pdo_sqlite扩展未同时启用或加载顺序错误;xampp默认只启用了pdo核心,需手动开启pdo_sqlite且确保extension=pdo在前、extension=pdo_sqlite紧随其后,并重启apache。

为什么 new PDO("sqlite:db.sqlite") 报 “could not find driver”
根本原因不是没装 SQLite,而是 PDO 和 PDO_SQLITE 驱动没同时启用,或加载顺序错误。XAMPP 默认只启用 PDO,但 PDO_SQLITE 是独立扩展,必须显式开启。
检查 phpinfo() 页面,搜索 “pdo” 和 “pdo_sqlite” 两处:如果只有 “PDO Support → enabled”,但没看到 “pdo_sqlite” 这一行,说明驱动未加载。
- 打开
xampp\php\php.ini(不是php.ini-development或-production) - 确认这三行都存在且**无分号开头**、**顺序正确**:
extension=pdo<br>extension=pdo_sqlite<br>extension=sqlite3
-
extension=pdo必须在最前,pdo_sqlite必须紧随其后;sqlite3可选,但建议保留(兼容原生类) - 重启 Apache(不是仅刷新页面)
sqlite3 类找不到,但 PDO 连接却成功?
这是常见混淆:启用 pdo_sqlite 只让 PDO 支持 SQLite 协议,不提供 SQLite3 原生类。后者依赖 sqlite3 扩展(注意没有 pdo_ 前缀)。
如果你写的是:$db = new SQLite3("test.db");,报错 “class 'SQLite3' not found”,说明 extension=sqlite3 没生效。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 确认
xampp\php\ext\php_sqlite3.dll文件真实存在(不是php_sqlite.dll或拼写错误) - Windows 下该 DLL 名称严格为
php_sqlite3.dll,即使 php.ini 里写extension=sqlite3,PHP 仍会自动补全前缀 - 某些 XAMPP 版本(如 8.2+)默认已启用,但若你手动改过 php.ini,可能被意外注释
- 用
php -m | findstr sqlite在命令行验证是否加载(需将xampp\php加入 PATH)
UTF-8 中文乱码或 LIKE 不区分大小写失效
这不是配置开关问题,而是 SQLite 默认行为:它不强制使用 ICU,对非 ASCII 字符的排序、比较(如 LIKE、ORDER BY)依赖底层 libc,Windows 上尤其容易出问题。
你无法通过 php.ini 开启 “enable-sqlite-utf8” —— 这个选项根本不存在于 PHP 或 SQLite 的标准配置中。
- 确保数据库文件本身以 UTF-8 编码创建(用
file -i test.db或十六进制编辑器确认,但更可靠的是用 PHP 创建:(new SQLite3)->exec("PRAGMA encoding = 'UTF-8';")) - 连接时显式设置编码(PDO 方式):
$pdo = new PDO("sqlite:db.sqlite", null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $pdo->exec("PRAGMA encoding = 'UTF-8'"); - 避免依赖
LIKE做中文模糊匹配;改用INSTR()或全文检索(FTS5)更可控 - ICU 支持需编译时链接,XAMPP 自带的 SQLite 不含 ICU,强行替换 DLL 易导致 Apache 崩溃,不推荐
用 PDO 还是原生 SQLite3 类?
除非你要调用 busyTimeout()、createAggregate() 这类底层函数,否则一律优先用 PDO。它自带预处理防注入,API 统一,迁移成本低。
但要注意一个硬伤:PDO_SQLITE 默认关闭外键约束,而很多业务逻辑依赖它。
- 连接后立刻执行:
$pdo->exec("PRAGMA foreign_keys = ON"); - 不要指望在 DSN 里加参数(如
sqlite:db.sqlite?foreign_keys=1),PDO 不解析这些 - 原生
SQLite3类同样默认禁用外键,需手动$db->exec("PRAGMA foreign_keys = ON") - SQLite 数据库路径尽量用绝对路径(
__DIR__ . '/data/app.db'),相对路径在 CLI 和 Web 环境下工作目录不同,极易打不开
PDO 和 PDO_SQLITE 的加载顺序,以及外键和编码这两项必须运行时手动开启的特性。










