SQLite – PHP

下面是一份 完整的 SQLite + PHP 中文教程,涵盖从环境搭建到 CRUD 操作、事务、连接池等实用技巧,适合初学者和进阶开发者。


一、SQLite 简介

SQLite 是一个轻量级、嵌入式、零配置的数据库引擎,适合:

  • Web 应用(PHP 项目)
  • 移动应用
  • 嵌入式系统
  • 本地数据存储

它将整个数据库保存在 单个文件 中,无需服务器。PHP 从 5.3.0 版本开始内置 SQLite3 支持。


二、PHP 环境要求

  • PHP 版本:5.3.0 或更高(推荐 PHP 8.x)
  • 启用 SQLite3 扩展:通常默认启用,检查 php.ini 中的 extension=sqlite3extension=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 + SQLitePDO 高级示例连接池(自定义),欢迎继续提问!

文章已创建 2326

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部