PHP 8.4.0 RC4 available for testing

SQLite3::open

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

SQLite3::openВідкриває базу даних SQLite

Опис

public SQLite3::open(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryption_key = ?): void

Відкриває базу даних SQLite 3. Якщо база даних має шифрування, то буде спроба використати encryption_key (ключ шифрування).

Параметри

filename

Шлях до бази даних SQLite, або рядок із записом :memory:, щоб використовувати базу даних в пам'яті.

flags

Необов'язковий флаг, для визначення - як саме відкривати базу даних SQLite. Початково, при відкритті використовується SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE.

  • SQLITE3_OPEN_READONLY: Відкриває базу даних лише для читання.

  • SQLITE3_OPEN_READWRITE: Відкриває базу даних для читання та запису.

  • SQLITE3_OPEN_CREATE: Створює базу даних, якщо вона не існує.

encryption_key

Необов'язковий ключ шифра, що використовується при шифруванні та дешифруванні бази даних SQLite.

Значення, що повертаються

Не повертає значень.

Приклади

Приклад #1 SQLite3::open()

<?php
/**
* Простий приклад наслідування класа SQLite3 та зміна параметра для __construct,
* з подальшим використанням метода open для ініціалізації бази даних.
*/
class MyDB extends SQLite3
{
function
__construct()
{
$this->open('mysqlitedb.db');
}
}

$db = new MyDB();

$db->exec('CREATE TABLE foo (bar STRING)');
$db->exec("INSERT INTO foo (bar) VALUES ('Це перевірка')");

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

add a note

User Contributed Notes 4 notes

up
5
susan at itsasmartsolve dot co dot za
8 years ago
[Editor's note: see <https://www.sqlite.org/backup.html>]

Just a quick note on not being able to open() two databases together and copy the exact info, say for instance to create a backup db. I searched the net for and answer, none of which served. The comment and solution of attaching seems complicated to me. Eventually I worked out that the same result could be more simply accomplished using the copy() function.
<?php
copy
("old.db", "new.db");
?>
up
2
BenWa
6 years ago
If you plan to have concurrent access to a SQLITE3 database, it is advised to change the default SQLite3::busyTimeout value (set to zero by default). Otherwise, you may get a "database locked" error while writing to the database.

With the timeout set to a non zero value, a write attempt to a locked database will wait for the lock to be released (within the timeout) before sending an error.

Note that the default value was set to 60 seconds on SQLITE2.
up
2
jtreurniet at example dot com
7 years ago
Note that the SQLITE3_OPEN_READONLY flag cannot be combined with the SQLITE3_OPEN_CREATE flag. If you combine both of these flags, a rather unhelpful "Unable to open database: out of memory" exception will be thrown.
up
2
kbrobst at surveyresearchpartners dot com
14 years ago
If you are trying to use the open() method to open multiple database files within the same SQLite3 object (which I could not get to work), here is an alternative way to do so using special SQLite3 syntax additions to the SQL language. This took some investigation on my part, so hopefully the solution I found will help you too.

These are the nice features within SQLite3 that are leveraged:
* The create statement query for a table is stored within a table called "sqlite_master" within the parent database file.
* SQLite3 supports the "insert into...select * from" SQL syntax for doing bulkload-speed inserts into a table - but what if the source and target tables are in separate database files?
* SQLite3 has an "attach [filename] as [reference database name]" which will allow multiple database files to be opened and accessible to the same SQLite3 object.

Assume you have a table called "my_template" in the SQLite3 database file "source.db". You want to make a copy of this table into the database file "target.db" and call the table "working_table".

<?php
//attach the source database file to the bulkload connection object;
$bulkload_connection = new SQLite3("c:/sqlite3_database_files/source.db");

//retrieve the create statement query for the source table;
$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());

//build the create statement query for the target table;
$targettbl_create_statement = str_replace('CREATE TABLE my_template', 'CREATE TABLE bulkload.working_table', $sourcetbl_create_statement);

//attach the target database file to the bulkload connection object - and reference it as the database called [bulkload];
$result=$bulkload_connection->exec("attach 'c:/sqlite3_database_files/target.db' as bulkload");
if (
$result===false) exit($bulkload_connection->lastErrorMsg());

//issue the query to create the target table within the target database file;
$result=$bulkload_connection->exec($targettbl_create_statement);
if (
$result===false) exit($bulkload_connection->lastErrorMsg());

//copy the rows from the source table to the target table as quickly as possible;
$result=$bulkload_connection->exec("insert into bulkload.working_table select * from my_template");
if (
$result===false) exit($bulkload_connection->lastErrorMsg());

//release the OS file locks on the attached database files;
$bulkload_connection->close();
unset(
$bulkload_connection);
?>
To Top