
Начиная с последней на сегодня версии интерпретатора PHP 5.3.0 в его стандартную поставку был внедрён новый класс под названием SQLite3. Сама библиотека SQLite обладает большим потенциалом в сфере не очень больших web-разработок, так как имеет сравнительно высокую скорость работы. Несомненным плюсом для таких проектов является и то, что фактически вся база хранится в одном файле, рядом со всеми остальными файлами. Это сказывается как на удобстве портируемости, так и на том, что формально функция защиты базы переносится на файловую систему — как минимум придётся запоминать меньше паролей. Учитывая все эти и многие другие плюсы, а также со взглядом на будущее, когда новая версия интерпретатора PHP будет внедрена на большинстве серверов, я решил написать небольшой урок о том, как работать с базой данных третьей версии формата, а заодно и узнать у более опытных, всё ли правильно я усвоил из документации.
Все подобные уроки, что я видел ранее основываются на работе с встроенными функциями sqlite_*, однако сразу скажу, что они уже давно устарели, ибо для работы используют формат SQLite 2.
Итак, как и в случае с любой другой базой данных для начала работы требуется создать соединение. Для этого просто создаём новый экземпляр класса, указав параметр с именем файла:
$db = new SQLite3('example.sqlite');
Всего конструктору можно передать до 3-х параметров. Первым — имя файла с БД, вторым — флаги открытия (только для чтения — SQLITE3_OPEN_READONLY), если использовать значения по умолчанию, то база откроется для чтения и записи, а также в случае отсутствия файла с БД он будет создан, а третьим параметром указывается ключ, который используется для расшифровки файла, если база внутри него хранится в шифрованном виде.
Учитывая, что по сути мы работаем с файлами, закрывать соединение имеет смысл только в случае, если мы собираемся создавать новое, когда в старом больше не нуждаемся, потому что интерпретатор сам закроет все открытые файлы по завершении сценария. Однако, если это требуется, то делать это надо так:
$db->close();
Вся дальнейшая работа с БД должна происходить между этими двумя действиями. Самой важной функцией класса можно считать query(). Работать с ней надо так:
$results = $db->query('SELECT emails FROM users');
while($row = $results->fetchArray())
{
var_dump($row);
}
Однако в случае, когда запрос явно предполагает, что в ответ база вернёт всего одну строку, либо же Вас интересует лишь первый результат, следует использовать querySingle():
$results = $db->querySingle('SELECT name, email FROM user WHERE id=1');
В приведённом выше примере переменная $results будет содержать лишь значение столбца name. Второй булевый необязательный параметр указывает на то, что результатом будет ассоциативный массив. Для большей ясности приведу ещё один пример этой же функции:
$results = $db->querySingle('SELECT name, email FROM user WHERE id=1', true);
echo 'e-mail пользователя ' . $results['name'] . ' - ' . $results['email'];
В некоторых случаях, результат операции требуется опустить. Это происходит когда Вы выполняете, например, «INSERT», «UPDATE», или «DELETE». В таких случаях нас интересует лишь успешность выполненного запроса, о чём можно судить благодаря булевой функции exec:
if($db->exec('CREATE TABLE foo (foo STRING)')) { …; }
Во время использования конструкций вроде «INSERT» и «UPDATE» очень важно помнить об опасности SQL-инъекции, поэтому вводимые данные лучше обрабатывать. Важно сразу уяснить, что использование стандартного addslashes() может привести к плохим последствиям. Поэтому в наборе средств работы с SQLite имеется специальная функция escapeString(). Как её использовать, думаю, итак понятно.
Ну и самое важное в любой работе с БД — это отлов ошибок. Для этих целей служат 2 функции: lastErrorCode() и lastErrorMsg(). Первая возвращает код ошибки, зафиксированной в результате выполнения самого последнего запроса, а вторая текстовое описание результата последней транзакции на английском языке. Обе функции не требуют никаких значений в качестве фактических параметров.
На этом я, пожалуй, остановлюсь и отправлю Вас за дополнительной порцией информации уже к официальной документации на английском языке, тем более, что рассказал я в этом уроке далеко не о всех возможностях класса-новобранца. За бортом остались, например, подготовка запроса к выполнению и создание callback-функций PHP, однако изложенного выше материала я считаю вполне достаточно для того, чтобы вникнуть в соль построения web-приложений на базе SQLite3.
Трудно найти хостинг с Sqlite3 без PDO.
Где-то находил информацию, что в php sqlite3 будет использоваться только c PDO, а для поддержки совместимости со старыми версиями – нативная sqlite2.