103 lines
3.0 KiB
PHP
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 '-';
|
|
}
|
|
}
|
|
?>
|