From 2f66273f683735a2725035797126e5f0bd99b783 Mon Sep 17 00:00:00 2001 From: TiaraChontesa Date: Wed, 10 Jun 2026 10:31:28 +0000 Subject: [PATCH] Upload files to "/" --- README_FIX.md | 11 ++++++ install_database.php | 65 ++++++++++++++++++++++++-------- koneksi.php | 90 +++++++++++++++++++++++++++++++++----------- 3 files changed, 128 insertions(+), 38 deletions(-) create mode 100644 README_FIX.md diff --git a/README_FIX.md b/README_FIX.md new file mode 100644 index 0000000..1bd1282 --- /dev/null +++ b/README_FIX.md @@ -0,0 +1,11 @@ +# Fix Tugas_SIG Tiara untuk Coolify + +Upload/replace file-file ini ke repo root `Tugas_SIG`. + +File penting: +- `koneksi.php` root: koneksi database pakai Environment Variables + fallback database. +- `install_database.php`: installer sementara database. +- `Dockerfile`: PHP Apache port 80. +- `Tugas2/koneksi.php`, `Tugas3/koneksi.php`, `Tugas4/koneksi.php`, `Tugas1/koneksi.php`: proxy supaya include('koneksi.php') tetap jalan dari subfolder. + +Setelah import database berhasil, hapus `install_database.php`, commit, push, lalu redeploy. diff --git a/install_database.php b/install_database.php index c495641..2193ca1 100644 --- a/install_database.php +++ b/install_database.php @@ -1,5 +1,5 @@ Install Database Tugas SIG Tiara"; -echo "

Target koneksi: " . htmlspecialchars($host) . ":" . htmlspecialchars((string)$port) . ", database: " . htmlspecialchars($db) . ", user: " . htmlspecialchars($user) . "

"; +$dbCandidates = array_values(array_unique(array_filter([ + $requestedDb, + getenv('MYSQL_DATABASE') ?: null, + 'default', + 'db_poverty_mapping' +]))); -$conn = new mysqli($host, $user, $pass, $db, $port); +mysqli_report(MYSQLI_REPORT_OFF); + +$conn = new mysqli($host, $user, $pass, '', $port); if ($conn->connect_error) { - die("

Koneksi gagal: " . htmlspecialchars($conn->connect_error) . "

"); + die("

Install Database Tugas SIG Tiara

Koneksi server database gagal: " . htmlspecialchars($conn->connect_error) . "

"); } -$sqlFile = __DIR__ . "/database.sql"; +$selectedDb = null; +$selectErrors = []; + +foreach ($dbCandidates as $candidate) { + if (!$candidate) continue; + if (@$conn->select_db($candidate)) { + $selectedDb = $candidate; + break; + } + $selectErrors[] = $candidate . ' => ' . $conn->error; +} + +echo "

Install Database Tugas SIG Tiara

"; +echo "

Target server: " . htmlspecialchars($host) . ":" . htmlspecialchars((string)$port) . "

"; +echo "

User: " . htmlspecialchars($user) . "

"; +echo "

DB_NAME dari env: " . htmlspecialchars($requestedDb) . "

"; + +if (!$selectedDb) { + echo "

Gagal memilih database.

"; + echo "

Database yang dicoba:

" . htmlspecialchars(implode("\n", $selectErrors)) . "
"; + echo "

Solusi: di Coolify bagian Production Environment Variables, ubah DB_NAME menjadi nama database yang ada di ujung MySQL URL internal. Kalau URL internal berakhir dengan /default, isi DB_NAME=default.

"; + exit; +} + +echo "

Database yang dipakai: " . htmlspecialchars($selectedDb) . "

"; + +$sqlFile = __DIR__ . '/database.sql'; + if (!file_exists($sqlFile)) { die("

File SQL tidak ditemukan: " . htmlspecialchars($sqlFile) . "

"); } $sql = file_get_contents($sqlFile); -// Coolify normal user biasanya tidak butuh/ tidak punya izin CREATE DATABASE. -// Database sudah dibuat dari field Initial Database, jadi baris CREATE DATABASE dan USE diabaikan. -$sql = preg_replace('/CREATE\\s+DATABASE\\s+IF\\s+NOT\\s+EXISTS\\s+`?[^`\\s;]+`?.*?;/is', '', $sql); -$sql = preg_replace('/USE\\s+`?[^`\\s;]+`?\\s*;/is', '', $sql); +// Di Coolify, database sudah dibuat oleh resource database. +// Jadi dump tidak boleh memaksa CREATE DATABASE / USE database lain. +$sql = preg_replace('/CREATE\s+DATABASE\s+IF\s+NOT\s+EXISTS\s+`?[^`\s;]+`?.*?;/is', '', $sql); +$sql = preg_replace('/CREATE\s+DATABASE\s+`?[^`\s;]+`?.*?;/is', '', $sql); +$sql = preg_replace('/USE\s+`?[^`\s;]+`?\s*;/is', '', $sql); -// Jika dump hasil copy menjadi komentar seperti "-- 1.\nTABEL ... CREATE TABLE", -// buang label teks agar SQL tidak error. -$sql = preg_replace('/--\\s*\\d+\\.\\s*TABEL[^\\n]*\\n/is', '', $sql); -$sql = preg_replace('/\\bTABEL\\s+(PENGGUNA|RUMAH|BENCANA|DATA)[^;]*?(CREATE\\s+TABLE)/is', '$2', $sql); +// Supaya import ulang tidak langsung gagal karena tabel sudah ada. +$sql = preg_replace('/CREATE\s+TABLE\s+`/i', 'CREATE TABLE IF NOT EXISTS `', $sql); +$sql = preg_replace('/CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS\s+IF\s+NOT\s+EXISTS\s+`/i', 'CREATE TABLE IF NOT EXISTS `', $sql); if ($conn->multi_query($sql)) { do { @@ -46,7 +79,7 @@ if ($conn->multi_query($sql)) { if ($conn->errno) { echo "

Ada error saat import: " . htmlspecialchars($conn->error) . "

"; } else { - echo "

Database berhasil diimport.

"; + echo "

Database berhasil diimport ke database " . htmlspecialchars($selectedDb) . ".

"; echo "

Setelah ini, hapus file install_database.php dari repo lalu redeploy.

"; } } else { diff --git a/koneksi.php b/koneksi.php index bff0c40..6ee766a 100644 --- a/koneksi.php +++ b/koneksi.php @@ -1,5 +1,7 @@ connect_error) { http_response_code(500); die(json_encode([ 'status' => 'error', - 'message' => 'Koneksi database gagal: ' . $conn->connect_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'); -function getRedirectPath($targetFile) { - $currentDir = basename(dirname($_SERVER['SCRIPT_FILENAME'])); - if (stripos($currentDir, 'Tugas') !== false || stripos($currentDir, 'tugas') !== false || $currentDir === 'includes') { - return '../' . $targetFile; - } - return $targetFile; +// 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 (session_status() === PHP_SESSION_NONE) { - session_start(); - } if (!isset($_SESSION['user_id'])) { - header('Location: ' . getRedirectPath('login.php')); + header('Location: login.php'); exit; } } -function cekRole($role_wajib) { - if (session_status() === PHP_SESSION_NONE) { - session_start(); - } - if (!isset($_SESSION['role']) || $_SESSION['role'] !== $role_wajib) { - header('Location: ' . getRedirectPath('dashboard.php?error=unauthorized')); +function cekRole(...$roles) { + if (!in_array($_SESSION['role'] ?? '', $roles)) { + header('Location: index.php?error=akses_ditolak'); exit; } } -function bersih($str, $conn) { - return $conn->real_escape_string(htmlspecialchars(strip_tags(trim($str)))); +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 '-'; + } } ?>