Открытие SQLite3 как READONLY с PDO?

У класса SQLite3 есть такая опция.

$db = new SQLite3('mysqlitedb.db', SQLITE3_OPEN_READONLY);

В PDO вы просто откроете с помощью:

$db = new PDO('sqlite:mysqlitedb.db');

Однако мой вопрос заключается в том, есть ли способ открыть базу данных с помощью PDO в режиме READONLY?


person Karl Blessing    schedule 29.08.2009    source источник


Ответы (2)


Это станет возможным с выпуском PHP 7.3 (релиз ожидается в конце 2018 года).

Синтаксис следующий:

$db = new PDO('sqlite:mysqlitedb.db', null, null, [PDO::SQLITE_ATTR_OPEN_FLAGS => PDO::SQLITE_OPEN_READONLY]);

Верхняя фиксация

person anthonyryan1    schedule 12.09.2017
comment
Это действительно доступно с PHP 7.3 (сейчас протестировано с PHP 7.3.3) - person Mathieu Rey; 01.04.2019
comment
Он вернет попытку записи в базу данных только для чтения, если вы попытаетесь что-то записать в базу данных. Однако это не означает, что кто-то другой может в это же время записывать в базу данных. Он по-прежнему блокирует базу данных. Например, если вы одновременно попытаетесь использовать sqlite3 в командной строке в той же базе данных и попытаетесь что-то написать, вы получите ошибку «Ошибка: база данных заблокирована». - person Mathieu Rey; 01.04.2019

Я не думаю, что это возможно с pdo (пока?).
Драйвер pdo_sqlite для php 5.3 использует sqlite3_open() в pdo_sqlite_handle_factory(), но вам нужно sqlite3_open_v2(), чтобы передать флаг только для чтения.

edit:
Но установить патч было бы довольно просто. Взгляните на pdo_mysql_handle_factory() в ext/pdo_mysql/mysql_driver.c и на то, как он использует struct pdo_data_src_parser vars[] для разбора строки DNS.

person VolkerK    schedule 29.08.2009