40061-vm/db/config.php
Flatlogic Bot f9536ee19b 01
2026-05-24 07:14:49 +00:00

109 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
// Generated by setup_mariadb_project.sh — keep env keys intact and fall back to a local XAMPP profile.
define('DB_HOST', getenv('DB_HOST') ?: '127.0.0.1');
define('DB_NAME', getenv('DB_NAME') ?: 'local_pop3_webmail');
define('DB_USER', getenv('DB_USER') ?: 'root');
$dbPass = getenv('DB_PASS');
define('DB_PASS', $dbPass !== false ? (string) $dbPass : '');
$dbPort = getenv('DB_PORT');
define('DB_PORT', max(1, (int) (($dbPort !== false && $dbPort !== '') ? $dbPort : 3306)));
function db_settings(): array
{
return [
'host' => DB_HOST,
'port' => DB_PORT,
'name' => DB_NAME,
'user' => DB_USER,
'has_password' => DB_PASS !== '',
];
}
function db_dsn(?string $database = null): string
{
$dsn = 'mysql:host=' . DB_HOST . ';port=' . DB_PORT . ';charset=utf8mb4';
if ($database !== null && $database !== '') {
$dsn .= ';dbname=' . $database;
}
return $dsn;
}
function db_options(): array
{
return [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
}
function db(): PDO
{
static $pdo;
if (!$pdo) {
try {
$pdo = new PDO(db_dsn(DB_NAME), DB_USER, DB_PASS, db_options());
} catch (Throwable $exception) {
throw new RuntimeException(db_human_error($exception), 0, $exception);
}
}
return $pdo;
}
function db_server(): PDO
{
try {
return new PDO(db_dsn(null), DB_USER, DB_PASS, db_options());
} catch (Throwable $exception) {
throw new RuntimeException(db_human_error($exception), 0, $exception);
}
}
function db_initialize(string $migrationFile): void
{
$server = db_server();
$databaseName = str_replace('`', '``', DB_NAME);
$server->exec("CREATE DATABASE IF NOT EXISTS `{$databaseName}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
$pdo = new PDO(db_dsn(DB_NAME), DB_USER, DB_PASS, db_options());
$sql = file_get_contents($migrationFile);
if ($sql === false) {
throw new RuntimeException('Ne mogu pročitati SQL migraciju za mailbox tablicu.');
}
$pdo->exec($sql);
}
function db_human_error(Throwable $exception): string
{
$message = trim($exception->getMessage());
$messageLower = strtolower($message);
if (str_contains($messageLower, 'unknown database')) {
return 'MySQL radi, ali baza `' . DB_NAME . '` još ne postoji. Pokreni `xampp-setup.php` ili je kreiraj u phpMyAdminu. Detalj: ' . $message;
}
if (str_contains($messageLower, 'access denied')) {
return 'MySQL je dostupan, ali korisničko ime ili lozinka nisu prihvaćeni. Provjeri `db/config.php`. Detalj: ' . $message;
}
if (
str_contains($messageLower, 'connection refused')
|| str_contains($messageLower, 'no such file or directory')
|| str_contains($messageLower, "can't connect")
|| str_contains($messageLower, 'sqlstate[hy000] [2002]')
) {
return 'Ne mogu se spojiti na MySQL na ' . DB_HOST . ':' . DB_PORT . '. Pokreni MySQL u XAMPP-u i pokušaj ponovno. Detalj: ' . $message;
}
return $message !== '' ? $message : 'Nepoznata greška pri spajanju na bazu.';
}