SQLite 是輕量級嵌入式資料庫,無需獨立伺服器進程,PHP 內建 PDO 支援,適合中小型應用、行動裝置、桌面應用、測試環境等場景。本文提供完整的建表、增刪改查 (CRUD) 實作範例。
<?php
class SQLiteManager {
private $db;
private $table_name = 'users';public function __construct($db_path) {
try {
$this->db = new PDO("sqlite:$db_path");
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("資料庫連線失敗: " . $e->getMessage());
}
}// 建立資料表
public function createTable() {
$sql = "CREATE TABLE IF NOT EXISTS {$this->table_name} (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
age INTEGER,
email VARCHAR(150),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)";
try {
$this->db->exec($sql);
return true;
} catch (PDOException $e) {
error_log("建表失敗: " . $e->getMessage());
return false;
}
}// 新增資料
public function addData($name, $age, $email) {
$sql = "INSERT INTO {$this->table_name} (name, age, email) VALUES (?, ?, ?)";
try {
$stmt = $this->db->prepare($sql);
$stmt->execute([$name, $age, $email]);
return $this->db->lastInsertId();
} catch (PDOException $e) {
error_log("新增失敗: " . $e->getMessage());
return false;
}
}// 修改資料
public function updateData($id, $data) {
$fields = [];
$values = [];
foreach ($data as $key => $value) {
$fields[] = "$key = ?";
$values[] = $value;
}
$values[] = $id;
$sql = "UPDATE {$this->table_name} SET " . implode(', ', $fields) . " WHERE id = ?";
try {
$stmt = $this->db->prepare($sql);
$stmt->execute($values);
return $stmt->rowCount() > 0;
} catch (PDOException $e) {
error_log("修改失敗: " . $e->getMessage());
return false;
}
}// 刪除資料
public function deleteData($id) {
$sql = "DELETE FROM {$this->table_name} WHERE id = ?";
try {
$stmt = $this->db->prepare($sql);
$stmt->execute([$id]);
return $stmt->rowCount() > 0;
} catch (PDOException $e) {
error_log("刪除失敗: " . $e->getMessage());
return false;
}
}// 查詢單筆
public function getById($id) {
$stmt = $this->db->prepare("SELECT * FROM {$this->table_name} WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch();
}// 查詢所有 (支援分頁)
public function getAll($page = 1, $pageSize = 20) {
$offset = ($page - 1) * $pageSize;
$stmt = $this->db->prepare("SELECT * FROM {$this->table_name} ORDER BY id DESC LIMIT ? OFFSET ?");
$stmt->execute([$pageSize, $offset]);
return $stmt->fetchAll();
}// 取得總筆數
public function getTotalCount() {
$stmt = $this->db->query("SELECT COUNT(*) FROM {$this->table_name}");
return $stmt->fetchColumn();
}
}// 使用範例
$db = new SQLiteManager(__DIR__ . '/data/app.db');
$db->createTable();// 新增
$id = $db->addData('張三', 25, 'zhangsan@example.com');
echo "新增成功,ID: $id\n";// 查詢
$user = $db->getById($id);
print_r($user);// 修改
$db->updateData($id, ['age' => 26, 'email' => 'zhangsan_new@example.com']);// 列表
$users = $db->getAll(1, 10);
foreach ($users as $u) {
echo "{$u['id']}: {$u['name']}, {$u['age']}歲\n";
}// 刪除
$db->deleteData($id);
?>
| 特性 | 說明 |
|---|---|
| 零設定 | 無需安裝、設定伺服器,單一檔案即為完整資料庫 |
| 跨平台 | 資料庫檔案可在 Windows/Linux/macOS 間直接複製使用 |
| ACID 交易 | 完整支援交易處理,保證資料一致性 |
| 型別彈性 | 採用動態型別系統,欄位可儲存任意型別資料 |
| 並發限制 | 寫入時鎖定整個資料庫檔案,高併發寫入效能較差 |
| 無網路存取 | 本機檔案存取,需搭配應用層實現網路存取 |
BEGIN TRANSACTION ... COMMIT 中CREATE INDEXPRAGMA journal_mode=WAL 提升並發讀寫效能