Класс для работы с базой данных SQLite в PHP

Класс для работы с базой данных SQLite в PHP

Класс для работы с базой данных SQLite в PHP

Доброго времени суток! В данной статье мы рассмотрим с Вами пример реализации работы с базой данных SQLite в PHP.

SQLite — это переносимая база данных, которая, как правило, представлена одним файлом. В PHP 8 расширение с этой БД
поставляется по умолчанию, т.е. дополнительно ничего устанавливать не требуется.

И так, для начала определим интерфейс для работы с базой. Зачем это нужно? Например, через некоторое время нам понадобиться
перейти с SQLite на MySQL. Если мы будем использовать интерфейс — достаточно будет поменять реализацию в одном месте
программы.

Код с интерфейсом DBInterface.php



<?php



namespace AppCore;



interface DBInterface

{

    // название таблицы с которой будем работать

    public function table(string $table);



    // возвращает все строки

    public function getAll(int $limit);



    // возвращает строку таблицы по ее id - первичный ключ

    public function get($id);



    // вставляет значение в таблицу

    public function insert($data);



    // обновляет

    public function update($id, $data);



    // удаляет

    public function delete($id);

}



А теперь пример реализации интерфейса выше. Реализация будет для БД SQLite.

Файл SQLiteDB.php



<?php



namespace AppCore;





class SQLiteDB implements DBInterface

{

    // для работы с SQLite используем PDO (расширение pdo_sqlite)

    private PDO $db;

    private static ?SQLiteDatabase $instance = null;

    private string $table;





    // запрещаем напрямую создавать объект класса

    private function __construct(string $pathToDb)

    {

        $this->db = new PDO("sqlite:" . $pathToDb);

        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    }



    // несколько вызовов connect вернут один экземпляр подключения к БД

    public static function connect(string $dbFile): self

    {

        if (self::$instance == null) {

            self::$instance = new self($dbFile);

        }



        return self::$instance;

    }



    /**

    * 

    * После вызова конструктора класса, нужно (!) вызвать данный метод и передать в него название таблицы

    * с которой будет идти работа 

    * 

    * @param string $table

    * @return void

     */

    public function table(string $table): void

    {

        $this->table = $table;

    }



    public function get($id)

    {

        $sql = sprintf("SELECT * FROM %s WHERE id = :id", $this->table);

        $stmt = $this->db->prepare($sql);



        $stmt->bindParam(":id", $id);

        $stmt->execute();



        return $stmt->fetch(PDO::FETCH_ASSOC);

    }



    public function getAll(int $limit = 3): array

    {

        $sql = "SELECT * FROM $this->table LIMIT :limit";

        $statement = $this->db->prepare($sql);

        $statement->bindParam(":limit", $limit);

        $statement->execute();



        return $statement->fetchAll(PDO::FETCH_ASSOC);

    }



    public function insert($data): bool

    {

        $keys = implode(", ", array_keys($data));

        $values = ":" . implode(", :", array_keys($data));

        $sql = sprintf("INSERT INTO %s (%s) VALUES (%s)", $this->table, $keys, $values);



        $statement = $this->db->prepare($sql);



        foreach ($data as $key => $value) {

            $statement->bindValue(":$key", $value);

        }



        return $statement->execute();

    }



    public function update($id, $data): int

    {

        $set = [];

        foreach ($data as $key => $value) {

            $set[] = "$key = :$key";

        }



        $set = implode(", ", $set);

        $sql = "UPDATE $this->table SET $set WHERE id = :id";



        $stmt = $this->db->prepare($sql);

        $stmt->bindParam(":id", $id);



        foreach ($data as $key => $value) {

            $stmt->bindValue(":$key", $value);

        }



        return $stmt->execute();

    }



    public function delete($id): int

    {

        $sql = "DELETE FROM $this->table WHERE id = :id";

        $stmt = $this->db->prepare($sql);

        $stmt->bindParam(":id", $id);

        return $stmt->execute();

    }

}



Как использовать?



// здесь у Вас уже должна быть некая база со строками в таблице posts

$db = SQLiteDB::connect("app_02052023.db");

$db->table("posts");



// получаем первые 10 статей

$posts = $db->getAll(10);

print_r($posts);



// получаем статью с идентификатором 1

$post = $db->get(1);

print_r($post);



Вот так просто можно организовать работу с базой SQLite в PHP через PDO, а реализация интерфейса DBInterface, при необходимости,
позволит перейти на БД MySQL, например.

Источник

НЕТ КОММЕНТАРИЕВ

Оставить комментарий