Практическое использование ООП с базой данных SQLite3

Содержание:


Что такое 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, но из БД нам приходит не сами запрашиваемые данные, а экземпляр класса, предоставляющий доступ к результирующему набору.

Простой пример основных действий с БД 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-специалист
и программист любитель

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *