2025-08-15 13:21:46 +03:00

159 lines
6.2 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace goodboyalex\php_db_components_pack\classes;
use Closure;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\models\DBConfig;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseCountExist;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseDelete;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseGet;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseInsert;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseQueryExecute;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseSpecial;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseTableManagement;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseTransactions;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseUpdate;
use PDO;
use PDOException;
/**
* Класс для работы с базой данных.
*
* Используется класс PDO для подключения к базе данных.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0.1
* @since 1.0
* @see PDO
*/
final class Database
{
/**
* @var PDO|null $DataBaseHandle Переменная, хранящая класс PDO.
*/
private ?PDO $DataBaseHandle;
/**
* @var string $DBSignOpen Символ открытия для подстановки в запросы к базе.
*/
private string $DBSignOpen;
/**
* @var string $DBSignСlose Символ закрытия для подстановки в запросы к базе.
*/
private string $DBSignClose;
/**
* @var Closure $OnException Обработчик исключений. Анонимная функция формата:
*
* function (Exception $e, bool $isTerminate): void
*/
private Closure $OnException;
/**
* @var DBConfig $Config Конфигурация подключения к базе данных.
*/
private DBConfig $Config;
/**
* Конструктор.
*
* @param DBConfig $config Конфигурация подключения к базе данных.
* @param callable $onException Обработчик исключений. Анонимная функция формата:
*
* function (Exception $e, bool $isTerminate): void
*/
public function __construct (DBConfig $config, callable $onException)
{
// Задаю конфигурацию
$this->Config = $config;
// Устанавливаю обработчик исключений
$this->OnException = $onException;
try {
// Загружаю параметры подключения
// - хост
$host = $this->Config->Host;
// - порт
$port = $this->Config->Port;
// - имя базы данных
$dbname = $this->Config->Name;
// - пользователь
$user = $this->Config->UserName;
// - пароль
$password = $this->Config->Password;
// Создаю dsn
$dsn = match ($this->Config->Driver) {
DBDriver::MySQL => "mysql:host=$host;port=$port;dbname=$dbname",
DBDriver::MSSQL => "sqlsrv:Server=$host,$port;Database=$dbname;Encrypt=false;",
DBDriver::PostgreSQL => "pgsql:host=$host;port=$port;dbname=$dbname;",
DBDriver::OracleDB => "oci:dbname=$host:$port/$dbname",
DBDriver::SQLite => "sqlite:$dbname"
};
// Задаю DBSign
// - Open
$this->DBSignOpen = match ($this->Config->Driver) {
DBDriver::MySQL, DBDriver::SQLite => '`',
DBDriver::MSSQL => '[',
DBDriver::PostgreSQL, DBDriver::OracleDB => '"'
};
// - Close
$this->DBSignClose = match ($this->Config->Driver) {
DBDriver::MySQL, DBDriver::SQLite => '`',
DBDriver::MSSQL => ']',
DBDriver::PostgreSQL, DBDriver::OracleDB => '"'
};
// Создаю объект для связи с базой данных
$this->DataBaseHandle = new PDO($dsn, username: $user, password: $password);
// Устанавливаю уровень ошибок
$this->DataBaseHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
$this->HandleException($e);
}
}
/**
* Деструктор. Закрывает соединение с базой данных
*/
public function __destruct ()
{
$this->DataBaseHandle = null;
}
// Транзакции
use DatabaseTransactions;
// Запросы Query и Execute
use DatabaseQueryExecute;
// Вставка данных
use DatabaseInsert;
// Получение данных
use DatabaseGet;
// Проверка существования и получение количества строк
use DatabaseCountExist;
// Обновление записей
use DatabaseUpdate;
// Удаление записей
use DatabaseDelete;
// Управление таблицами баз данных
use DatabaseTableManagement;
// Приватные методы
use DatabaseSpecial;
}