PHP SQLite
最后修改于 2025 年 2 月 16 日
这是一个针对 SQLite 第 3 版数据库的 PHP 编程教程。它涵盖了使用 PHP 语言进行 SQLite 编程的基础知识。
要学习本教程,我们必须在系统上安装 PHP CLI。
为了使用 SQLite 数据库,我们可以安装 sqlite3 命令行工具或 SQLite 浏览器 GUI。
$ sudo apt install php8.1-sqlite3
我们需要为 PHP 安装 SQLite3 模块。
... ;extension=sockets extension=sqlite3 ;extension=tidy ...
我们可能需要在 php.ini 文件中启用该扩展。在 Debian 系统上,安装 php8.1-sqlite3 后会自动启用该扩展。该扩展在 /etc/php/8.1/mods-available/sqlite3.ini 中启用。
SQLite
SQLite 是一种嵌入式关系数据库引擎。文档称它是一个自包含的、无服务器的、零配置的事务性 SQL 数据库引擎。它非常受欢迎,今天全球有数亿份拷贝在使用。包括 PHP 和 Python 在内的几种编程语言都内置了对 SQLite 的支持。
创建 SQLite 数据库
我们使用 sqlite3 命令行工具来创建一个新的数据库。
$ sqlite3 test.db SQLite version 3.46.1 2024-08-13 09:16:08 (UTF-16 console I/O) Enter ".help" for usage hints. sqlite>
我们向 sqlite3 工具提供一个参数;test.db 是数据库名称。它是我们磁盘上的一个文件。如果它存在,则打开它。如果不存在,则创建它。
sqlite> .tables sqlite> .exit $ ls test.db
.tables 命令给出了 test.db 数据库中的表列表。目前没有表。.exit 命令终止了 sqlite3 命令行工具的交互会话。ls 命令显示当前工作目录的内容。我们可以看到 test.db 文件。所有数据都将存储在这个单一文件中。
PHP SQLite3 版本示例
在以下示例中,我们获取 SQLite 数据库的版本。
<?php $ver = SQLite3::version(); echo $ver['versionString'] . "\n"; echo $ver['versionNumber'] . "\n"; var_dump($ver);
SQLite3::version 返回 SQLite 数据库的版本。
$ php version.php
3.37.2
3037002
array(2) {
["versionString"]=>
string(6) "3.37.2"
["versionNumber"]=>
int(3037002)
}
<?php
$db = new SQLite3('test.db');
$version = $db->querySingle('SELECT SQLITE_VERSION()');
echo $version . "\n";
程序返回 SQLite 数据库的当前版本。这次我们执行了 SELECT SQLITE_VERSION 语句。
$db = new SQLite3('test.db');
我们创建一个 SQLite3 对象并打开一个 SQLite3 数据库连接。
$version = $db->querySingle('SELECT SQLITE_VERSION()');
querySingle 执行一个查询并返回一个结果。
$ php version2.php 3.37.2
PHP SQLite3 exec
exec 对给定的数据库执行一个没有结果的查询。
<?php
$db = new SQLite3('test.db');
$db->exec("CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INT)");
$db->exec("INSERT INTO cars(name, price) VALUES('Audi', 52642)");
$db->exec("INSERT INTO cars(name, price) VALUES('Mercedes', 57127)");
$db->exec("INSERT INTO cars(name, price) VALUES('Skoda', 9000)");
$db->exec("INSERT INTO cars(name, price) VALUES('Volvo', 29000)");
$db->exec("INSERT INTO cars(name, price) VALUES('Bentley', 350000)");
$db->exec("INSERT INTO cars(name, price) VALUES('Citroen', 21000)");
$db->exec("INSERT INTO cars(name, price) VALUES('Hummer', 41400)");
$db->exec("INSERT INTO cars(name, price) VALUES('Volkswagen', 21600)");
程序创建一个 cars 表,并在表中插入八行数据。
$db->exec("CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INT)");
此 SQL 语句创建一个新的 cars 表。该表有三列。请注意,在 SQLite 数据库中,INTEGER PRIMARY KEY 列是自增的。
$db->exec("INSERT INTO cars(name, price) VALUES('Audi', 52642)");
$db->exec("INSERT INTO cars(name, price) VALUES('Mercedes', 57127)");
这两行将两辆汽车插入表中。
sqlite> .mode column sqlite> .headers on
我们使用 sqlite3 工具来验证写入的数据。首先,我们修改数据在控制台中的显示方式。我们使用列模式并打开表头。
sqlite> select * from cars; id name price ---------- ---------- ---------- 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600
这是我们写入 cars 表的数据。
PHP SQLite3 lastInsertRowID
有时,我们需要确定最后插入行的 ID。在 PHP SQLite3 中,我们使用 lastInsertRowID 方法。
<?php
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE friends(id INTEGER PRIMARY KEY, name TEXT)");
$db->exec("INSERT INTO friends(name) VALUES ('Tom')");
$db->exec("INSERT INTO friends(name) VALUES ('Rebecca')");
$db->exec("INSERT INTO friends(name) VALUES ('Jim')");
$db->exec("INSERT INTO friends(name) VALUES ('Robert')");
$last_row_id = $db->lastInsertRowID();
echo "The last inserted row Id is $last_row_id";
我们在内存中创建了一个 friends 表。ID 会自动递增。
$db->exec("CREATE TABLE friends(id INTEGER PRIMARY KEY, name TEXT)");
在 SQLite3 中,INTEGER PRIMARY KEY 列是自增的。还有一个 AUTOINCREMENT 关键字。当用于 INTEGER PRIMARY KEY AUTOINCREMENT 时,会使用略有不同的 Id 创建算法。
$db->exec("CREATE TABLE friends(id INTEGER PRIMARY KEY, name TEXT)");
$db->exec("INSERT INTO friends(name) VALUES ('Tom')");
$db->exec("INSERT INTO friends(name) VALUES ('Rebecca')");
$db->exec("INSERT INTO friends(name) VALUES ('Jim')");
$db->exec("INSERT INTO friends(name) VALUES ('Robert')");
使用自动递增时,我们必须明确说明列名,省略自动递增的列。这四个语句将四行插入 friends 表。
$last_row_id = $db->lastInsertRowID();
使用 lastInsertRowID,我们获得最后插入行的 Id。
$ php last_rowid.php The last inserted row Id is 4
我们看到了程序的输出。
PHP SQLite3 query
query 方法执行一个 SQL 查询并返回一个结果对象。
<?php
$db = new SQLite3('test.db');
$res = $db->query('SELECT * FROM cars');
while ($row = $res->fetchArray()) {
echo "{$row['id']} {$row['name']} {$row['price']} \n";
}
示例从 cars 表中检索所有数据。
$res = $db->query('SELECT * FROM cars');
此 SQL 语句从 cars 表中选择所有数据。
while ($row = $res->fetchArray()) {
fetchArray 将结果行作为关联或数字索引数组或两者都返回(默认情况下是两者)。如果没有更多行,则返回 false。
$ php fetch_all.php 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600
这是示例的输出。
PHP SQLite3 escapeString
escapeString 返回一个已正确转义的字符串。
<?php
$db = new SQLite3('test.db');
$sql = "SELECT name FROM cars WHERE name = 'Audi'";
$escaped = SQLite3::escapeString($sql);
var_dump($sql);
var_dump($escaped);
示例在查询中转义一个字符串。
$ php escape_string.php string(41) "SELECT name FROM cars WHERE name = 'Audi'" string(43) "SELECT name FROM cars WHERE name = ''Audi''"
这是示例的输出。
PHP SQLite3 参数化语句
SQL 语句通常是动态构建的。用户提供一些输入,而该输入被构建到语句中。每次处理来自用户的输入时,我们都必须谨慎。这有一些严重的安全性隐患。动态构建 SQL 语句的推荐方法是使用参数绑定。
参数化查询使用 prepare 创建;它准备一个 SQL 语句以供执行并返回一个语句对象。
PHP SQLite3 有 bindParam 和 bindValue 方法将值绑定到占位符。它允许将数据绑定到问号或命名占位符。
带问号的参数化语句
在第一个示例中,我们使用问号的语法。
<?php
$db = new SQLite3('test.db');
$stm = $db->prepare('SELECT * FROM cars WHERE id = ?');
$stm->bindValue(1, 3, SQLITE3_INTEGER);
$res = $stm->execute();
$row = $res->fetchArray(SQLITE3_NUM);
echo "{$row[0]} {$row[1]} {$row[2]}";
我们使用问号占位符选择一辆汽车。
$stm = $db->prepare('SELECT * FROM cars WHERE id = ?');
问号 ? 是值的占位符。这些值稍后被添加(绑定)到占位符。
$stm->bindValue(1, 3, SQLITE3_INTEGER);
使用 bindValue,我们将值 3 绑定到问号占位符。第一个参数是位置参数,用于标识占位符(可以有多个问号占位符)。
$ php prepared.php 3 Skoda 9000
带命名占位符的参数化语句
第二个示例使用带有命名占位符的参数化语句。
<?php
$db = new SQLite3('test.db');
$stm = $db->prepare('SELECT * FROM cars WHERE id = :id');
$stm->bindValue(':id', 1, SQLITE3_INTEGER);
$res = $stm->execute();
$row = $res->fetchArray(SQLITE3_NUM);
echo "{$row[0]} {$row[1]} {$row[2]}";
我们使用命名占位符选择特定的汽车。
$stm = $db->prepare('SELECT * FROM cars WHERE id = :id');
命名占位符以冒号字符开头。
PHP SQLite3 bind_param
bind_param 将参数绑定到语句变量。它可以用于处理多行。
<?php
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE friends(id INTEGER PRIMARY KEY, firstname TEXT, lastname TEXT)");
$stm = $db->prepare("INSERT INTO friends(firstname, lastname) VALUES (?, ?)");
$stm->bindParam(1, $firstName);
$stm->bindParam(2, $lastName);
$firstName = 'Peter';
$lastName = 'Novak';
$stm->execute();
$firstName = 'Lucy';
$lastName = 'Brown';
$stm->execute();
$res = $db->query('SELECT * FROM friends');
while ($row = $res->fetchArray()) {
echo "{$row[0]} {$row[1]} {$row[2]}\n";
}
在示例中,我们使用参数化语句将两行插入到表中。为了绑定占位符,我们使用 bind_param 方法。
$ php bind_param.php 1 Peter Novak 2 Lucy Brown
PHP SQLite3 元数据
元数据是关于数据库中数据的信息。SQLite 中的元数据包含有关存储数据的表和列的信息。SQL 语句影响的行数是元数据。结果集中返回的行数和列数也属于元数据。
可以使用特定的 PHP SQLite3 方法、PRAGMA 命令或查询 SQLite 系统 sqlite_master 表来获取 SQLite 中的元数据。
<?php
$db = new SQLite3('test.db');
$res = $db->query("SELECT * FROM cars WHERE id = 1");
$cols = $res->numColumns();
echo "There are {$cols} columns in the result set\n";
numColumns 返回结果集中列的数量。
$ php num_of_columns.php There are 3 columns in the result set
<?php
$db = new SQLite3('test.db');
$res = $db->query("PRAGMA table_info(cars)");
while ($row = $res->fetchArray(SQLITE3_NUM)) {
echo "{$row[0]} {$row[1]} {$row[2]}\n";
}
在此示例中,我们发出 PRAGMA table_info(tableName) 命令来获取有关 cars 表的一些元数据信息。
$res = $db->query("PRAGMA table_info(cars)");
PRAGMA table_info(tableName) 命令为 cars 表中的每一列返回一行。结果集中的列包括列顺序号、列名、数据类型、列是否可以为 NULL 以及列的默认值。
while ($row = $res->fetchArray(SQLITE3_NUM)) {
echo "{$row[0]} {$row[1]} {$row[2]}\n";
}
从提供的信息中,我们打印列顺序号、列名和列数据类型。
$ php column_names.php 0 id INTEGER 1 name TEXT 2 price INT
这是示例的输出。
在以下示例中,我们使用其列名打印 cars 表中的所有行。
<?php
$db = new SQLite3('test.db');
$res = $db->query("SELECT * FROM cars");
$col1 = $res->columnName(1);
$col2 = $res->columnName(2);
$header = sprintf("%-10s %s\n", $col1, $col2);
echo $header;
while ($row = $res->fetchArray()) {
$line = sprintf("%-10s %s\n", $row[1], $row[2]);
echo $line;
}
我们还使用列名将 cars 表的内容打印到控制台。记录与列名对齐。
$col1 = $res->columnName(1);
columnName 返回第 n 列的名称。
$header = sprintf("%-10s %s\n", $col1, $col2);
echo $header;
这些行打印了 cars 表的两个列名。
while ($row = $res->fetchArray()) {
$line = sprintf("%-10s %s\n", $row[1], $row[2]);
echo $line;
}
我们使用 while 循环打印行。数据与列名对齐。
$ php column_names2.php name price Audi 52642 Mercedes 57127 Skoda 9000 Volvo 29000 Bentley 350000 Citroen 21000 Hummer 41400 Volkswagen 21600
在下一个示例中,我们列出 test.db 数据库中的所有表。
<?php
$db = new SQLite3('test.db');
$res = $db->query("SELECT name FROM sqlite_master WHERE type='table'");
while ($row = $res->fetchArray(SQLITE3_NUM)) {
echo "{$row[0]}\n";
}
代码示例将指定数据库中的所有可用表打印到终端。
$res = $db->query("SELECT name FROM sqlite_master WHERE type='table'");
表名存储在系统表 sqlite_master 中。
$ php list_tables.php cars images
这些是我们系统上的表。
changes 返回最近的 SQL 语句修改、插入或删除的数据库行数。
<?php
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE friends(id INTEGER PRIMARY KEY, name TEXT)");
$db->exec("INSERT INTO friends(name) VALUES ('Tom')");
$db->exec("INSERT INTO friends(name) VALUES ('Rebecca')");
$db->exec("INSERT INTO friends(name) VALUES ('Jim')");
$db->exec("INSERT INTO friends(name) VALUES ('Robert')");
$db->exec('DELETE FROM friends');
$changes = $db->changes();
echo "The DELETE statement removed $changes rows";
示例返回已删除的行数。
$ php changes.php The DELETE statement removed 4 rows
PHP SQLite3 PDO 示例
PHP 数据对象 (PDO) 定义了一个用于访问 PHP 中数据库的轻量级接口。它提供了一个数据访问抽象层,用于在 PHP 中使用数据库。它定义了一个用于使用各种数据库系统的一致 API。
PHP PDO 是一个内置库;我们不需要安装它。
<?php
$pdo = new PDO('sqlite:test.db');
$stm = $pdo->query("SELECT * FROM cars");
$rows = $stm->fetchAll(PDO::FETCH_NUM);
foreach($rows as $row) {
printf("$row[0] $row[1] $row[2]\n");
}
示例使用 PHP PDO 获取所有表行。
Dibi 示例
PHP Dibi 是一个用于 PHP 的小巧而智能的数据库层。
$ composer req dibi/dibi
我们安装该库。
<?php
require('vendor/autoload.php');
$db = dibi::connect([
'driver' => 'sqlite',
'database' => 'test.db',
]);
$rows = $db->query('SELECT * FROM cars');
foreach ($rows as $row) {
$id = $row->id;
$name = $row->name;
$price = $row->price;
echo "$id $name $price \n";
}
示例从 cars 表中获取所有行。
Doctrine DBAL 示例
Doctrine 是一组 PHP 库,主要侧重于在 PHP 中提供持久性服务。它的主要项目是一个对象关系映射器 (ORM) 和数据库抽象层 (DBAL)。
$ composer req doctrine/dbal
我们安装 Doctrine DBAL 包。
<?php
require_once "vendor/autoload.php";
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\FetchMode;
$attrs = ['driver' => 'pdo_sqlite', 'path' => 'test.db'];
$conn = DriverManager::getConnection($attrs);
$queryBuilder = $conn->createQueryBuilder();
$queryBuilder->select('*')->from('cars');
$stm = $queryBuilder->execute();
$rows = $stm->fetchAll(FetchMode::NUMERIC);
foreach ($rows as $row) {
echo "{$row[0]} {$row[1]} {$row[2]}\n";
}
示例使用 Doctrine DBAL QueryBuilder 从 cars 表中检索所有行。
来源
这是 PHP SQLite 教程。
作者
列出所有 PHP 教程。