You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP的SQLite3类操作Sqlite3数据库无法写入数据是什么原因?

问题原因及解决方法

  1. 参数绑定方式错误
    PHP原生SQLite3扩展的预处理语句执行方法SQLite3Stmt::execute()不支持直接传入参数数组,这是你代码写入失败的核心原因。参数需要先通过bindValue()方法逐个绑定后再执行,你的写法在开启PHP错误提示的场景下会抛出警告,未正确执行插入语句。

修正后的可运行代码如下:

// 打开数据库,建议开启错误抛出方便排查问题
$db = new SQLite3('test.db');
$db->enableExceptions(true);

// 建表
$db->query("CREATE TABLE IF NOT EXISTS log (a, b, d);");

// 预处理+绑定参数+执行
$stmt = $db->prepare("INSERT INTO log VALUES (?, ?, ?);");
$stmt->bindValue(1, "a", SQLITE3_TEXT);
$stmt->bindValue(2, date("Y-m-d\TH:i:sO"), SQLITE3_TEXT);
$stmt->bindValue(3, 123, SQLITE3_INTEGER);
$stmt->execute();

// 验证插入
$result = $db->query("SELECT * FROM log");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
    var_dump($row);
}

// 关闭连接
$db->close();
  1. 不必要的commit操作
    SQLite3默认开启自动提交模式,只要你没有手动调用$db->exec('BEGIN;')开启事务,插入操作执行成功后会自动落盘,不需要额外调用commit(),非事务场景下调用commit()反而会触发错误。

  2. 耗时一致的原因
    PDO_SQLite和原生SQLite3扩展都是调用底层SQLite的C语言接口实现操作,两者本身的性能差异极小,你观测到的50ms耗时基本都来自SQLite默认的磁盘同步机制:每次写入都会执行fsync强制刷入磁盘,保证数据持久化。
    如果需要提升写入性能,可以调整SQLite的同步策略,比如开启WAL模式、调低同步等级:

// 开启WAL模式
$db->exec('PRAGMA journal_mode = WAL;');
// 调整同步等级为NORMAL,性能更好,仅系统崩溃时可能丢数据
$db->exec('PRAGMA synchronous = NORMAL;');

内容的提问来源于stack exchange,提问作者Basj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:45:05