Класс для работы с базой данных SQLite в PHP
 
			Доброго времени суток! В данной статье мы рассмотрим с Вами пример реализации работы с базой данных SQLite в PHP.
SQLite - это переносимая база данных, которая, как правило, представлена одним файлом. В PHP 8 расширение с этой БД поставляется по умолчанию, т.е. дополнительно ничего устанавливать не требуется.
И так, для начала определим интерфейс для работы с базой. Зачем это нужно? Например, через некоторое время нам понадобиться перейти с SQLite на MySQL. Если мы будем использовать интерфейс - достаточно будет поменять реализацию в одном месте программы.
Код с интерфейсом DBInterface.php
<?php
namespace App\Core;
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 App\Core;
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, например.
- 
					Создано 02.05.2023 08:43:07  
- 
					 Михаил Русаков Михаил Русаков
 
			 
			 
		 
				 
			 
				 
				 
				 
				
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.