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