下面是一份 完整的 SQLite + PHP 中文教程,涵盖从环境搭建到 CRUD 操作、事务、连接池等实用技巧,适合初学者和进阶开发者。
一、SQLite 简介
SQLite 是一个轻量级、嵌入式、零配置的数据库引擎,适合:
- Web 应用(PHP 项目)
- 移动应用
- 嵌入式系统
- 本地数据存储
它将整个数据库保存在 单个文件 中,无需服务器。PHP 从 5.3.0 版本开始内置 SQLite3 支持。
二、PHP 环境要求
- PHP 版本:5.3.0 或更高(推荐 PHP 8.x)
- 启用 SQLite3 扩展:通常默认启用,检查
php.ini中的extension=sqlite3和extension=pdo_sqlite。 - 验证安装:
<?php
if (extension_loaded('sqlite3')) {
echo "SQLite3 扩展已启用!版本:" . SQLite3::version()['versionString'] . "\n";
} else {
echo "SQLite3 扩展未启用,请检查 php.ini。\n";
}
?>
运行:php check.php,应显示类似 “3.46.1 2024-08-13″(最新版本)。
如果未启用,使用 Composer 或手动编译安装扩展。下载最新 SQLite:https://www.sqlite.org/download.html
三、PHP 连接 SQLite 数据库
<?php
class SQLiteDemo {
private $db;
public function __construct($dbPath = 'users.db') {
try {
$this->db = new SQLite3($dbPath);
echo "成功连接 SQLite 数据库!\n";
$this->创建表();
$this->插入数据("张三", 28);
$this->插入数据("李四", 35);
$this->查询数据();
} catch (Exception $e) {
die("数据库错误: " . $e->getMessage());
}
}
// 创建 users 表
private function 创建表() {
$sql = "
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
);
";
$this->db->exec($sql);
echo "表 'users' 已创建或已存在。\n";
}
// 插入数据
private function 插入数据($name, $age) {
$sql = "INSERT INTO users (name, age) VALUES (:name, :age)";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':age', $age, SQLITE3_INTEGER);
$result = $stmt->execute();
if ($result) {
echo "已插入: " . $name . "\n";
}
$stmt->close();
}
// 查询数据
private function 查询数据() {
$sql = "SELECT id, name, age FROM users ORDER BY age DESC";
$result = $this->db->query($sql);
echo "\n--- 查询结果 ---\n";
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
printf("ID: %d | 姓名: %s | 年龄: %d\n",
$row['id'], $row['name'], $row['age']);
}
$result->finalize();
}
}
// 运行示例
new SQLiteDemo();
?>
运行:php demo.php,输出连接成功并显示数据。
四、PDO 支持(推荐,用于更灵活的数据库切换)
PDO 是 PHP 数据对象,提供统一的数据库接口,支持 SQLite。
<?php
try {
$db = new PDO('sqlite:users_pdo.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "PDO + SQLite 连接成功!\n";
// 创建表
$db->exec("
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
");
// 插入
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (:name, :age)");
$stmt->execute([':name' => '王五', ':age' => 22]);
// 查询
$stmt = $db->prepare("SELECT * FROM users WHERE age > :age");
$stmt->execute([':age' => 20]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['name'] . " - " . $row['age'] . "\n";
}
} catch (PDOException $e) {
die("PDO 错误: " . $e->getMessage());
}
?>
五、封装 CRUD 操作(UserDAO 类)
<?php
class UserDAO {
private $db;
public function __construct($dbPath = 'users.db') {
$this->db = new SQLite3($dbPath);
$this->创建表();
}
private function 创建表() {
$sql = "
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
";
$this->db->exec($sql);
}
// 增
public function 插入($name, $age) {
$sql = "INSERT INTO users(name, age) VALUES (:name, :age)";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':age', $age, SQLITE3_INTEGER);
$result = $stmt->execute();
$id = $this->db->lastInsertRowID();
$stmt->close();
return $id;
}
// 删
public function 删除($id) {
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':id', $id, SQLITE3_INTEGER);
$stmt->execute();
$stmt->close();
return $this->db->changes(); // 返回受影响行数
}
// 改
public function 更新($id, $name, $age) {
$sql = "UPDATE users SET name = :name, age = :age WHERE id = :id";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':age', $age, SQLITE3_INTEGER);
$stmt->bindValue(':id', $id, SQLITE3_INTEGER);
$stmt->execute();
$stmt->close();
return $this->db->changes();
}
// 查单个
public function 查找($id) {
$sql = "SELECT * FROM users WHERE id = :id";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':id', $id, SQLITE3_INTEGER);
$result = $stmt->execute();
$row = $result->fetchArray(SQLITE3_ASSOC);
$stmt->close();
$result->finalize();
return $row ?: null;
}
// 查全部
public function 查找全部() {
$sql = "SELECT * FROM users ORDER BY id DESC";
$result = $this->db->query($sql);
$users = [];
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$users[] = $row;
}
$result->finalize();
return $users;
}
public function __destruct() {
$this->db->close();
}
}
// 示例使用
$dao = new UserDAO();
echo "插入 ID: " . $dao->插入("赵六", 40) . "\n";
print_r($dao->查找全部());
?>
六、事务支持(Transaction)
SQLite 支持事务,确保数据一致性。
<?php
$db = new SQLite3('accounts.db');
$db->exec("CREATE TABLE IF NOT EXISTS accounts (id INTEGER PRIMARY KEY, balance INTEGER)");
// 转账示例
function 转账($db, $fromId, $toId, $amount) {
$db->exec('BEGIN TRANSACTION'); // 开启事务
try {
// 扣款
$stmt = $db->prepare("UPDATE accounts SET balance = balance - :amount WHERE id = :id");
$stmt->bindValue(':amount', $amount, SQLITE3_INTEGER);
$stmt->bindValue(':id', $fromId, SQLITE3_INTEGER);
$stmt->execute();
$stmt->close();
// 加款
$stmt = $db->prepare("UPDATE accounts SET balance = balance + :amount WHERE id = :id");
$stmt->bindValue(':amount', $amount, SQLITE3_INTEGER);
$stmt->bindValue(':id', $toId, SQLITE3_INTEGER);
$stmt->execute();
$stmt->close();
$db->exec('COMMIT'); // 提交
echo "转账成功!\n";
} catch (Exception $e) {
$db->exec('ROLLBACK'); // 回滚
echo "转账失败,已回滚: " . $e->getMessage() . "\n";
}
}
// 测试
转账($db, 1, 2, 100);
$db->close();
?>
七、常见问题与最佳实践
| 问题 | 解决方案 |
|---|---|
| 中文乱码 | SQLite 默认 UTF-8,确保 PHP 文件保存为 UTF-8,无 BOM。使用 PRAGMA encoding = 'UTF-8'; |
| 数据库文件路径 | 使用绝对路径:__DIR__ . '/data.db' 避免相对路径问题 |
| 多线程安全 | SQLite 适合读多写少;高并发用 WAL 模式:$db->exec("PRAGMA journal_mode = WAL;"); |
| 性能优化 | 索引:CREATE INDEX idx_name ON users(name);;批量插入用事务 |
// 优化示例
$db->exec("PRAGMA journal_mode = WAL;");
$db->exec("PRAGMA synchronous = NORMAL;");
八、推荐工具
- DB Browser for SQLite:图形化管理工具(类似 phpMyAdmin)
- 下载:https://sqlitebrowser.org/
- phpLiteAdmin:PHP 实现的 Web 管理工具
- 下载:https://www.phpliteadmin.org/
- VS Code / PhpStorm:集成 SQLite 插件
九、完整项目结构示例
project/
├── index.php ← 主入口
├── UserDAO.php
├── demo.php ← 测试文件
└── users.db ← 自动生成
在 index.php 中引入并使用 DAO 类。
总结:SQLite + PHP 组合非常适合轻量级 Web 应用开发,代码简洁、部署简单、无需额外服务器。
立即复制代码运行,你将拥有一个完整的 SQLite 数据库管理系统!
如需 Laravel + SQLite、PDO 高级示例 或 连接池(自定义),欢迎继续提问!