109 lines
3.2 KiB
PHP
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.';
|
|
}
|