php操作sqlite数据库核心是用pdo或sqlite3类,禁用已移除的sqlite_open();须启用pdo_sqlite和sqlite3扩展,使用绝对路径或__dir__拼接确保定位准确,配wal模式提升并发,并用预处理防注入。

PHP操作SQLite数据库,核心就一条:用 PDO 或 SQLite3 类,别碰已移除的 sqlite_open() —— 它在 PHP 7.0+ 里根本不存在,调用直接报 Fatal error: Call to undefined function sqlite_open()。
确认扩展已启用,否则连对象都 new 不出来
PHP 不会自动加载 SQLite 支持。必须手动检查并启用对应扩展:
-
pdo_sqlite是PDO连接 SQLite 的必要驱动;只开sqlite3扩展,new PDO('sqlite:db.db')会报could not find driver - Linux/macOS 下通常编译进 PHP,但需确认 php.ini 中未注释:
extension=pdo_sqlite - Windows 下是
extension=php_pdo_sqlite.dll,注意路径和 DLL 文件存在 - 验证命令:
php -m | grep -i sqlite,应同时看到pdo_sqlite和sqlite3
路径写错 = 操作了另一个空库,不是“连不上”而是“连偏了”
SQLite 没有服务端,全靠文件路径定位。相对路径极易因工作目录(getcwd())变化而失效,导致静默创建新空库:
- 绝对路径最稳:
new PDO('sqlite:/var/www/myapp/data/app.db') - 用
__DIR__拼接更可靠:'sqlite:' . __DIR__ . '/data/app.db' - 目录必须存在且可写:SQLite 能自动建
.db文件,但父目录若不存在或无写权限,会报unable to open database file - Web 服务器用户(如
www-data、_www)需对目录和文件有rwx权限,chmod 755 data/+chown www-data:data/常见组合
用预处理防注入,别拼 SQL 字符串
直接 "INSERT INTO users VALUES ('" . $_POST['name'] . "') 是高危操作,SQLite 同样受 SQL 注入影响:
-
PDO推荐写法:$stmt = $pdo->prepare("INSERT INTO users (name) VALUES (?)"); $stmt->execute([$name]); -
SQLite3对应写法:$stmt = $db->prepare("INSERT INTO users (name) VALUES (?)"); $stmt->bindValue(1, $name, SQLITE3_TEXT); $stmt->execute(); - 字段名含空格、短横线等特殊字符时,必须用反引号包裹:
`user-name`,否则语法错误 -
SQLite3::escapeString()是兜底手段,仅用于动态表名/字段名等无法参数化的地方,不推荐作为主要防护方式
WAL 模式能缓解并发锁,但要注意文件系统限制
默认回滚日志模式下,多进程写入易触发 database is locked。启用 WAL 可提升读写并发能力,但有硬性前提:
- 连接后立即执行:
$pdo->exec("PRAGMA journal_mode = WAL"); - 验证是否生效:
$mode = $pdo->query("PRAGMA journal_mode")->fetchColumn();,返回值应为wal -
-wal和-shm临时文件必须与主.db文件位于同一挂载点(同一文件系统),跨 NFS 或 bind mount 会退回到 DELETE 模式 - WAL 不是永久开关,每次连接后都需重新设置,或在数据库初始化阶段统一配置
真正容易被忽略的是:SQLite 的“连接”本质是文件句柄,PDO 对象销毁或脚本结束时自动释放;但事务必须显式 commit(),否则写入不持久——这点和 MySQL 等服务型数据库的行为差异,常导致数据“莫名消失”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











