PHP Conference Japan 2024

SQLite3::open

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::open打开 SQLite 数据库

描述

public SQLite3::open(字符串 $filename, 整数 $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, 字符串 $encryptionKey = ""): 空值

打开一个 SQLite 3 数据库。如果构建包含加密,则它将尝试使用密钥。

参数

filename

SQLite 数据库的路径,或 :memory: 用于使用内存数据库。

flags

用于确定如何打开 SQLite 数据库的可选标志。默认情况下,open 使用 SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE

encryptionKey

加密和解密 SQLite 数据库时使用的可选加密密钥。如果未安装 SQLite 加密模块,则此参数无效。

返回值

不返回值。

示例

示例 #1 SQLite3::open() 示例

<?php
/**
* 扩展 SQLite3 类并更改 __construct
* 参数的简单示例,然后使用 open 方法初始化 DB。
*/
MyDB 扩展 SQLite3
{
函数
__construct()
{
$this->open('mysqlitedb.db');
}
}

$db = new MyDB();

$db->exec('CREATE TABLE foo (bar STRING)');
$db->exec("INSERT INTO foo (bar) VALUES ('This is a test')");

$result = $db->query('SELECT bar FROM foo');
var_dump($result->fetchArray());
?>

添加注释

用户贡献的注释 4 个注释

susan at itsasmartsolve dot co dot za
8 年前
[编辑注:请参阅 <https://www.sqlite.org/backup.html>]

关于无法同时打开两个数据库并复制完全相同的信息(例如,创建备份数据库)的快速说明。我在网上搜索了答案,但没有一个能解决问题。附加的评论和解决方案对我来说很复杂。最终我发现可以使用 copy() 函数更简单地实现相同的结果。
<?php
copy
("old.db", "new.db");
?>
BenWa
6 年前
如果您计划同时访问 SQLITE3 数据库,建议更改默认的 SQLite3::busyTimeout 值(默认为零)。否则,您可能在写入数据库时收到“数据库锁定”错误。

通过将超时设置为非零值,对已锁定数据库的写入尝试将在发送错误之前等待锁释放(在超时时间内)。

请注意,SQLITE2 的默认值为 60 秒。
jtreurniet at example dot com
7 年前
请注意,SQLITE3_OPEN_READONLY 标志不能与 SQLITE3_OPEN_CREATE 标志组合使用。如果您同时使用这两个标志,则会抛出一个相当无用的“无法打开数据库:内存不足”异常。
kbrobst at surveyresearchpartners dot com
14 年前
如果您尝试使用 open() 方法在同一个 SQLite3 对象中打开多个数据库文件(我无法使其工作),以下是在使用 SQL 语言的特殊 SQLite3 语法添加内容的另一种方法。这需要我进行一些调查,因此希望我找到的解决方案也能帮助您。

这些是 SQLite3 中被利用的良好特性
* 表的创建语句查询存储在父数据库文件中的名为“sqlite_master”的表中。
* SQLite3 支持“insert into...select * from”SQL 语法,用于对表进行批量加载速度的插入 - 但如果源表和目标表在单独的数据库文件中怎么办?
* SQLite3 有一个“attach [filename] as [reference database name]”,它允许打开多个数据库文件并使其可访问同一个 SQLite3 对象。

假设您在 SQLite3 数据库文件“source.db”中有一个名为“my_template”的表。您想将此表的副本复制到数据库文件“target.db”中,并将表命名为“working_table”。

<?php
//将源数据库文件附加到批量加载连接对象;
$bulkload_connection = new SQLite3("c:/sqlite3_database_files/source.db");

//检索源表的创建语句查询;
$sourcetbl_create_statement = $bulkload_connection->querySingle("select sql from sqlite_master where type='table' and name='my_template'");
if (
$sourcetbl_create_statement===false) exit($bulkload_connection->lastErrorMsg());

//构建目标表的创建语句查询;
$targettbl_create_statement = str_replace('CREATE TABLE my_template', 'CREATE TABLE bulkload.working_table', $sourcetbl_create_statement);

//将目标数据库文件附加到批量加载连接对象 - 并将其引用为名为[bulkload]的数据库;
$result=$bulkload_connection->exec("attach 'c:/sqlite3_database_files/target.db' as bulkload");
if (
$result===false) exit($bulkload_connection->lastErrorMsg());

//发出在目标数据库文件中创建目标表的查询;
$result=$bulkload_connection->exec($targettbl_create_statement);
if (
$result===false) exit($bulkload_connection->lastErrorMsg());

//尽快将源表中的行复制到目标表;
$result=$bulkload_connection->exec("insert into bulkload.working_table select * from my_template");
if (
$result===false) exit($bulkload_connection->lastErrorMsg());

//释放附加的数据库文件上的操作系统文件锁;
$bulkload_connection->close();
unset(
$bulkload_connection);
?>
To Top