使用PHP的SQLite3类操作Sqlite3数据库无法写入数据是什么原因?
问题原因及解决方法
- 参数绑定方式错误
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();
不必要的commit操作
SQLite3默认开启自动提交模式,只要你没有手动调用$db->exec('BEGIN;')开启事务,插入操作执行成功后会自动落盘,不需要额外调用commit(),非事务场景下调用commit()反而会触发错误。耗时一致的原因
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
相关产品推荐
相关产品推荐

