Files
web_work/app/Core/Database.php
2026-01-03 18:59:56 +03:00

86 lines
2.3 KiB
PHP

<?php
namespace App\Core;
class Database
{
private static ?Database $instance = null;
private \PDO $connection;
private function __construct()
{
$config = require dirname(__DIR__, 2) . '/config/database.php';
try {
$dsn = "pgsql:host={$config['host']};port={$config['port']};dbname={$config['database']}";
$this->connection = new \PDO($dsn, $config['username'], $config['password']);
$this->connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$this->connection->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);
$this->connection->exec("SET NAMES 'utf8'");
} catch (\PDOException $e) {
throw new \Exception("Ошибка подключения к базе данных: " . $e->getMessage());
}
}
public static function getInstance(): self
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function getConnection(): \PDO
{
return $this->connection;
}
public function query(string $sql, array $params = []): array
{
$stmt = $this->connection->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll();
}
public function queryOne(string $sql, array $params = []): ?array
{
$stmt = $this->connection->prepare($sql);
$stmt->execute($params);
$result = $stmt->fetch();
return $result ?: null;
}
public function execute(string $sql, array $params = []): bool
{
$stmt = $this->connection->prepare($sql);
return $stmt->execute($params);
}
public function lastInsertId(): string
{
return $this->connection->lastInsertId();
}
public function beginTransaction(): bool
{
return $this->connection->beginTransaction();
}
public function commit(): bool
{
return $this->connection->commit();
}
public function rollBack(): bool
{
return $this->connection->rollBack();
}
private function __clone() {}
public function __wakeup()
{
throw new \Exception("Десериализация Singleton запрещена");
}
}