Что такое SQLite
SQLite — база данных, не требующая выделенного сервера. Представляющая собой библиотеку, написанную на языке C. Используется для небольших проектов. В тех случаях, когда количество одновременных запросов к приложению, среднее или ниже среднего. По сути — это работа с файлом через sql запросы.
Преимущества:
- самодостаточность (не требуется отдельный сервер),
- простота,
- встраиваемость (движок полностью встроен в PHP 5.3 и до 7.2),
- минимальное потребление ресурсов приложения.
Особенности SQLite
Таблицы можно создавать, как с указанием типа данных — CREATE TABLE users(id INTEGER, name TEXT,age INTEGER),так и без указания типа данных — CREATE TABLE users(id, name, age).
Создание первичного ключа можно реализовать также двумя способами — id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY AUTOINCREMENT.
Экранирование строк осуществляется через двойной апостроф ‘Harry O»Brian’.
Создание, открытие и закрытие базы данных SQLite3
Создаем и\или открываем базу данных name.db. Т.е. создаем объект и в качестве аргумента, строкой передаем путь, имя и расширение файла.
$db_name = new SQLite3("db/name.db");
Закрываем базу данных, но не удаляем объект
$db_name->close();
Открываем другую базу данных для работы
$db_name->open("another.db");
Удаление объекта
unset($db_name);
Для работы с SQLite3 у нас есть 3 класса. Это:
- Класс SQLite3, позволяет создать БД, просмотреть сообщения об ошибках (если таковые имеются,), делать запросы в БД и т.д.
- Класс SQLite3Stmt, предоставляющий доступ к подготовленным запросам в SQLite 3 расширении.
- Класс SQLite3Result — экземпляр этого класса возвращается в ответ, на запрос выборки из БД. Т.е. отправляем запрос «SELECT», используя метод класса SQLite3, но из БД нам приходит не сами запрашиваемые данные, а экземпляр класса, предоставляющий доступ к результирующему набору.
Подготовленные запросы
Работают аналогично с mysql, только вместо символа "?" используется - ":". Эффективны в борьбе с SQL инъекциями.
$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();
Простой пример основных действий с БД SQLite3
//Набор стартовых данных $name = 'Anton'; $age = 35; $e_mail = 'anton35@gmail.com'; //Создание файла БД $db = new SQLite3('user.db'); //Создаем таблицу /*создаем sql запрос*/ $sql="CREATE TABLE user( id INTEGER PRIMARY KEY, name TEXT, age INTEGER, e_mail TEXT)"; /*Осуществляем запрос в БД*/ if($db->exec($sql)){ echo '1.Таблица создана'; } //Заполняем таблицу данными /*создаем sql запрос*/ $sql_insert = "INSERT INTO user (name, age, e_mail) VALUES('$name', $age, '$e_mail')"; /*Осуществляем запрос в БД*/ if($db->exec($sql_insert)){ echo '2.Таблица заполнена данными'; } //Получаем данные из БД /*создаем sql запрос*/ $sql = "SELECT id, name, age, e_mail FROM user"; /*Осуществляем запрос в БД*/ $result = $db->query($sql);//этот запрос вернет нам не сами данные, //а экземпляр класса SQLite3Result $array = array(); while($data = $result->fetchArray(SQLITE3_ASSOC)) { $array[] = $data; } print_r($array);
Пример работы SQLite3 в PHP из урока
<!-- Файл news.php --> <!-- Основной файл ленты новостей или поле действий объектов --> require 'NewsDB.class.php'; $news = new NewsDB(); $errMsg = ''; if($_SERVER['REQUEST_METHOD'] == 'POST'){ require 'save_news.php'; } if(isset($_GET['del'])){ require "delete_news.php"; } echo "<h1>Последние новости</h1>"; if($errMsg){ echo '<h3>$errMsg</h3>'; } echo "<form action='/sqlite/news.php' method='post'> <p>Заголовок новости:<br> <input type='text' name='title' style='width:200px;'><br><br> Выберите категорию:<br> <select name='category'> <option value='1'>Наука</option> <option value='2'>Образование</option> <option value='3'>Культура</option> </select><br><br> Текст новости:</p> <textarea name='description' cols='90' rows='10' style='width:100%'> </textarea><br> <p>Источник: <input type='text' name='source'> <br><br> <input type='submit' value='Добавить'></p> </form>"; require_once 'get_news.php'; <!--Файл INewsDB.class.php--> <!-- интерфейс INewsDB с декларациями методов --> <?php //Interface INewsDB //содержит основные методы работы с новостной лентой Interface INewsDB{ // Добавление новой записи в новостную ленту // @param string $title - заголовок новости // @param string $category - категория новости // @param string $description - текст новости // @param string $source - источник новости // @return boolean - результат успех/ошибка function saveNews($title,$category,$description,$source); // Выборка всех записей в новостную ленту // @return array - результат в виде массива function getNews(); // Удаление записи из новостной ленты // @param integer $id - id новости // @return boolean - результат успех/ошибка function deleteNews($id); } <!-- Файл NewsDB.class.php--> <!-- класс реализующий интерфейс INewsDB --> require 'INewsDB.class.php'; class NewsDB implements INewsDB{ const DB_NAME = 'news.dp'; const ERROR_PROP = 'Wrong property name'; private $_db; function __construct(){ $this->_db = new SQLite3(self::DB_NAME); if(!filesize(self::DB_NAME)){ try{ $sql = "CREATE TABLE msgs( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, category INTEGER, description TEXT, source TEXT, datetime INTEGER)"; if(!$this->_db->exec($sql)) throw new Exception('Не могу создать таблицу'); $sql = "CREATE TABLE category( id INTEGER, name TEXT)"; if(!$this->_db->exec($sql)) throw new Exception('Не могу создать таблицу'); $sql = "INSERT INTO category(id,name) SELECT 1 as id, 'Наука' as name UNION SELECT 2 as id, 'Образование' as name UNION SELECT 3 as id, 'Культура' as name"; if(!$this->_db->exec($sql)) throw new Exception('Не могу создать таблицу'); }catch(Exception $e){ die($e->getMessage); } } } function __destruct(){ unset($this->_db); } function __get($name){ if($name == 'db'){ return $this->_db; }else{ throw new Exception("Wrong property name"); } } function __set($name, $value){ throw new Exception(self::ERROR_PROP); } function saveNews($title, $category, $description, $source){ $dt = time(); $sql = "INSERT INTO msgs(title,category,description,source,datetime) VALUES('$title',$category,'$description','$source',$dt)"; return $this->_db->exec($sql); } function db2Arr($data){ $arr =[]; while($row = $data->fetchArray(SQLITE3_ASSOC)){ $arr[] = $row; } return $arr; } function getNews(){ $sql = "SELECT msgs.id as id, title, category.name as category, description, source, datetime FROM msgs, category WHERE category.id = msgs.category ORDER BY msgs.id DESC"; $items = $this->_db->query($sql); if(!$items) return false; return $this->db2Arr($items); } function deleteNews($id){ $sql = "DELETE FROM msgs WHERE id=$id"; return $this->_db->exec($sql); } function escape($data){ return $this->_db->escapeString(trim(strip_tags($data))); } } <!-- Файл save_news.php --> <!-- php-код обработки данных для добавления записи в таблицу --> $title = $news->escape($_POST['title']); $category = abs((int)$_POST['category']); $description = $news->escape($_POST['description']); $source = $news->escape($_POST['source']); if(empty($title) or empty($description)){ $errMsg = 'Заполните все поля формы!'; } else { if(!$news->saveNews($title, $category, $description, $source)){ $errMsg = 'Произошла ошибка при добавлении новости'; } else { header("Location: news.php"); exit; } } <!-- Файл delete_news.php --> <!-- php-код обработки данных для удаления записи из таблицы БД --> $id = abs((int)$_GET['del']); if($id){ if(!$news->deleteNews($id)){ $errMsg = "Произошла ошибка при удалении новости"; } else { header("Location: news.php"); exit; } } <!-- Файл get_news.php --> $items = $news->getNews(); if($items === false){ $errMsg = 'Произошла ошибка при выводе новостной ленты'; } elseif(!count($items)) { $errMsg = "Новостей нет"; } else { foreach($items as $item){ $dt = date("d-m-Y H:i:s", $item['datetime']); $desc = nl2br($item['description']); echo " <h3> {$item['title']} </h3> <p> $desc <br> {$item['category']} @ $dt</p> <p align ='right'> <a href='news.php?del={$item['id']}'> Удалить </a> </p>"; } }
Автор Виталий Сухомлинов
практикующий веб разработчик
и seo-специалист