- SQLite3
- # SQLite3
- # SQLite3 Quickstart Tutorial
- # Creating/opening a database
- # Creating a table
- # Inserting sample data.
- # Fetching data
- # Shorthands
- # Cleaning up
- SQLite3::query
- Список параметров
- Возвращаемые значения
- Примеры
- User Contributed Notes 2 notes
- Основы использования SQLite3 в PHP
- Преимущества и ограничения
- Поддержка SQLite3 в PHP
- Особенности SQLite3
- Создание, открытие и закрытие базы данных
- Выполнение запроса
- Подготовленные запросы
- Выборка данных
- Sqliteman — инструмент администрирования БД Sqlite
SQLite3
To enable CURL and SQLITE3 on Windows with PHP 7.4 edit httpd.conf and php.ini as below:
# load php.ini from chosen directory
PHPIniDir «$/php»
# load PHP 7.4 on Windows
LoadModule php7_module «$/php/php7apache2_4.dll»
# load CURL on Windows
LoadFile «$/php/libssh2.dll»
# load SQLITE3 on Windows
LoadFile «$/php/libsqlite3.dll»
Now CURL and SQLITE3 are enabled and working fine on Windows on PHP 7.4.
As of PHP 5.4 support for Sqlite2 has been removed. I have a large web app that was built with sqlite2 as the database backend and thus it exploded when I updated PHP. If you’re in a similar situation I’ve written a few wrapper functions that will allow your app to work whilst you convert the code to sqlite3.
Firstly convert your DB to an sqlite3 db.
sqlite OLD.DB .dump | sqlite3 NEW.DB
Then add the following functions to your app:
function sqlite_open ( $location , $mode )
<
$handle = new SQLite3 ( $location );
return $handle ;
>
function sqlite_query ( $dbhandle , $query )
<
$array [ ‘dbhandle’ ] = $dbhandle ;
$array [ ‘query’ ] = $query ;
$result = $dbhandle -> query ( $query );
return $result ;
>
function sqlite_fetch_array (& $result , $type )
<
#Get Columns
$i = 0 ;
while ( $result -> columnName ( $i ))
<
$columns [ ] = $result -> columnName ( $i );
$i ++;
>
$resx = $result -> fetchArray ( SQLITE3_ASSOC );
return $resx ;
>
?>
They’re not perfect by any stretch but they seem to be working ok as a temporary measure while I convert the site.
Hope that helps someone
PHP doesn’t seem to support password protection for SQLite3. We can specify password on the db(I think) but you will still be able to open the DB without using a password so it is not working.
PHP 5.3.3 introduced sqlite3::busyTimeout(int milliseconds) which does not currently seem to be documented.
It believe it acts like sqlite::busyTimeout — that is it tells sqlite3 to call an internal busyHandler if SQLITE_BUSY is returned from any call which waits a short period and then retries. It continues to do this until milliseconds milliseconds have elapsed and then returns the SQLITE_BUSY status.
I don’t know whether the default 60 second value is in place if this function is not called.
# SQLite3
In addition to using LIMIT SQL statements you can also use the SQLite3 function querySingle to retrieve a single row, or the first column.
$database = new SQLite3('mysqlitedb.db'); //Without the optional second parameter set to true, this query would return just //the first column of the first row of results and be of the same type as columnName $database->querySingle('SELECT column1Name FROM table WHERE column2Name=1'); //With the optional entire_row parameter, this query would return an array of the //entire first row of query results. $database->querySingle('SELECT column1Name, column2Name FROM user WHERE column3Name=1', true); ?>
# SQLite3 Quickstart Tutorial
This is a complete example of all the commonly used SQLite related APIs. The aim is to get you up and running really fast. You can also get a runnable PHP file
# Creating/opening a database
Let’s create a new database first. Create it only if the file doesn’t exist and open it for reading/writing. The extension of the file is up to you, but .sqlite is pretty common and self-explanatory.
$db = new SQLite3('analytics.sqlite', SQLITE3_OPEN_CREATE | SQLITE3_OPEN_READWRITE);
# Creating a table
$db->query('CREATE TABLE IF NOT EXISTS "visits" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user_id" INTEGER, "url" VARCHAR, "time" DATETIME )');
# Inserting sample data.
It’s advisable to wrap related queries in a transaction (with keywords BEGIN and COMMIT ), even if you don’t care about atomicity. If you don’t do this, SQLite automatically wraps every single query in a transaction, which slows down everything immensely. If you’re new to SQLite, you may be surprised why the INSERTs are so slow
$db->exec('BEGIN'); $db->query('INSERT INTO "visits" ("user_id", "url", "time") VALUES (42, "/test", "2017-01-14 10:11:23")'); $db->query('INSERT INTO "visits" ("user_id", "url", "time") VALUES (42, "/test2", "2017-01-14 10:11:44")'); $db->exec('COMMIT');
Insert potentially unsafe data with a prepared statement. You can do this with named parameters:
$statement = $db->prepare('INSERT INTO "visits" ("user_id", "url", "time") VALUES (:uid, :url, :time)'); $statement->bindValue(':uid', 1337); $statement->bindValue(':url', '/test'); $statement->bindValue(':time', date('Y-m-d H:i:s')); $statement->execute(); you can reuse the statement with different values
# Fetching data
Let’s fetch today’s visits of user #42. We’ll use a prepared statement again, but with numbered parameters this time, which are more concise:
$statement = $db->prepare('SELECT * FROM "visits" WHERE "user_id" = ? AND "time" >= ?'); $statement->bindValue(1, 42); $statement->bindValue(2, '2017-01-14'); $result = $statement->execute(); echo "Get the 1st row as an associative array:\n"; print_r($result->fetchArray(SQLITE3_ASSOC)); echo "\n"; echo "Get the next row as a numeric array:\n"; print_r($result->fetchArray(SQLITE3_NUM)); echo "\n";
Note: If there are no more rows, fetchArray() returns false . You can take advantage of this in a while loop.
Free the memory — this in not done automatically, while your script is running
# Shorthands
Here’s a useful shorthand for fetching a single row as an associative array. The second parameter means we want all the selected columns.
Watch out, this shorthand doesn’t support parameter binding, but you can escape the strings instead. Always put the values in SINGLE quotes! Double quotes are used for table and column names (similar to backticks in MySQL).
$query = 'SELECT * FROM "visits" WHERE "url" = \'' . SQLite3::escapeString('/test') . '\' ORDER BY "id" DESC LIMIT 1'; $lastVisit = $db->querySingle($query, true); echo "Last visit of '/test':\n"; print_r($lastVisit); echo "\n";
Another useful shorthand for retrieving just one value.
$userCount = $db->querySingle('SELECT COUNT(DISTINCT "user_id") FROM "visits"'); echo "User count: $userCount\n"; echo "\n";
# Cleaning up
Finally, close the database. This is done automatically when the script finishes, though.
SQLite3::query
Выполняет SQL-запрос и возвращает объект SQLite3Result . Если запрос не возвращает результат (например, запрос типа DLM), то возвращённый объект SQLite3Result бесполезен. Для подобных запросов используйте метод SQLite3::exec() .
Список параметров
Возвращаемые значения
Возвращает объект SQLite3Result или false в случае возникновения ошибки.
Примеры
Пример #1 Пример использования SQLite3::query()
$results = $db -> query ( ‘SELECT bar FROM foo’ );
while ( $row = $results -> fetchArray ()) var_dump ( $row );
>
?>
User Contributed Notes 2 notes
The recommended way to do a SQLite3 query is to use a statement. For a table creation, a query might be fine (and easier) but for an insert, update or select, you should really use a statement, it’s really easier and safer as SQLite will escape your parameters according to their type. SQLite will also use less memory than if you created the whole query by yourself. Example:
$db = new SQLite3 ;
$statement = $db -> prepare ( ‘SELECT * FROM table WHERE > );
$statement -> bindValue ( ‘:id’ , $id );
$result = $statement -> execute ();
?>
You can also re-use a statement and change its parameters, just do $statement->reset(). Finally don’t forget to close a statement when you don’t need it anymore as it will free some memory.
Check with SQLite3Result::numColumns() for an empty result before calling SQLite3Result::fetchArray().
In contrast to the documentation SQLite3::query() always returns a SQLite3Result instance, not only for queries returning rows (SELECT, EXPLAIN). Each time SQLite3Result::fetchArray() is called on a result from a result-less query internally the query is executed again, which will most probably break your application.
For a framwork or API it’s not possible to know in before whether or not a query will return rows (SQLite3 supports multi-statement queries). Therefore the argument «Don’t execute query(‘CREATE . ‘)» is not valid.
Основы использования SQLite3 в PHP
В этой статье рассмотрим основы SQLite3 для PHP — полезной библиотеки (расширение для PHP), написанной на языке C, которая осуществляет механизм работы с данными с помощью SQL. Фактически, это безтиповая база данных, которая содержится всего в одном файле, который в свою очередь находится в самом проекте (в его файловой системе). Технически в этой базе всё — строки. Мы указываем тип данных для самой библиотеки, чтобы она сама «разруливала» сортировку по числовым полям.
Преимущества и ограничения
- Полностью бесплатна
- Нет необходимости в средствах администрирования
- Высокая производительность и легкая переносимость
- Поддержка процедурного и объектно-ориентированного интерфейсов
- Хранение больших объемов данных
- Хранение строк и бинарных данных неограниченной длины
- Предназначена для небольших и средних приложений
- Основной выигрыш в производительности, если преобладают операции вставки и выборки данных
- При чрезвычайно активном обращении к данным, или в случае частых сортировок, SQLite работает медленнее своих конкурентов
Поддержка SQLite3 в PHP
- ВPHP 5.0 поддержка SQLite версии 2 была встроена в ядро
- Начиная с PHP 5.1 поддержка SQLite вынесена за пределы ядра php_sqlite
- В PHP 5.3 добавлена поддержка SQLite версии 3 php_sqlite3
- В PHP 5.4 поддержка SQLite версии 2 удалена php_sqlite
Особенности SQLite3
CREATE TABLE users(id INTEGER, name TEXT, age INTEGER)
CREATE TABLE users(id, name, age)
Для задания первичного ключа
id INTEGER PRIMARY KEY id INTEGER PRIMARY KEY AUTOINCREMENT
Экранирование строк через двойной апостроф
Создание, открытие и закрытие базы данных
//Создаём или открываем базу данных test.db $db = new SQLite3("test.db"); //Закрываем базу данных без удаления объекта $db->close(); //Открываем другую базу данных для работы $db->open("another.db"); //Удаляем объект unset($db);
Выполнение запроса
//Экранирование строк $name = $db->escapeString($name); //Для запросов без выборки данных $sql = "INSERT INTO users (name, age) VALUES ('$name', 25)"; //Возвращает значение булева типа $result = $db->exec($sql); //Количество изменённых записей echo $db->changes(); //Отслеживание ошибок echo $db->lastErrorCode(); echo $db->lastErrorMsg();
Подготовленные запросы
$sql = "INSERT INTO users (name, age) VALUES (:name, :age)"; //Готовим запрос $stmt = $db->prepare($sql); //Привязываем параметры $stmt->bindParam(':name',$name); $stmt->bindParam(':age',$age); //Исполняем запрос $result = $stmt->execute(); //Закрываем при необходимости $stmt->close();
Выборка данных
$sql = "SELECT name, age FROM users"; // В случае неудачи возвращает false $result = $db->querySingle($sql); //В $result - значение первого поля первой записи $result = $db->querySingle($sql, true); // В $result - массив значений первой записи // Стандартная выборка $result = $db->query($sql); // Обработка выборки $row = $result->fetchArray(); // SQLITE3_BOTH // Получаем ассоциативный массив $row = $result->fetchArray(SQLITE3_ASSOC); // Получаем индексированный массив $row = $result->fetchArray(SQLITE3_NUM);
Sqliteman — инструмент администрирования БД Sqlite
Предлагаю присмотреться к очень полезному инструменту для Sqlite3. Это аналог привычного phpmyadmin для MySql. Программа имеет неплохой графический интерфейс на русском языке, является портативной и не требует установки на ПК. Скачать Sqliteman можно по этой ссылке.
Ещё один популярный менеджер баз данных Sqlite — SQLiteStudio