403 lines
16 KiB
PHP
403 lines
16 KiB
PHP
<?php
|
|
// ========================================
|
|
// FILE: php/db_check.php
|
|
// Skrip Diagnostik dan Sinkronisasi Database
|
|
// ========================================
|
|
|
|
include 'koneksi.php';
|
|
|
|
// Timpa header dari koneksi.php agar browser merender HTML dengan benar
|
|
header('Content-Type: text/html; charset=utf-8');
|
|
|
|
// Matikan output JSON bawaan koneksi.php jika ada error, kita buat custom HTML UI
|
|
ob_start();
|
|
|
|
$errors = [];
|
|
$success_logs = [];
|
|
$table_status = [];
|
|
|
|
// Daftar tabel yang harus ada
|
|
$required_tables = [
|
|
'masyarakat_miskin',
|
|
'rumah_ibadah',
|
|
'bantuan_riwayat',
|
|
'bpjs_record',
|
|
'users',
|
|
'fasilitas_jalan',
|
|
'fasilitas_polygon',
|
|
'fasilitas_spbu'
|
|
];
|
|
|
|
// 1. Cek Koneksi Database
|
|
if ($conn->connect_error) {
|
|
$errors[] = "Koneksi database gagal: " . $conn->connect_error;
|
|
} else {
|
|
$success_logs[] = "Koneksi ke database `{$database}` berhasil!";
|
|
}
|
|
|
|
// 2. Baca file database.sql untuk mengambil DDL jika tabel perlu dibuat
|
|
$sql_content = '';
|
|
$sql_file = __DIR__ . '/../database.sql';
|
|
if (file_exists($sql_file)) {
|
|
$sql_content = file_get_contents($sql_file);
|
|
$success_logs[] = "File `database.sql` ditemukan dan berhasil dibaca.";
|
|
} else {
|
|
$errors[] = "File `database.sql` tidak ditemukan di {$sql_file}. Skrip akan menggunakan DDL cadangan.";
|
|
}
|
|
|
|
// Helper untuk eksekusi query pembuatan tabel cadangan jika database.sql tidak ada
|
|
$fallback_ddl = [
|
|
'masyarakat_miskin' => "CREATE TABLE IF NOT EXISTS `masyarakat_miskin` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`nama` varchar(100) NOT NULL,
|
|
`tanggal_lahir` date NOT NULL,
|
|
`jenis_kelamin` enum('Laki-laki','Perempuan') NOT NULL,
|
|
`nik` varchar(20),
|
|
`alamat` text NOT NULL,
|
|
`latitude` decimal(10,8) NOT NULL,
|
|
`longitude` decimal(11,8) NOT NULL,
|
|
`status_bpjs` enum('Ya','Tidak','Proses') DEFAULT 'Tidak',
|
|
`no_hp` varchar(15),
|
|
`pekerjaan` varchar(100),
|
|
`pendapatan_bulanan` int(11),
|
|
`jumlah_tanggungan` int(11),
|
|
`status_rumah` enum('Milik Sendiri','Sewa','Menumpang') DEFAULT 'Menumpang',
|
|
`kelurahan` varchar(100),
|
|
`kecamatan` varchar(100),
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
|
|
|
|
'rumah_ibadah' => "CREATE TABLE IF NOT EXISTS `rumah_ibadah` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`nama` varchar(100) NOT NULL,
|
|
`jenis` enum('Masjid','Gereja','Vihara','Kelenteng','Sinagog','Lain') NOT NULL,
|
|
`latitude` decimal(10,8) NOT NULL,
|
|
`longitude` decimal(11,8) NOT NULL,
|
|
`alamat` text NOT NULL,
|
|
`nama_pemimpin` varchar(100),
|
|
`no_hp_pemimpin` varchar(15),
|
|
`kapasitas` int(11),
|
|
`tahun_didirikan` year,
|
|
`keterangan` text,
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
|
|
|
|
'bantuan_riwayat' => "CREATE TABLE IF NOT EXISTS `bantuan_riwayat` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`id_masyarakat` int(11) NOT NULL,
|
|
`jenis_bantuan` varchar(100) NOT NULL,
|
|
`tanggal_bantuan` date NOT NULL,
|
|
`nilai` int(11) NOT NULL,
|
|
`satuan` varchar(50),
|
|
`keterangan` text,
|
|
`nama_pemberi` varchar(100),
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (`id_masyarakat`) REFERENCES `masyarakat_miskin`(`id`) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
|
|
|
|
'bpjs_record' => "CREATE TABLE IF NOT EXISTS `bpjs_record` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`id_masyarakat` int(11) NOT NULL,
|
|
`no_peserta` varchar(20) NOT NULL UNIQUE,
|
|
`jenis_bpjs` enum('Kesehatan','Ketenagakerjaan','Jaminan Hari Tua') DEFAULT 'Kesehatan',
|
|
`tingkat` enum('Penerima Bantuan Iuran (PBI)','Pekerja Penerima Upah','Pekerja Bukan Penerima Upah','Peserta Mandiri') DEFAULT 'Penerima Bantuan Iuran (PBI)',
|
|
`tanggal_daftar` date NOT NULL,
|
|
`status_aktif` enum('Aktif','Nonaktif','Suspended') DEFAULT 'Aktif',
|
|
`faskes_tingkat_1` varchar(100),
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (`id_masyarakat`) REFERENCES `masyarakat_miskin`(`id`) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
|
|
|
|
'users' => "CREATE TABLE IF NOT EXISTS `users` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`username` varchar(50) NOT NULL UNIQUE,
|
|
`password` varchar(255) NOT NULL,
|
|
`nama_lengkap` varchar(100) NOT NULL,
|
|
`role` enum('Admin','Surveyor','Viewer') DEFAULT 'Surveyor',
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
|
|
|
|
'fasilitas_jalan' => "CREATE TABLE IF NOT EXISTS `fasilitas_jalan` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`nama` varchar(150) NOT NULL,
|
|
`geojson` text NOT NULL,
|
|
`tipe` varchar(50),
|
|
`keterangan` text,
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
|
|
|
|
'fasilitas_polygon' => "CREATE TABLE IF NOT EXISTS `fasilitas_polygon` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`nama` varchar(150) NOT NULL,
|
|
`geojson` text NOT NULL,
|
|
`tipe` varchar(50),
|
|
`keterangan` text,
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
|
|
|
|
'fasilitas_spbu' => "CREATE TABLE IF NOT EXISTS `fasilitas_spbu` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
`nama` varchar(150) NOT NULL,
|
|
`latitude` decimal(10,8) NOT NULL,
|
|
`longitude` decimal(11,8) NOT NULL,
|
|
`alamat` text,
|
|
`is_24_jam` enum('Ya','Tidak') DEFAULT 'Tidak',
|
|
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
|
|
];
|
|
|
|
// Cek dan buat tabel jika belum ada
|
|
foreach ($required_tables as $table) {
|
|
$check_table = $conn->query("SHOW TABLES LIKE '{$table}'");
|
|
if ($check_table && $check_table->num_rows > 0) {
|
|
// Tabel ada, cek jumlah baris
|
|
$count_res = $conn->query("SELECT COUNT(*) as total FROM `{$table}`");
|
|
$count = $count_res ? $count_res->fetch_assoc()['total'] : 0;
|
|
$table_status[$table] = [
|
|
'exists' => true,
|
|
'count' => $count,
|
|
'action' => 'No action needed'
|
|
];
|
|
} else {
|
|
// Tabel tidak ada, coba buat dari file SQL
|
|
$created = false;
|
|
if (!empty($sql_content)) {
|
|
// parsing DDL dari sql_content secara sederhana (karena multi_query bisa lambat / error untuk tabel spesifik)
|
|
// Sebagai alternatif, jalankan DDL cadangan agar 100% aman dan presisi
|
|
$ddl = $fallback_ddl[$table] ?? '';
|
|
if ($ddl && $conn->query($ddl)) {
|
|
$created = true;
|
|
}
|
|
} else {
|
|
$ddl = $fallback_ddl[$table] ?? '';
|
|
if ($ddl && $conn->query($ddl)) {
|
|
$created = true;
|
|
}
|
|
}
|
|
|
|
if ($created) {
|
|
$table_status[$table] = [
|
|
'exists' => true,
|
|
'count' => 0,
|
|
'action' => 'Table created successfully'
|
|
];
|
|
$success_logs[] = "Tabel `{$table}` berhasil dibuat karena tidak ditemukan.";
|
|
} else {
|
|
$table_status[$table] = [
|
|
'exists' => false,
|
|
'count' => 0,
|
|
'action' => 'Failed to create: ' . $conn->error
|
|
];
|
|
$errors[] = "Gagal membuat tabel `{$table}`: " . $conn->error;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 3. Cek Default Admin User
|
|
if (isset($table_status['users']) && $table_status['users']['exists']) {
|
|
$check_admin = $conn->query("SELECT id FROM users WHERE username = 'admin'");
|
|
if ($check_admin && $check_admin->num_rows === 0) {
|
|
$insert_admin = $conn->query("INSERT INTO `users` (`username`, `password`, `nama_lengkap`, `role`) VALUES
|
|
('admin', '5f4dcc3b5aa765d61d8327deb882cf99', 'Administrator', 'Admin')");
|
|
if ($insert_admin) {
|
|
$success_logs[] = "Akun default admin berhasil ditambahkan.";
|
|
$table_status['users']['count'] += 1;
|
|
} else {
|
|
$errors[] = "Gagal menambahkan akun default admin: " . $conn->error;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 4. Masukkan Data Sampel jika tabel kosong
|
|
if (isset($table_status['masyarakat_miskin']) && $table_status['masyarakat_miskin']['exists'] && $table_status['masyarakat_miskin']['count'] == 0) {
|
|
$insert_sampel = $conn->query("INSERT INTO `masyarakat_miskin`
|
|
(`id`, `nama`, `tanggal_lahir`, `jenis_kelamin`, `nik`, `alamat`, `latitude`, `longitude`, `status_bpjs`, `no_hp`, `pekerjaan`, `pendapatan_bulanan`, `jumlah_tanggungan`, `status_rumah`, `kelurahan`, `kecamatan`) VALUES
|
|
(1, 'Siti Nur Azizah', '1985-03-15', 'Perempuan', '6101234567890123', 'Jl. Mahakam No. 25', -0.06120000, 109.34450000, 'Ya', '081234567890', 'Buruh Harian', 1500000, 4, 'Menumpang', 'Sungai Jawi', 'Pontianak Kota')");
|
|
if ($insert_sampel) {
|
|
$success_logs[] = "Data sampel warga `Siti Nur Azizah` berhasil ditambahkan.";
|
|
$table_status['masyarakat_miskin']['count'] = 1;
|
|
|
|
// Tambahkan juga riwayat bantuan dan BPJS record yang cocok
|
|
$conn->query("INSERT INTO `bpjs_record` (`id_masyarakat`, `no_peserta`, `jenis_bpjs`, `tingkat`, `tanggal_daftar`, `status_aktif`, `faskes_tingkat_1`) VALUES
|
|
(1, '0001234567890', 'Kesehatan', 'Penerima Bantuan Iuran (PBI)', '2020-01-15', 'Aktif', 'Puskesmas Pontianak Kota')");
|
|
|
|
$conn->query("INSERT INTO `bantuan_riwayat` (`id_masyarakat`, `jenis_bantuan`, `tanggal_bantuan`, `nilai`, `satuan`, `keterangan`, `nama_pemberi`) VALUES
|
|
(1, 'Bantuan Pangan Non Tunai (BPNT)', '2026-05-10', 200000, 'Rupiah/Bulan', 'Bantuan Sembako tahap V', 'Dinas Sosial')");
|
|
|
|
$success_logs[] = "Data sampel BPJS & Riwayat Bantuan berhasil dihubungkan ke warga.";
|
|
}
|
|
}
|
|
|
|
if (isset($table_status['rumah_ibadah']) && $table_status['rumah_ibadah']['exists'] && $table_status['rumah_ibadah']['count'] == 0) {
|
|
$insert_sampel_ibadah = $conn->query("INSERT INTO `rumah_ibadah` (`nama`, `jenis`, `latitude`, `longitude`, `alamat`, `nama_pemimpin`, `no_hp_pemimpin`, `kapasitas`, `tahun_didirikan`) VALUES
|
|
('Masjid Al-Hidayah', 'Masjid', -0.06150000, 109.34500000, 'Jl. Diponegoro No. 45', 'Ustaz Ahmad', '081234567890', 500, 2005),
|
|
('Gereja Hati Kudus', 'Gereja', -0.06100000, 109.34400000, 'Jl. Jend Sudirman No. 12', 'Pdt. Bonaventura', '081234567891', 300, 1995)");
|
|
if ($insert_sampel_ibadah) {
|
|
$success_logs[] = "Data sampel rumah ibadah (Masjid & Gereja) berhasil ditambahkan.";
|
|
$table_status['rumah_ibadah']['count'] = 2;
|
|
}
|
|
}
|
|
|
|
// Bersihkan buffer output
|
|
ob_end_clean();
|
|
|
|
// Tampilkan halaman Laporan Diagnostik
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="id">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Database Deployment Diagnostic - WebGIS</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;800&display=swap" rel="stylesheet">
|
|
<style>
|
|
body {
|
|
font-family: 'Outfit', sans-serif;
|
|
background-color: #0f172a;
|
|
color: #e2e8f0;
|
|
margin: 0;
|
|
padding: 40px 20px;
|
|
}
|
|
.container {
|
|
max-width: 900px;
|
|
margin: 0 auto;
|
|
background: rgba(30, 41, 59, 0.7);
|
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
border-radius: 16px;
|
|
padding: 30px;
|
|
box-shadow: 0 10px 30px rgba(0,0,0,0.5);
|
|
backdrop-filter: blur(10px);
|
|
}
|
|
h1 {
|
|
color: #38bdf8;
|
|
font-weight: 800;
|
|
margin-top: 0;
|
|
border-bottom: 2px solid rgba(56, 189, 248, 0.3);
|
|
padding-bottom: 15px;
|
|
}
|
|
.status-badge {
|
|
display: inline-block;
|
|
padding: 5px 10px;
|
|
border-radius: 6px;
|
|
font-size: 12px;
|
|
font-weight: bold;
|
|
}
|
|
.status-ok {
|
|
background-color: #059669;
|
|
color: #ecfdf5;
|
|
}
|
|
.status-error {
|
|
background-color: #dc2626;
|
|
color: #fef2f2;
|
|
}
|
|
.status-info {
|
|
background-color: #2563eb;
|
|
color: #eff6ff;
|
|
}
|
|
table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
margin: 20px 0;
|
|
}
|
|
th, td {
|
|
text-align: left;
|
|
padding: 12px;
|
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
|
}
|
|
th {
|
|
background-color: rgba(56, 189, 248, 0.1);
|
|
color: #38bdf8;
|
|
}
|
|
.log-section {
|
|
background-color: rgba(15, 23, 42, 0.6);
|
|
border-radius: 8px;
|
|
padding: 15px;
|
|
margin-top: 25px;
|
|
font-family: monospace;
|
|
font-size: 13px;
|
|
max-height: 250px;
|
|
overflow-y: auto;
|
|
border: 1px solid rgba(255, 255, 255, 0.05);
|
|
}
|
|
.log-success { color: #34d399; margin-bottom: 5px; }
|
|
.log-error { color: #f87171; margin-bottom: 5px; }
|
|
.btn {
|
|
display: inline-block;
|
|
background: linear-gradient(135deg, #38bdf8 0%, #0284c7 100%);
|
|
color: white;
|
|
text-decoration: none;
|
|
padding: 12px 24px;
|
|
border-radius: 8px;
|
|
font-weight: 600;
|
|
margin-top: 20px;
|
|
transition: all 0.3s ease;
|
|
}
|
|
.btn:hover {
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 4px 15px rgba(56, 189, 248, 0.4);
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="container">
|
|
<h1>📊 Status Diagnostik Database WebGIS</h1>
|
|
|
|
<h3>Hasil Pengecekan Tabel</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Nama Tabel</th>
|
|
<th>Status Keberadaan</th>
|
|
<th>Jumlah Baris Data</th>
|
|
<th>Tindakan Sistem</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($required_tables as $table):
|
|
$status = $table_status[$table] ?? ['exists' => false, 'count' => 0, 'action' => 'Error'];
|
|
?>
|
|
<tr>
|
|
<td><strong><?php echo htmlspecialchars($table); ?></strong></td>
|
|
<td>
|
|
<?php if ($status['exists']): ?>
|
|
<span class="status-badge status-ok">Tersedia</span>
|
|
<?php else: ?>
|
|
<span class="status-badge status-error">Tidak Ditemukan</span>
|
|
<?php endif; ?>
|
|
</td>
|
|
<td><?php echo (int)$status['count']; ?> baris</td>
|
|
<td>
|
|
<span class="status-badge <?php echo $status['action'] === 'No action needed' ? 'status-ok' : 'status-info'; ?>">
|
|
<?php echo htmlspecialchars($status['action']); ?>
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="log-section">
|
|
<h4 style="margin: 0 0 10px 0; color: #38bdf8; font-family: sans-serif;">Logs Sistem:</h4>
|
|
<?php foreach ($success_logs as $log): ?>
|
|
<div class="log-success">[SUCCESS] <?php echo htmlspecialchars($log); ?></div>
|
|
<?php endforeach; ?>
|
|
<?php foreach ($errors as $err): ?>
|
|
<div class="log-error">[ERROR] <?php echo htmlspecialchars($err); ?></div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
|
|
<div style="text-align: center;">
|
|
<a href="../index.html" class="btn">Kembali ke Portal WebGIS →</a>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|