Класс для работы с базой данных 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, например.

Источник

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

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