43 lines
1.3 KiB
PHP
43 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
require_once __DIR__ . '/bootstrap.php';
|
|
require_once __DIR__ . '/prefixed-pdo.php';
|
|
|
|
function app_db_pdo(): PDO
|
|
{
|
|
static $pdo = null;
|
|
|
|
if ($pdo instanceof PDO) {
|
|
return $pdo;
|
|
}
|
|
|
|
$host = app_env('DB_HOST', '');
|
|
$database = app_env('DB_NAME', '');
|
|
$user = app_env('DB_USER', '');
|
|
$password = app_env('DB_PASS', '');
|
|
$port = app_env('DB_PORT', '3306');
|
|
|
|
if ($host === '' || $database === '' || $user === '') {
|
|
throw new RuntimeException('Database environment is incomplete.');
|
|
}
|
|
|
|
$dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=utf8mb4', $host, $port, $database);
|
|
$pdo = new AppPrefixedPDO($dsn, $user, $password ?? '', [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => true,
|
|
]);
|
|
$pdo->setTablePrefix(app_db_table_prefix());
|
|
|
|
// DB-Session auf denselben Offset wie die (in bootstrap.php gepinnte)
|
|
// PHP-Zeitzone setzen, damit MySQL NOW() und PHP-Zeitstempel
|
|
// uebereinstimmen. Numerischer Offset, damit keine MySQL-Zeitzonentabellen
|
|
// noetig sind.
|
|
$offset = (new DateTimeImmutable('now'))->format('P');
|
|
$pdo->exec("SET time_zone = '{$offset}'");
|
|
|
|
return $pdo;
|
|
}
|