44 lines
1.4 KiB
PHP
44 lines
1.4 KiB
PHP
<?php
|
|
namespace App;
|
|
|
|
use PDO;
|
|
use PDOException;
|
|
|
|
class Db
|
|
{
|
|
// Простая фабрика PDO по логину/паролю MariaDB из сессии
|
|
public static function connectFromSession(): PDO
|
|
{
|
|
if (empty($_SESSION['db_user']) || empty($_SESSION['db_pass'])) {
|
|
throw new \RuntimeException('Not authenticated');
|
|
}
|
|
|
|
$user = $_SESSION['db_user'];
|
|
$pass = $_SESSION['db_pass'];
|
|
|
|
// TODO: вынести host/port/charset в конфиг .env
|
|
$dsn = 'mysql:host=localhost;port=3306;charset=utf8mb4';
|
|
|
|
$pdo = new PDO($dsn, $user, $pass, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_EMULATE_PREPARES => false, // важная настройка [web:28][web:25]
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
]);
|
|
|
|
return $pdo;
|
|
}
|
|
|
|
public static function testConnection(string $user, string $pass): void
|
|
{
|
|
$dsn = 'mysql:host=localhost;port=3306;charset=utf8mb4'; // MariaDB совместим [web:22][web:28]
|
|
try {
|
|
new PDO($dsn, $user, $pass, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]);
|
|
} catch (PDOException $e) {
|
|
throw new \RuntimeException('Connection failed: ' . $e->getMessage());
|
|
}
|
|
}
|
|
}
|