Files
2026-06-10 10:31:28 +00:00

103 lines
3.0 KiB
PHP

<?php
// koneksi.php - versi aman untuk XAMPP dan Coolify
// Bisa membaca DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASS dari Environment Variables.
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$host = getenv('DB_HOST') ?: 'localhost';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASS') ?: (getenv('DB_PASSWORD') ?: '');
$port = (int)(getenv('DB_PORT') ?: 3306);
// DB_NAME dari Coolify harusnya sesuai Initial Database.
// Kalau salah, kode ini akan mencoba fallback ke database umum seperti default.
$requestedDb = getenv('DB_NAME') ?: 'db_poverty_mapping';
$dbCandidates = array_values(array_unique(array_filter([
$requestedDb,
getenv('MYSQL_DATABASE') ?: null,
'default',
'db_poverty_mapping'
])));
// Koneksi tanpa memilih database dulu, supaya tidak langsung fatal kalau DB_NAME salah.
mysqli_report(MYSQLI_REPORT_OFF);
$conn = new mysqli($host, $user, $pass, '', $port);
if ($conn->connect_error) {
http_response_code(500);
die(json_encode([
'status' => 'error',
'message' => 'Koneksi server database gagal: ' . $conn->connect_error,
'target' => $host . ':' . $port,
'user' => $user
]));
}
$selectedDb = null;
foreach ($dbCandidates as $candidate) {
if ($candidate && @$conn->select_db($candidate)) {
$selectedDb = $candidate;
break;
}
}
if (!$selectedDb) {
http_response_code(500);
die(json_encode([
'status' => 'error',
'message' => 'Tidak bisa memilih database. Cek DB_NAME di Production Environment Variables Coolify. DB_NAME harus sama dengan Initial Database / nama database di MySQL URL internal.',
'dicoba' => $dbCandidates,
'target' => $host . ':' . $port,
'user' => $user
]));
}
$conn->set_charset('utf8mb4');
// Alias agar kompatibel kalau file lain memakai nama variable berbeda.
$koneksi = $conn;
$mysqli = $conn;
// Constants agar kompatibel kalau kode lama memakai DB_HOST, DB_USER, dst.
if (!defined('DB_HOST')) define('DB_HOST', $host);
if (!defined('DB_USER')) define('DB_USER', $user);
if (!defined('DB_PASS')) define('DB_PASS', $pass);
if (!defined('DB_NAME')) define('DB_NAME', $selectedDb);
if (!defined('DB_PORT')) define('DB_PORT', $port);
function bersih($str, $conn) {
return $conn->real_escape_string(htmlspecialchars(strip_tags(trim((string)$str))));
}
function cekLogin() {
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
}
function cekRole(...$roles) {
if (!in_array($_SESSION['role'] ?? '', $roles)) {
header('Location: index.php?error=akses_ditolak');
exit;
}
}
function rupiah($angka) {
return 'Rp ' . number_format((float)$angka, 0, ',', '.');
}
function hitungUsia($tgl) {
if (!$tgl || $tgl === '0000-00-00') return '-';
try {
$lahir = new DateTime($tgl);
$sekarang = new DateTime();
return $lahir->diff($sekarang)->y . ' th';
} catch (Exception $e) {
return '-';
}
}
?>