add files and folders
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
if (!$data) {
|
||||
echo json_encode(["success"=>false,"message"=>"Data kosong"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$geojson = json_encode($data['geometry'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO jalan_lines
|
||||
(nama_jalan, status_jalan, panjang_meter, geojson)
|
||||
VALUES (?, ?, ?, ?)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
$data['nama_jalan'],
|
||||
$data['status_jalan'],
|
||||
$data['panjang_meter'],
|
||||
$geojson
|
||||
]);
|
||||
} catch (Exception $inner) {
|
||||
// Fallback untuk skema spatial: simpan ke kolom `geom` jika `geojson` tidak ada.
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO jalan_lines
|
||||
(nama_jalan, status_jalan, panjang_meter, geom)
|
||||
VALUES (?, ?, ?, ST_GeomFromGeoJSON(?))
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
$data['nama_jalan'],
|
||||
$data['status_jalan'],
|
||||
$data['panjang_meter'],
|
||||
$geojson
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode(["success"=>true]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success"=>false,"message"=>$e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
// Payload expected from js/app.js:
|
||||
// { status_kepemilikan, luas_m2, geometry }
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "status" => "error", "message" => "Payload JSON kosong atau tidak valid."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$status_kepemilikan = trim($data['status_kepemilikan'] ?? '');
|
||||
$luas_m2 = (float)($data['luas_m2'] ?? 0);
|
||||
$geometry = $data['geometry'] ?? null;
|
||||
|
||||
if ($status_kepemilikan === '' || !$geometry) {
|
||||
echo json_encode(["success" => false, "status" => "error", "message" => "Data parsil belum lengkap (status/geometry)."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$geomJson = json_encode($geometry, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO parsil_tanah (status_kepemilikan, luas_m2, geojson)
|
||||
VALUES (:status_kepemilikan, :luas_m2, :geojson)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':status_kepemilikan' => $status_kepemilikan,
|
||||
':luas_m2' => $luas_m2,
|
||||
':geojson' => $geomJson
|
||||
]);
|
||||
} catch (Exception $inner) {
|
||||
// Fallback untuk skema spatial: simpan ke kolom `geom` jika `geojson` tidak ada.
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO parsil_tanah (status_kepemilikan, luas_m2, geom)
|
||||
VALUES (:status_kepemilikan, :luas_m2, ST_GeomFromGeoJSON(:geom))
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':status_kepemilikan' => $status_kepemilikan,
|
||||
':luas_m2' => $luas_m2,
|
||||
':geom' => $geomJson
|
||||
]);
|
||||
} catch (Exception $inner2) {
|
||||
// Last resort: minimal insert.
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO parsil_tanah (geom)
|
||||
VALUES (ST_GeomFromGeoJSON(:geom))
|
||||
");
|
||||
$stmt->execute([':geom' => $geomJson]);
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode(["success" => true, "status" => "success", "message" => "Area Parsil berhasil disimpan."]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "status" => "error", "message" => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,192 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
function haversine_m($lat1, $lon1, $lat2, $lon2) {
|
||||
$R = 6371000.0; // meters
|
||||
$phi1 = deg2rad((float)$lat1);
|
||||
$phi2 = deg2rad((float)$lat2);
|
||||
$dphi = deg2rad((float)$lat2 - (float)$lat1);
|
||||
$dlambda = deg2rad((float)$lon2 - (float)$lon1);
|
||||
$a = sin($dphi/2) * sin($dphi/2) + cos($phi1) * cos($phi2) * sin($dlambda/2) * sin($dlambda/2);
|
||||
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
|
||||
return $R * $c;
|
||||
}
|
||||
|
||||
function get_payload() {
|
||||
$ct = $_SERVER['CONTENT_TYPE'] ?? '';
|
||||
if (stripos($ct, 'multipart/form-data') !== false) {
|
||||
return [
|
||||
'kk_nama' => $_POST['kk_nama'] ?? '',
|
||||
'nik' => $_POST['nik'] ?? '',
|
||||
'jumlah_anggota' => $_POST['jumlah_anggota'] ?? '',
|
||||
'latitude' => $_POST['latitude'] ?? null,
|
||||
'longitude' => $_POST['longitude'] ?? null,
|
||||
'address' => $_POST['address'] ?? '',
|
||||
'kelurahan' => $_POST['kelurahan'] ?? '',
|
||||
'kecamatan' => $_POST['kecamatan'] ?? '',
|
||||
'status_bantuan' => $_POST['status_bantuan'] ?? 'Belum dibantu',
|
||||
'jenis_bantuan' => $_POST['jenis_bantuan'] ?? '',
|
||||
'tanggal_bantuan' => $_POST['tanggal_bantuan'] ?? '',
|
||||
'anggota' => $_POST['anggota'] ?? '[]'
|
||||
];
|
||||
}
|
||||
$json = json_decode(file_get_contents('php://input'), true);
|
||||
return is_array($json) ? $json : null;
|
||||
}
|
||||
|
||||
function compute_nearest_ibadah(PDO $pdo, $lat, $lng) {
|
||||
$stmt = $pdo->query("SELECT id, latitude, longitude, radius_meter FROM rumah_ibadah_points");
|
||||
$rows = $stmt->fetchAll();
|
||||
$best = null;
|
||||
foreach ($rows as $r) {
|
||||
$rLat = (float)$r['latitude'];
|
||||
$rLng = (float)$r['longitude'];
|
||||
$radius = (float)$r['radius_meter'];
|
||||
if ($radius <= 0) continue;
|
||||
$d = haversine_m($lat, $lng, $rLat, $rLng);
|
||||
if ($d <= $radius) {
|
||||
if ($best === null || $d < $best['jarak_meter']) {
|
||||
$best = ['rumah_ibadah_id' => (int)$r['id'], 'jarak_meter' => $d];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $best ?: ['rumah_ibadah_id' => null, 'jarak_meter' => null];
|
||||
}
|
||||
|
||||
function save_upload_if_any() {
|
||||
if (!isset($_FILES['bukti_file']) || !is_array($_FILES['bukti_file'])) return null;
|
||||
if (($_FILES['bukti_file']['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) return null;
|
||||
|
||||
$dir = __DIR__ . '/../uploads/bukti';
|
||||
if (!is_dir($dir)) @mkdir($dir, 0775, true);
|
||||
if (!is_dir($dir)) return null;
|
||||
|
||||
$orig = (string)($_FILES['bukti_file']['name'] ?? 'file');
|
||||
$ext = strtolower(pathinfo($orig, PATHINFO_EXTENSION));
|
||||
$allowed = ['jpg','jpeg','png','webp','pdf'];
|
||||
if ($ext && !in_array($ext, $allowed, true)) return null;
|
||||
|
||||
$safeBase = preg_replace('/[^a-zA-Z0-9._-]+/', '_', pathinfo($orig, PATHINFO_FILENAME));
|
||||
$safeBase = trim($safeBase, '_');
|
||||
if ($safeBase === '') $safeBase = 'bukti';
|
||||
$filename = $safeBase . '_' . date('Ymd_His') . '_' . bin2hex(random_bytes(4)) . ($ext ? ('.' . $ext) : '');
|
||||
$dest = $dir . '/' . $filename;
|
||||
|
||||
if (!move_uploaded_file($_FILES['bukti_file']['tmp_name'], $dest)) return null;
|
||||
return 'uploads/bukti/' . $filename;
|
||||
}
|
||||
|
||||
$data = get_payload();
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "message" => "Payload kosong atau tidak valid."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$kk_nama = trim($data['kk_nama'] ?? $data['nama'] ?? '');
|
||||
$nik = trim($data['nik'] ?? '');
|
||||
$jumlah_anggota = (int)($data['jumlah_anggota'] ?? 0);
|
||||
$latitude = $data['latitude'] ?? null;
|
||||
$longitude = $data['longitude'] ?? null;
|
||||
$address = trim($data['address'] ?? '');
|
||||
$kelurahan = trim($data['kelurahan'] ?? '');
|
||||
$kecamatan = trim($data['kecamatan'] ?? '');
|
||||
$status_bantuan = trim($data['status_bantuan'] ?? 'Belum dibantu');
|
||||
$jenis_bantuan = trim($data['jenis_bantuan'] ?? '');
|
||||
$tanggal_bantuan = trim($data['tanggal_bantuan'] ?? '');
|
||||
$anggotaRaw = $data['anggota'] ?? [];
|
||||
|
||||
$validStatus = ['Belum dibantu', 'Sudah dibantu', 'Menunggu verifikasi'];
|
||||
if (!in_array($status_bantuan, $validStatus, true)) $status_bantuan = 'Belum dibantu';
|
||||
|
||||
if ($kk_nama === '' || $latitude === null || $longitude === null) {
|
||||
echo json_encode(["success" => false, "message" => "Data penduduk miskin belum lengkap (nama/lat/lng)."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$lat = (float)$latitude;
|
||||
$lng = (float)$longitude;
|
||||
$nearest = compute_nearest_ibadah($pdo, $lat, $lng);
|
||||
$uploadPath = save_upload_if_any();
|
||||
|
||||
$pdo->beginTransaction();
|
||||
// Backward-compat: some installs still have old column `nama`.
|
||||
// Prefer new schema if columns exist.
|
||||
$cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
$hasNew = in_array('kk_nama', $cols, true);
|
||||
if ($hasNew) {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO pemukiman_miskin_points
|
||||
(kk_nama, nik, jumlah_anggota, latitude, longitude, address, kelurahan, kecamatan,
|
||||
status_bantuan, jenis_bantuan, tanggal_bantuan, bukti_file, jarak_meter, rumah_ibadah_id)
|
||||
VALUES
|
||||
(:kk_nama, :nik, :jumlah_anggota, :latitude, :longitude, :address, :kelurahan, :kecamatan,
|
||||
:status_bantuan, :jenis_bantuan, :tanggal_bantuan, :bukti_file, :jarak_meter, :rumah_ibadah_id)
|
||||
");
|
||||
$stmt->execute([
|
||||
':kk_nama' => $kk_nama,
|
||||
':nik' => ($nik === '' ? null : $nik),
|
||||
':jumlah_anggota' => $jumlah_anggota,
|
||||
':latitude' => $lat,
|
||||
':longitude' => $lng,
|
||||
':address' => ($address === '' ? null : $address),
|
||||
':kelurahan' => ($kelurahan === '' ? null : $kelurahan),
|
||||
':kecamatan' => ($kecamatan === '' ? null : $kecamatan),
|
||||
':status_bantuan' => $status_bantuan,
|
||||
':jenis_bantuan' => ($jenis_bantuan === '' ? null : $jenis_bantuan),
|
||||
':tanggal_bantuan' => ($tanggal_bantuan === '' ? null : $tanggal_bantuan),
|
||||
':bukti_file' => $uploadPath,
|
||||
':jarak_meter' => $nearest['jarak_meter'],
|
||||
':rumah_ibadah_id' => $nearest['rumah_ibadah_id']
|
||||
]);
|
||||
} else {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO pemukiman_miskin_points (nama, latitude, longitude, address, rumah_ibadah_id)
|
||||
VALUES (:nama, :latitude, :longitude, :address, :rumah_ibadah_id)
|
||||
");
|
||||
$stmt->execute([
|
||||
':nama' => $kk_nama,
|
||||
':latitude' => $lat,
|
||||
':longitude' => $lng,
|
||||
':address' => ($address === '' ? null : $address),
|
||||
':rumah_ibadah_id' => $nearest['rumah_ibadah_id']
|
||||
]);
|
||||
}
|
||||
|
||||
$newId = (int)$pdo->lastInsertId();
|
||||
|
||||
// anggota keluarga (optional)
|
||||
$anggota = is_string($anggotaRaw) ? json_decode($anggotaRaw, true) : $anggotaRaw;
|
||||
if (is_array($anggota) && count($anggota) > 0 && $hasNew) {
|
||||
$ins = $pdo->prepare("
|
||||
INSERT INTO anggota_keluarga (penduduk_id, nama, hubungan, umur, pekerjaan, keterangan)
|
||||
VALUES (:penduduk_id, :nama, :hubungan, :umur, :pekerjaan, :keterangan)
|
||||
");
|
||||
foreach ($anggota as $a) {
|
||||
$n = trim((string)($a['nama'] ?? ''));
|
||||
$h = trim((string)($a['hubungan'] ?? ''));
|
||||
if ($n === '' || $h === '') continue;
|
||||
$ins->execute([
|
||||
':penduduk_id' => $newId,
|
||||
':nama' => $n,
|
||||
':hubungan' => $h,
|
||||
':umur' => isset($a['umur']) && $a['umur'] !== '' ? (int)$a['umur'] : null,
|
||||
':pekerjaan' => ($a['pekerjaan'] ?? '') === '' ? null : (string)$a['pekerjaan'],
|
||||
':keterangan' => ($a['keterangan'] ?? '') === '' ? null : (string)$a['keterangan']
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"id" => $newId,
|
||||
"rumah_ibadah_id" => $nearest['rumah_ibadah_id'],
|
||||
"jarak_meter" => $nearest['jarak_meter'],
|
||||
"message" => "Penduduk miskin berhasil ditambahkan"
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
if ($pdo->inTransaction()) $pdo->rollBack();
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "status" => "error", "message" => "Payload JSON kosong atau tidak valid."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$nama = trim($data['nama'] ?? '');
|
||||
$no = trim($data['no'] ?? '');
|
||||
$deskripsi = trim($data['deskripsi'] ?? '');
|
||||
$status_24jam = isset($data['status_24jam']) ? (int)$data['status_24jam'] : 0;
|
||||
$latitude = $data['latitude'] ?? null;
|
||||
$longitude = $data['longitude'] ?? null;
|
||||
|
||||
if ($nama === '' || $no === '' || $latitude === null || $longitude === null) {
|
||||
echo json_encode(["success" => false, "status" => "error", "message" => "Data point belum lengkap (nama/no/lat/lng)."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$pointGeojson = json_encode([
|
||||
"type" => "Point",
|
||||
"coordinates" => [(float)$longitude, (float)$latitude]
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
// Optional legacy field if client ever sends it
|
||||
$geomPayload = $data['geom'] ?? null;
|
||||
if (!is_string($geomPayload) || $geomPayload === '') {
|
||||
$geomPayload = $pointGeojson;
|
||||
}
|
||||
|
||||
try {
|
||||
// Preferred schema (non-spatial, consistent with update_point.php)
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO spbu_points (nama, no, deskripsi, status_24jam, latitude, longitude)
|
||||
VALUES (:nama, :no, :deskripsi, :status_24jam, :latitude, :longitude)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':no' => $no,
|
||||
':deskripsi' => $deskripsi,
|
||||
':status_24jam' => $status_24jam,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude
|
||||
]);
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"status" => "success",
|
||||
"message" => "Point SPBU berhasil ditambahkan",
|
||||
"id" => (int)$pdo->lastInsertId()
|
||||
]);
|
||||
exit;
|
||||
} catch (Exception $e1) {
|
||||
// continue to fallback attempts
|
||||
}
|
||||
|
||||
// Fallback schema: `geom` stored as LONGTEXT (GeoJSON string)
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO spbu_points (nama, no, deskripsi, status_24jam, latitude, longitude, geom)
|
||||
VALUES (:nama, :no, :deskripsi, :status_24jam, :latitude, :longitude, :geom)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':no' => $no,
|
||||
':deskripsi' => $deskripsi,
|
||||
':status_24jam' => $status_24jam,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude,
|
||||
':geom' => $geomPayload
|
||||
]);
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"status" => "success",
|
||||
"message" => "Point SPBU berhasil ditambahkan",
|
||||
"id" => (int)$pdo->lastInsertId()
|
||||
]);
|
||||
exit;
|
||||
} catch (Exception $e2) {
|
||||
// continue to fallback attempts
|
||||
}
|
||||
|
||||
// Fallback schema: only (nama, geom) where geom is LONGTEXT GeoJSON
|
||||
try {
|
||||
$stmt = $pdo->prepare("INSERT INTO spbu_points (nama, geom) VALUES (:nama, :geom)");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':geom' => $geomPayload
|
||||
]);
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"status" => "success",
|
||||
"message" => "Point SPBU berhasil ditambahkan",
|
||||
"id" => (int)$pdo->lastInsertId()
|
||||
]);
|
||||
exit;
|
||||
} catch (Exception $e3) {
|
||||
// continue to fallback attempts
|
||||
}
|
||||
|
||||
// Fallback schema: `geom` is spatial GEOMETRY/POINT
|
||||
$stmt = $pdo->prepare("INSERT INTO spbu_points (nama, geom) VALUES (:nama, ST_GeomFromGeoJSON(:geom))");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':geom' => $pointGeojson
|
||||
]);
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"status" => "success",
|
||||
"message" => "Point SPBU berhasil ditambahkan",
|
||||
"id" => (int)$pdo->lastInsertId()
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "status" => "error", "message" => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "message" => "Payload JSON kosong atau tidak valid."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$nama = trim($data['nama'] ?? '');
|
||||
$jenis = trim($data['jenis'] ?? 'Lainnya');
|
||||
$kontak = trim($data['kontak'] ?? '');
|
||||
$radius_meter = (float)($data['radius_meter'] ?? 0);
|
||||
$latitude = $data['latitude'] ?? null;
|
||||
$longitude = $data['longitude'] ?? null;
|
||||
$address = trim($data['address'] ?? '');
|
||||
|
||||
if ($nama === '' || $radius_meter <= 0 || $latitude === null || $longitude === null) {
|
||||
echo json_encode(["success" => false, "message" => "Data rumah ibadah belum lengkap (nama/radius/lat/lng)."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$cols = $pdo->query("SHOW COLUMNS FROM rumah_ibadah_points")->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
$hasJenis = in_array('jenis', $cols, true);
|
||||
$hasKontak = in_array('kontak', $cols, true);
|
||||
|
||||
if ($hasJenis && $hasKontak) {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO rumah_ibadah_points (nama, jenis, kontak, radius_meter, latitude, longitude, address)
|
||||
VALUES (:nama, :jenis, :kontak, :radius_meter, :latitude, :longitude, :address)
|
||||
");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':jenis' => ($jenis === '' ? 'Lainnya' : $jenis),
|
||||
':kontak' => ($kontak === '' ? null : $kontak),
|
||||
':radius_meter' => $radius_meter,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude,
|
||||
':address' => ($address === '' ? null : $address)
|
||||
]);
|
||||
} else {
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO rumah_ibadah_points (nama, radius_meter, latitude, longitude, address)
|
||||
VALUES (:nama, :radius_meter, :latitude, :longitude, :address)
|
||||
");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':radius_meter' => $radius_meter,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude,
|
||||
':address' => ($address === '' ? null : $address)
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode(["success" => true, "id" => (int)$pdo->lastInsertId(), "message" => "Rumah ibadah berhasil ditambahkan"]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
|
||||
if ($id <= 0) {
|
||||
echo json_encode(["success" => false, "message" => "ID tidak valid"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM jalan_lines WHERE id = ?");
|
||||
$stmt->execute([$id]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data jalan berhasil dihapus"]);
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
|
||||
if ($id <= 0) {
|
||||
echo json_encode(["success" => false, "message" => "ID tidak valid"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM parsil_tanah WHERE id = ?");
|
||||
$stmt->execute([$id]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data parsil berhasil dihapus"]);
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
|
||||
if ($id <= 0) {
|
||||
echo json_encode(["success" => false, "message" => "ID tidak valid"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
// best-effort delete uploaded proof file
|
||||
try {
|
||||
$cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
if (in_array('bukti_file', $cols, true)) {
|
||||
$stmt = $pdo->prepare("SELECT bukti_file FROM pemukiman_miskin_points WHERE id = ?");
|
||||
$stmt->execute([$id]);
|
||||
$path = $stmt->fetchColumn();
|
||||
if ($path && is_string($path) && strpos($path, 'uploads/bukti/') === 0) {
|
||||
$full = __DIR__ . '/../' . $path;
|
||||
if (is_file($full)) @unlink($full);
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) { /* ignore */ }
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM pemukiman_miskin_points WHERE id = ?");
|
||||
$stmt->execute([$id]);
|
||||
echo json_encode(["success" => true, "message" => "Pemukiman miskin berhasil dihapus"]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
|
||||
if ($id <= 0) {
|
||||
echo json_encode(["success" => false, "message" => "ID tidak valid"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM spbu_points WHERE id = ?");
|
||||
$stmt->execute([$id]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data point berhasil dihapus"]);
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
|
||||
if ($id <= 0) {
|
||||
echo json_encode(["success" => false, "message" => "ID tidak valid"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare("DELETE FROM rumah_ibadah_points WHERE id = ?");
|
||||
$stmt->execute([$id]);
|
||||
echo json_encode(["success" => true, "message" => "Rumah ibadah berhasil dihapus"]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
$host = getenv('DB_HOST') ?: "localhost";
|
||||
$port = getenv('DB_PORT') ?: "3306";
|
||||
$db = getenv('DB_NAME') ?: "webgis_spbu";
|
||||
$user = getenv('DB_USER') ?: "root";
|
||||
$pass = getenv('DB_PASSWORD') ?: "";
|
||||
$charset = "utf8mb4";
|
||||
|
||||
$dsn = "mysql:host=$host;port=$port;dbname=$db;charset=$charset";
|
||||
|
||||
$options = [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
];
|
||||
|
||||
try {
|
||||
$pdo = new PDO($dsn, $user, $pass, $options);
|
||||
} catch (PDOException $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Koneksi database gagal: " . $e->getMessage()
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$penduduk_id = isset($_GET['penduduk_id']) ? (int)$_GET['penduduk_id'] : 0;
|
||||
if ($penduduk_id <= 0) {
|
||||
echo json_encode([]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT id, penduduk_id, nama, hubungan, umur, pekerjaan, keterangan
|
||||
FROM anggota_keluarga
|
||||
WHERE penduduk_id = :id
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$stmt->execute([':id' => $penduduk_id]);
|
||||
$rows = $stmt->fetchAll();
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode([]);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$features = [];
|
||||
|
||||
function rowsToFeatures($stmt) {
|
||||
$features = [];
|
||||
while ($row = $stmt->fetch()) {
|
||||
$geometry = json_decode($row['geojson'] ?? '', true);
|
||||
if (!$geometry) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$features[] = [
|
||||
"type" => "Feature",
|
||||
"geometry" => $geometry,
|
||||
"properties" => [
|
||||
"id" => (int)($row['id'] ?? 0),
|
||||
"nama_jalan" => $row['nama_jalan'] ?? null,
|
||||
"status_jalan" => $row['status_jalan'] ?? null,
|
||||
"panjang_meter" => isset($row['panjang_meter']) ? (float)$row['panjang_meter'] : null
|
||||
]
|
||||
];
|
||||
}
|
||||
return $features;
|
||||
}
|
||||
|
||||
try {
|
||||
// Preferred schema: geojson column.
|
||||
$stmt = $pdo->query("SELECT id, nama_jalan, status_jalan, panjang_meter, geojson FROM jalan_lines ORDER BY id ASC");
|
||||
$features = rowsToFeatures($stmt);
|
||||
} catch (Exception $e) {
|
||||
// Fallback schema: spatial geom.
|
||||
$stmt = $pdo->query("
|
||||
SELECT
|
||||
id,
|
||||
nama_jalan,
|
||||
status_jalan,
|
||||
panjang_meter,
|
||||
ST_AsGeoJSON(geom) AS geojson
|
||||
FROM jalan_lines
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$features = rowsToFeatures($stmt);
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"type" => "FeatureCollection",
|
||||
"features" => $features
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$features = [];
|
||||
|
||||
function rowsToFeatures($stmt) {
|
||||
$features = [];
|
||||
while ($row = $stmt->fetch()) {
|
||||
$geometry = json_decode($row['geojson'] ?? '', true);
|
||||
if (!$geometry) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$features[] = [
|
||||
"type" => "Feature",
|
||||
"geometry" => $geometry,
|
||||
"properties" => [
|
||||
"id" => (int)($row['id'] ?? 0),
|
||||
"status_kepemilikan" => $row['status_kepemilikan'] ?? null,
|
||||
"luas_m2" => isset($row['luas_m2']) ? (float)$row['luas_m2'] : null
|
||||
]
|
||||
];
|
||||
}
|
||||
return $features;
|
||||
}
|
||||
|
||||
try {
|
||||
// Preferred schema: geojson column.
|
||||
$stmt = $pdo->query("SELECT id, status_kepemilikan, luas_m2, geojson FROM parsil_tanah ORDER BY id ASC");
|
||||
$features = rowsToFeatures($stmt);
|
||||
} catch (Exception $e) {
|
||||
// Fallback schema: spatial geom.
|
||||
$stmt = $pdo->query("
|
||||
SELECT
|
||||
id,
|
||||
status_kepemilikan,
|
||||
luas_m2,
|
||||
ST_AsGeoJSON(geom) AS geojson
|
||||
FROM parsil_tanah
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$features = rowsToFeatures($stmt);
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"type" => "FeatureCollection",
|
||||
"features" => $features
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
function haversine_m($lat1, $lon1, $lat2, $lon2) {
|
||||
$R = 6371000.0;
|
||||
$phi1 = deg2rad((float)$lat1);
|
||||
$phi2 = deg2rad((float)$lat2);
|
||||
$dphi = deg2rad((float)$lat2 - (float)$lat1);
|
||||
$dlambda = deg2rad((float)$lon2 - (float)$lon1);
|
||||
$a = sin($dphi/2) * sin($dphi/2) + cos($phi1) * cos($phi2) * sin($dlambda/2) * sin($dlambda/2);
|
||||
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
|
||||
return $R * $c;
|
||||
}
|
||||
|
||||
function compute_nearest_ibadah(array $ibadahRows, $lat, $lng) {
|
||||
$best = null;
|
||||
foreach ($ibadahRows as $r) {
|
||||
$rLat = (float)($r['latitude'] ?? 0);
|
||||
$rLng = (float)($r['longitude'] ?? 0);
|
||||
$radius = (float)($r['radius_meter'] ?? 0);
|
||||
if ($radius <= 0) continue;
|
||||
$d = haversine_m($lat, $lng, $rLat, $rLng);
|
||||
if ($d <= $radius) {
|
||||
if ($best === null || $d < $best['jarak_meter']) {
|
||||
$best = [
|
||||
'rumah_ibadah_id' => (int)($r['id'] ?? 0),
|
||||
'jarak_meter' => $d,
|
||||
'row' => $r
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $best;
|
||||
}
|
||||
|
||||
// Prefer new schema; fall back to old schema if needed.
|
||||
$cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
$hasNew = in_array('kk_nama', $cols, true);
|
||||
|
||||
$hasJarak = in_array('jarak_meter', $cols, true);
|
||||
$hasRumahIbadahId = in_array('rumah_ibadah_id', $cols, true);
|
||||
|
||||
// Fetch rumah ibadah once; used for real-time coverage computation server-side.
|
||||
$ibadah = [];
|
||||
try {
|
||||
$stmtI = $pdo->query("SELECT id, nama, jenis, kontak, radius_meter, latitude, longitude FROM rumah_ibadah_points");
|
||||
$ibadah = $stmtI->fetchAll();
|
||||
} catch (Exception $e) {
|
||||
$ibadah = [];
|
||||
}
|
||||
|
||||
// Load pemukiman rows
|
||||
$rows = [];
|
||||
try {
|
||||
if ($hasNew) {
|
||||
$stmt = $pdo->query("
|
||||
SELECT p.*,
|
||||
(
|
||||
SELECT COUNT(*) FROM anggota_keluarga a WHERE a.penduduk_id = p.id
|
||||
) AS anggota_count
|
||||
FROM pemukiman_miskin_points p
|
||||
ORDER BY p.id ASC
|
||||
");
|
||||
$rows = $stmt->fetchAll();
|
||||
} else {
|
||||
$stmt = $pdo->query("SELECT p.* FROM pemukiman_miskin_points p ORDER BY p.id ASC");
|
||||
$rows = $stmt->fetchAll();
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$rows = [];
|
||||
}
|
||||
|
||||
// Best-effort: keep stored rumah_ibadah_id/jarak_meter in sync with latest radius rules.
|
||||
$upd = null;
|
||||
try {
|
||||
if ($hasRumahIbadahId && $hasJarak) {
|
||||
$upd = $pdo->prepare("UPDATE pemukiman_miskin_points SET rumah_ibadah_id = :rid, jarak_meter = :jarak WHERE id = :id");
|
||||
} elseif ($hasRumahIbadahId) {
|
||||
$upd = $pdo->prepare("UPDATE pemukiman_miskin_points SET rumah_ibadah_id = :rid WHERE id = :id");
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$upd = null;
|
||||
}
|
||||
|
||||
foreach ($rows as &$p) {
|
||||
$lat = isset($p['latitude']) ? (float)$p['latitude'] : null;
|
||||
$lng = isset($p['longitude']) ? (float)$p['longitude'] : null;
|
||||
if ($lat === null || $lng === null) continue;
|
||||
|
||||
$best = compute_nearest_ibadah($ibadah, $lat, $lng);
|
||||
$rid = $best ? (int)$best['rumah_ibadah_id'] : null;
|
||||
$jarak = $best ? (float)$best['jarak_meter'] : null;
|
||||
$storedRid = isset($p['rumah_ibadah_id']) ? (int)$p['rumah_ibadah_id'] : null;
|
||||
|
||||
// overwrite output with authoritative computed coverage
|
||||
$p['rumah_ibadah_id'] = $rid;
|
||||
if ($hasJarak) $p['jarak_meter'] = $jarak;
|
||||
|
||||
if ($best && isset($best['row']) && is_array($best['row'])) {
|
||||
$p['rumah_ibadah_nama'] = $best['row']['nama'] ?? null;
|
||||
$p['rumah_ibadah_jenis'] = $best['row']['jenis'] ?? null;
|
||||
$p['rumah_ibadah_kontak'] = $best['row']['kontak'] ?? null;
|
||||
$p['rumah_ibadah_radius'] = $best['row']['radius_meter'] ?? null;
|
||||
} else {
|
||||
$p['rumah_ibadah_nama'] = null;
|
||||
$p['rumah_ibadah_jenis'] = null;
|
||||
$p['rumah_ibadah_kontak'] = null;
|
||||
$p['rumah_ibadah_radius'] = null;
|
||||
}
|
||||
|
||||
// best-effort DB sync
|
||||
try {
|
||||
if ($upd && ((string)$storedRid !== (string)$rid)) {
|
||||
if ($hasRumahIbadahId && $hasJarak) {
|
||||
$upd->execute([':rid' => $rid, ':jarak' => $jarak, ':id' => (int)$p['id']]);
|
||||
} elseif ($hasRumahIbadahId) {
|
||||
$upd->execute([':rid' => $rid, ':id' => (int)$p['id']]);
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
unset($p);
|
||||
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
function normalizePointRows($rows) {
|
||||
foreach ($rows as &$row) {
|
||||
if ((!isset($row['latitude']) || $row['latitude'] === null) && isset($row['geom']) && is_string($row['geom'])) {
|
||||
$geom = json_decode($row['geom'], true);
|
||||
if (is_array($geom) && ($geom['type'] ?? '') === 'Point') {
|
||||
$coords = $geom['coordinates'] ?? null;
|
||||
if (is_array($coords) && count($coords) >= 2) {
|
||||
// GeoJSON: [lng, lat]
|
||||
$row['longitude'] = $coords[0];
|
||||
$row['latitude'] = $coords[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $rows;
|
||||
}
|
||||
|
||||
try {
|
||||
// Preferred schema: has latitude/longitude columns.
|
||||
$stmt = $pdo->query("
|
||||
SELECT id, nama, no, deskripsi, status_24jam, latitude, longitude
|
||||
FROM spbu_points
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$rows = $stmt->fetchAll();
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
} catch (Exception $e) {
|
||||
// continue
|
||||
}
|
||||
|
||||
try {
|
||||
// Fallback schema: latitude/longitude exists, geom stored as LONGTEXT GeoJSON.
|
||||
$stmt = $pdo->query("
|
||||
SELECT id, nama, no, deskripsi, status_24jam, latitude, longitude, geom
|
||||
FROM spbu_points
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$rows = $stmt->fetchAll();
|
||||
$rows = normalizePointRows($rows);
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
} catch (Exception $e) {
|
||||
// continue
|
||||
}
|
||||
|
||||
try {
|
||||
// Fallback schema: only geom LONGTEXT; derive latitude/longitude from GeoJSON.
|
||||
$stmt = $pdo->query("
|
||||
SELECT
|
||||
id,
|
||||
nama,
|
||||
NULL AS no,
|
||||
NULL AS deskripsi,
|
||||
0 AS status_24jam,
|
||||
geom
|
||||
FROM spbu_points
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$rows = $stmt->fetchAll();
|
||||
$rows = normalizePointRows($rows);
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
} catch (Exception $e) {
|
||||
// continue
|
||||
}
|
||||
|
||||
try {
|
||||
// Fallback schema: spatial geom
|
||||
$stmt = $pdo->query("
|
||||
SELECT
|
||||
id,
|
||||
nama,
|
||||
NULL AS no,
|
||||
NULL AS deskripsi,
|
||||
0 AS status_24jam,
|
||||
ST_Y(geom) AS latitude,
|
||||
ST_X(geom) AS longitude
|
||||
FROM spbu_points
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$rows = $stmt->fetchAll();
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
} catch (Exception $e) {
|
||||
// continue
|
||||
}
|
||||
|
||||
// Last resort
|
||||
$stmt = $pdo->query("SELECT * FROM spbu_points ORDER BY id ASC");
|
||||
$rows = $stmt->fetchAll();
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
// Include jumlah penduduk binaan per rumah ibadah
|
||||
$stmt = $pdo->query("
|
||||
SELECT r.*,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM pemukiman_miskin_points p
|
||||
WHERE p.rumah_ibadah_id = r.id
|
||||
) AS binaan_count
|
||||
FROM rumah_ibadah_points r
|
||||
ORDER BY r.id ASC
|
||||
");
|
||||
$rows = $stmt->fetchAll();
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
$lat = isset($_GET['lat']) ? (float)$_GET['lat'] : null;
|
||||
$lng = isset($_GET['lng']) ? (float)$_GET['lng'] : null;
|
||||
|
||||
if ($lat === null || $lng === null) {
|
||||
echo json_encode(["success" => false, "message" => "lat/lng wajib diisi"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Nominatim usage policy requires a valid User-Agent identifying the application.
|
||||
$url = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=" . urlencode($lat) . "&lon=" . urlencode($lng);
|
||||
|
||||
try {
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 12);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"User-Agent: webgis-spbu/1.0 (XAMPP PHP reverse geocode)"
|
||||
]);
|
||||
$resp = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$err = curl_error($ch);
|
||||
curl_close($ch);
|
||||
|
||||
if ($resp === false || $code < 200 || $code >= 300) {
|
||||
echo json_encode(["success" => false, "message" => $err ?: ("HTTP " . $code)]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$json = json_decode($resp, true);
|
||||
$display = $json['display_name'] ?? null;
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"address" => $display,
|
||||
"raw" => $json
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "message" => "Data kosong"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
$nama_jalan = trim($data['nama_jalan'] ?? '');
|
||||
$status_jalan = trim($data['status_jalan'] ?? '');
|
||||
$panjang_meter = (float)($data['panjang_meter'] ?? 0);
|
||||
$geometry = $data['geometry'] ?? null;
|
||||
|
||||
if ($id <= 0 || $nama_jalan === '' || $status_jalan === '' || !$geometry) {
|
||||
echo json_encode(["success" => false, "message" => "Data update jalan belum lengkap"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$sql = "UPDATE jalan_lines
|
||||
SET nama_jalan = :nama_jalan,
|
||||
status_jalan = :status_jalan,
|
||||
panjang_meter = :panjang_meter,
|
||||
geojson = :geojson
|
||||
WHERE id = :id";
|
||||
|
||||
$geojson = json_encode($geometry, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute([
|
||||
':nama_jalan' => $nama_jalan,
|
||||
':status_jalan' => $status_jalan,
|
||||
':panjang_meter' => $panjang_meter,
|
||||
':geojson' => $geojson,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data jalan berhasil diupdate"]);
|
||||
exit;
|
||||
} catch (Exception $inner) {
|
||||
// fallback to spatial geom schema
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("UPDATE jalan_lines
|
||||
SET nama_jalan = :nama_jalan,
|
||||
status_jalan = :status_jalan,
|
||||
panjang_meter = :panjang_meter,
|
||||
geom = ST_GeomFromGeoJSON(:geojson)
|
||||
WHERE id = :id");
|
||||
|
||||
$stmt->execute([
|
||||
':nama_jalan' => $nama_jalan,
|
||||
':status_jalan' => $status_jalan,
|
||||
':panjang_meter' => $panjang_meter,
|
||||
':geojson' => $geojson,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data jalan berhasil diupdate"]);
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "message" => "Data kosong"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
$status_kepemilikan = trim($data['status_kepemilikan'] ?? '');
|
||||
$luas_m2 = (float)($data['luas_m2'] ?? 0);
|
||||
$geometry = $data['geometry'] ?? null;
|
||||
|
||||
if ($id <= 0 || $status_kepemilikan === '' || !$geometry) {
|
||||
echo json_encode(["success" => false, "message" => "Data update parsil belum lengkap"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$sql = "UPDATE parsil_tanah
|
||||
SET status_kepemilikan = :status_kepemilikan,
|
||||
luas_m2 = :luas_m2,
|
||||
geojson = :geojson
|
||||
WHERE id = :id";
|
||||
|
||||
$geojson = json_encode($geometry, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute([
|
||||
':status_kepemilikan' => $status_kepemilikan,
|
||||
':luas_m2' => $luas_m2,
|
||||
':geojson' => $geojson,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data parsil berhasil diupdate"]);
|
||||
exit;
|
||||
} catch (Exception $inner) {
|
||||
// fallback to spatial geom schema
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("UPDATE parsil_tanah
|
||||
SET status_kepemilikan = :status_kepemilikan,
|
||||
luas_m2 = :luas_m2,
|
||||
geom = ST_GeomFromGeoJSON(:geojson)
|
||||
WHERE id = :id");
|
||||
|
||||
$stmt->execute([
|
||||
':status_kepemilikan' => $status_kepemilikan,
|
||||
':luas_m2' => $luas_m2,
|
||||
':geojson' => $geojson,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data parsil berhasil diupdate"]);
|
||||
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
function haversine_m($lat1, $lon1, $lat2, $lon2) {
|
||||
$R = 6371000.0;
|
||||
$phi1 = deg2rad((float)$lat1);
|
||||
$phi2 = deg2rad((float)$lat2);
|
||||
$dphi = deg2rad((float)$lat2 - (float)$lat1);
|
||||
$dlambda = deg2rad((float)$lon2 - (float)$lon1);
|
||||
$a = sin($dphi/2) * sin($dphi/2) + cos($phi1) * cos($phi2) * sin($dlambda/2) * sin($dlambda/2);
|
||||
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
|
||||
return $R * $c;
|
||||
}
|
||||
|
||||
function get_payload() {
|
||||
$ct = $_SERVER['CONTENT_TYPE'] ?? '';
|
||||
if (stripos($ct, 'multipart/form-data') !== false) {
|
||||
return [
|
||||
'id' => $_POST['id'] ?? 0,
|
||||
'kk_nama' => $_POST['kk_nama'] ?? '',
|
||||
'nik' => $_POST['nik'] ?? '',
|
||||
'jumlah_anggota' => $_POST['jumlah_anggota'] ?? '',
|
||||
'latitude' => $_POST['latitude'] ?? null,
|
||||
'longitude' => $_POST['longitude'] ?? null,
|
||||
'address' => $_POST['address'] ?? '',
|
||||
'kelurahan' => $_POST['kelurahan'] ?? '',
|
||||
'kecamatan' => $_POST['kecamatan'] ?? '',
|
||||
'status_bantuan' => $_POST['status_bantuan'] ?? 'Belum dibantu',
|
||||
'jenis_bantuan' => $_POST['jenis_bantuan'] ?? '',
|
||||
'tanggal_bantuan' => $_POST['tanggal_bantuan'] ?? '',
|
||||
'anggota' => $_POST['anggota'] ?? '[]'
|
||||
];
|
||||
}
|
||||
$json = json_decode(file_get_contents('php://input'), true);
|
||||
return is_array($json) ? $json : null;
|
||||
}
|
||||
|
||||
function compute_nearest_ibadah(PDO $pdo, $lat, $lng) {
|
||||
$stmt = $pdo->query("SELECT id, latitude, longitude, radius_meter FROM rumah_ibadah_points");
|
||||
$rows = $stmt->fetchAll();
|
||||
$best = null;
|
||||
foreach ($rows as $r) {
|
||||
$rLat = (float)$r['latitude'];
|
||||
$rLng = (float)$r['longitude'];
|
||||
$radius = (float)$r['radius_meter'];
|
||||
if ($radius <= 0) continue;
|
||||
$d = haversine_m($lat, $lng, $rLat, $rLng);
|
||||
if ($d <= $radius) {
|
||||
if ($best === null || $d < $best['jarak_meter']) {
|
||||
$best = ['rumah_ibadah_id' => (int)$r['id'], 'jarak_meter' => $d];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $best ?: ['rumah_ibadah_id' => null, 'jarak_meter' => null];
|
||||
}
|
||||
|
||||
function save_upload_if_any() {
|
||||
if (!isset($_FILES['bukti_file']) || !is_array($_FILES['bukti_file'])) return null;
|
||||
if (($_FILES['bukti_file']['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) return null;
|
||||
$dir = __DIR__ . '/../uploads/bukti';
|
||||
if (!is_dir($dir)) @mkdir($dir, 0775, true);
|
||||
if (!is_dir($dir)) return null;
|
||||
|
||||
$orig = (string)($_FILES['bukti_file']['name'] ?? 'file');
|
||||
$ext = strtolower(pathinfo($orig, PATHINFO_EXTENSION));
|
||||
$allowed = ['jpg','jpeg','png','webp','pdf'];
|
||||
if ($ext && !in_array($ext, $allowed, true)) return null;
|
||||
|
||||
$safeBase = preg_replace('/[^a-zA-Z0-9._-]+/', '_', pathinfo($orig, PATHINFO_FILENAME));
|
||||
$safeBase = trim($safeBase, '_');
|
||||
if ($safeBase === '') $safeBase = 'bukti';
|
||||
$filename = $safeBase . '_' . date('Ymd_His') . '_' . bin2hex(random_bytes(4)) . ($ext ? ('.' . $ext) : '');
|
||||
$dest = $dir . '/' . $filename;
|
||||
if (!move_uploaded_file($_FILES['bukti_file']['tmp_name'], $dest)) return null;
|
||||
return 'uploads/bukti/' . $filename;
|
||||
}
|
||||
|
||||
$data = get_payload();
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "message" => "Payload kosong atau tidak valid."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
$kk_nama = trim($data['kk_nama'] ?? $data['nama'] ?? '');
|
||||
$nik = trim($data['nik'] ?? '');
|
||||
$jumlah_anggota = (int)($data['jumlah_anggota'] ?? 0);
|
||||
$latitude = $data['latitude'] ?? null;
|
||||
$longitude = $data['longitude'] ?? null;
|
||||
$address = trim($data['address'] ?? '');
|
||||
$kelurahan = trim($data['kelurahan'] ?? '');
|
||||
$kecamatan = trim($data['kecamatan'] ?? '');
|
||||
$status_bantuan = trim($data['status_bantuan'] ?? 'Belum dibantu');
|
||||
$jenis_bantuan = trim($data['jenis_bantuan'] ?? '');
|
||||
$tanggal_bantuan = trim($data['tanggal_bantuan'] ?? '');
|
||||
$anggotaRaw = $data['anggota'] ?? [];
|
||||
|
||||
$validStatus = ['Belum dibantu', 'Sudah dibantu', 'Menunggu verifikasi'];
|
||||
if (!in_array($status_bantuan, $validStatus, true)) $status_bantuan = 'Belum dibantu';
|
||||
|
||||
if ($id <= 0 || $kk_nama === '' || $latitude === null || $longitude === null) {
|
||||
echo json_encode(["success" => false, "message" => "Data update penduduk miskin belum lengkap."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$lat = (float)$latitude;
|
||||
$lng = (float)$longitude;
|
||||
$nearest = compute_nearest_ibadah($pdo, $lat, $lng);
|
||||
$uploadPath = save_upload_if_any();
|
||||
|
||||
$cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
$hasNew = in_array('kk_nama', $cols, true);
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
if ($hasNew) {
|
||||
if ($uploadPath === null) {
|
||||
$stmt = $pdo->prepare("SELECT bukti_file FROM pemukiman_miskin_points WHERE id = :id");
|
||||
$stmt->execute([':id' => $id]);
|
||||
$uploadPath = $stmt->fetchColumn() ?: null;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE pemukiman_miskin_points
|
||||
SET kk_nama = :kk_nama,
|
||||
nik = :nik,
|
||||
jumlah_anggota = :jumlah_anggota,
|
||||
latitude = :latitude,
|
||||
longitude = :longitude,
|
||||
address = :address,
|
||||
kelurahan = :kelurahan,
|
||||
kecamatan = :kecamatan,
|
||||
status_bantuan = :status_bantuan,
|
||||
jenis_bantuan = :jenis_bantuan,
|
||||
tanggal_bantuan = :tanggal_bantuan,
|
||||
bukti_file = :bukti_file,
|
||||
jarak_meter = :jarak_meter,
|
||||
rumah_ibadah_id = :rumah_ibadah_id
|
||||
WHERE id = :id
|
||||
");
|
||||
$stmt->execute([
|
||||
':kk_nama' => $kk_nama,
|
||||
':nik' => ($nik === '' ? null : $nik),
|
||||
':jumlah_anggota' => $jumlah_anggota,
|
||||
':latitude' => $lat,
|
||||
':longitude' => $lng,
|
||||
':address' => ($address === '' ? null : $address),
|
||||
':kelurahan' => ($kelurahan === '' ? null : $kelurahan),
|
||||
':kecamatan' => ($kecamatan === '' ? null : $kecamatan),
|
||||
':status_bantuan' => $status_bantuan,
|
||||
':jenis_bantuan' => ($jenis_bantuan === '' ? null : $jenis_bantuan),
|
||||
':tanggal_bantuan' => ($tanggal_bantuan === '' ? null : $tanggal_bantuan),
|
||||
':bukti_file' => $uploadPath,
|
||||
':jarak_meter' => $nearest['jarak_meter'],
|
||||
':rumah_ibadah_id' => $nearest['rumah_ibadah_id'],
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
// anggota keluarga (replace)
|
||||
$pdo->prepare("DELETE FROM anggota_keluarga WHERE penduduk_id = :id")->execute([':id' => $id]);
|
||||
$anggota = is_string($anggotaRaw) ? json_decode($anggotaRaw, true) : $anggotaRaw;
|
||||
if (is_array($anggota) && count($anggota) > 0) {
|
||||
$ins = $pdo->prepare("
|
||||
INSERT INTO anggota_keluarga (penduduk_id, nama, hubungan, umur, pekerjaan, keterangan)
|
||||
VALUES (:penduduk_id, :nama, :hubungan, :umur, :pekerjaan, :keterangan)
|
||||
");
|
||||
foreach ($anggota as $a) {
|
||||
$n = trim((string)($a['nama'] ?? ''));
|
||||
$h = trim((string)($a['hubungan'] ?? ''));
|
||||
if ($n === '' || $h === '') continue;
|
||||
$ins->execute([
|
||||
':penduduk_id' => $id,
|
||||
':nama' => $n,
|
||||
':hubungan' => $h,
|
||||
':umur' => isset($a['umur']) && $a['umur'] !== '' ? (int)$a['umur'] : null,
|
||||
':pekerjaan' => ($a['pekerjaan'] ?? '') === '' ? null : (string)$a['pekerjaan'],
|
||||
':keterangan' => ($a['keterangan'] ?? '') === '' ? null : (string)$a['keterangan']
|
||||
]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE pemukiman_miskin_points
|
||||
SET nama = :nama,
|
||||
latitude = :latitude,
|
||||
longitude = :longitude,
|
||||
address = :address,
|
||||
rumah_ibadah_id = :rumah_ibadah_id
|
||||
WHERE id = :id
|
||||
");
|
||||
$stmt->execute([
|
||||
':nama' => $kk_nama,
|
||||
':latitude' => $lat,
|
||||
':longitude' => $lng,
|
||||
':address' => ($address === '' ? null : $address),
|
||||
':rumah_ibadah_id' => $nearest['rumah_ibadah_id'],
|
||||
':id' => $id
|
||||
]);
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"rumah_ibadah_id" => $nearest['rumah_ibadah_id'],
|
||||
"jarak_meter" => $nearest['jarak_meter'],
|
||||
"message" => "Penduduk miskin berhasil diupdate"
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
if ($pdo->inTransaction()) $pdo->rollBack();
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
function haversine_m($lat1, $lon1, $lat2, $lon2) {
|
||||
$R = 6371000.0;
|
||||
$phi1 = deg2rad((float)$lat1);
|
||||
$phi2 = deg2rad((float)$lat2);
|
||||
$dphi = deg2rad((float)$lat2 - (float)$lat1);
|
||||
$dlambda = deg2rad((float)$lon2 - (float)$lon1);
|
||||
$a = sin($dphi/2) * sin($dphi/2) + cos($phi1) * cos($phi2) * sin($dlambda/2) * sin($dlambda/2);
|
||||
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
|
||||
return $R * $c;
|
||||
}
|
||||
|
||||
function compute_nearest_ibadah(PDO $pdo, $lat, $lng) {
|
||||
$stmt = $pdo->query("SELECT id, latitude, longitude, radius_meter FROM rumah_ibadah_points");
|
||||
$rows = $stmt->fetchAll();
|
||||
$best = null;
|
||||
foreach ($rows as $r) {
|
||||
$rLat = (float)$r['latitude'];
|
||||
$rLng = (float)$r['longitude'];
|
||||
$radius = (float)$r['radius_meter'];
|
||||
if ($radius <= 0) continue;
|
||||
$d = haversine_m($lat, $lng, $rLat, $rLng);
|
||||
if ($d <= $radius) {
|
||||
if ($best === null || $d < $best['jarak_meter']) {
|
||||
$best = ['rumah_ibadah_id' => (int)$r['id'], 'jarak_meter' => $d];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $best ?: ['rumah_ibadah_id' => null, 'jarak_meter' => null];
|
||||
}
|
||||
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
if (!is_array($data)) {
|
||||
echo json_encode(["success" => false, "message" => "Payload JSON kosong atau tidak valid."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
$lat = isset($data['latitude']) ? (float)$data['latitude'] : null;
|
||||
$lng = isset($data['longitude']) ? (float)$data['longitude'] : null;
|
||||
if ($id <= 0 || $lat === null || $lng === null) {
|
||||
echo json_encode(["success" => false, "message" => "Data update lokasi belum lengkap (id/lat/lng)."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$nearest = compute_nearest_ibadah($pdo, $lat, $lng);
|
||||
$cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
$hasNew = in_array('kk_nama', $cols, true);
|
||||
|
||||
if ($hasNew) {
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE pemukiman_miskin_points
|
||||
SET latitude = :lat,
|
||||
longitude = :lng,
|
||||
jarak_meter = :jarak_meter,
|
||||
rumah_ibadah_id = :rumah_ibadah_id
|
||||
WHERE id = :id
|
||||
");
|
||||
$stmt->execute([
|
||||
':lat' => $lat,
|
||||
':lng' => $lng,
|
||||
':jarak_meter' => $nearest['jarak_meter'],
|
||||
':rumah_ibadah_id' => $nearest['rumah_ibadah_id'],
|
||||
':id' => $id
|
||||
]);
|
||||
} else {
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE pemukiman_miskin_points
|
||||
SET latitude = :lat,
|
||||
longitude = :lng,
|
||||
rumah_ibadah_id = :rumah_ibadah_id
|
||||
WHERE id = :id
|
||||
");
|
||||
$stmt->execute([
|
||||
':lat' => $lat,
|
||||
':lng' => $lng,
|
||||
':rumah_ibadah_id' => $nearest['rumah_ibadah_id'],
|
||||
':id' => $id
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"rumah_ibadah_id" => $nearest['rumah_ibadah_id'],
|
||||
"jarak_meter" => $nearest['jarak_meter'],
|
||||
"message" => "Lokasi penduduk miskin berhasil diupdate"
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "message" => "Data kosong"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
$nama = trim($data['nama'] ?? '');
|
||||
$no = trim($data['no'] ?? '');
|
||||
$deskripsi = trim($data['deskripsi'] ?? '');
|
||||
$status_24jam = isset($data['status_24jam']) ? (int)$data['status_24jam'] : 0;
|
||||
$latitude = $data['latitude'] ?? null;
|
||||
$longitude = $data['longitude'] ?? null;
|
||||
|
||||
if ($id <= 0 || $nama === '' || $no === '' || $latitude === null || $longitude === null) {
|
||||
echo json_encode(["success" => false, "message" => "Data update point belum lengkap"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$sql = "UPDATE spbu_points
|
||||
SET nama = :nama,
|
||||
no = :no,
|
||||
deskripsi = :deskripsi,
|
||||
status_24jam = :status_24jam,
|
||||
latitude = :latitude,
|
||||
longitude = :longitude
|
||||
WHERE id = :id";
|
||||
|
||||
$pointGeojson = json_encode([
|
||||
"type" => "Point",
|
||||
"coordinates" => [(float)$longitude, (float)$latitude]
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':no' => $no,
|
||||
':deskripsi' => $deskripsi,
|
||||
':status_24jam' => $status_24jam,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data point berhasil diupdate"]);
|
||||
exit;
|
||||
} catch (Exception $inner) {
|
||||
// continue fallback
|
||||
}
|
||||
|
||||
// Fallback schema: geom LONGTEXT
|
||||
try {
|
||||
$stmt = $pdo->prepare("UPDATE spbu_points
|
||||
SET nama = :nama,
|
||||
no = :no,
|
||||
deskripsi = :deskripsi,
|
||||
status_24jam = :status_24jam,
|
||||
latitude = :latitude,
|
||||
longitude = :longitude,
|
||||
geom = :geom
|
||||
WHERE id = :id");
|
||||
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':no' => $no,
|
||||
':deskripsi' => $deskripsi,
|
||||
':status_24jam' => $status_24jam,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude,
|
||||
':geom' => $pointGeojson,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data point berhasil diupdate"]);
|
||||
exit;
|
||||
} catch (Exception $inner2) {
|
||||
// continue fallback
|
||||
}
|
||||
|
||||
// Fallback schema: only (nama, geom) where geom is LONGTEXT GeoJSON
|
||||
try {
|
||||
$stmt = $pdo->prepare("UPDATE spbu_points
|
||||
SET nama = :nama,
|
||||
geom = :geom
|
||||
WHERE id = :id");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':geom' => $pointGeojson,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data point berhasil diupdate"]);
|
||||
exit;
|
||||
} catch (Exception $inner3) {
|
||||
// continue fallback
|
||||
}
|
||||
|
||||
// Fallback schema: spatial geom
|
||||
$stmt = $pdo->prepare("UPDATE spbu_points
|
||||
SET nama = :nama,
|
||||
geom = ST_GeomFromGeoJSON(:geom)
|
||||
WHERE id = :id");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':geom' => $pointGeojson,
|
||||
':id' => $id
|
||||
]);
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Data point berhasil diupdate"]);
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once 'koneksi.php';
|
||||
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
if (!$data) {
|
||||
echo json_encode(["success" => false, "message" => "Payload JSON kosong atau tidak valid."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($data['id'] ?? 0);
|
||||
$nama = trim($data['nama'] ?? '');
|
||||
$jenis = trim($data['jenis'] ?? 'Lainnya');
|
||||
$kontak = trim($data['kontak'] ?? '');
|
||||
$radius_meter = (float)($data['radius_meter'] ?? 0);
|
||||
$latitude = $data['latitude'] ?? null;
|
||||
$longitude = $data['longitude'] ?? null;
|
||||
$address = trim($data['address'] ?? '');
|
||||
|
||||
if ($id <= 0 || $nama === '' || $radius_meter <= 0 || $latitude === null || $longitude === null) {
|
||||
echo json_encode(["success" => false, "message" => "Data update rumah ibadah belum lengkap."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$cols = $pdo->query("SHOW COLUMNS FROM rumah_ibadah_points")->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
$hasJenis = in_array('jenis', $cols, true);
|
||||
$hasKontak = in_array('kontak', $cols, true);
|
||||
|
||||
if ($hasJenis && $hasKontak) {
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE rumah_ibadah_points
|
||||
SET nama = :nama,
|
||||
jenis = :jenis,
|
||||
kontak = :kontak,
|
||||
radius_meter = :radius_meter,
|
||||
latitude = :latitude,
|
||||
longitude = :longitude,
|
||||
address = :address
|
||||
WHERE id = :id
|
||||
");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':jenis' => ($jenis === '' ? 'Lainnya' : $jenis),
|
||||
':kontak' => ($kontak === '' ? null : $kontak),
|
||||
':radius_meter' => $radius_meter,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude,
|
||||
':address' => ($address === '' ? null : $address),
|
||||
':id' => $id
|
||||
]);
|
||||
} else {
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE rumah_ibadah_points
|
||||
SET nama = :nama,
|
||||
radius_meter = :radius_meter,
|
||||
latitude = :latitude,
|
||||
longitude = :longitude,
|
||||
address = :address
|
||||
WHERE id = :id
|
||||
");
|
||||
$stmt->execute([
|
||||
':nama' => $nama,
|
||||
':radius_meter' => $radius_meter,
|
||||
':latitude' => $latitude,
|
||||
':longitude' => $longitude,
|
||||
':address' => ($address === '' ? null : $address),
|
||||
':id' => $id
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Rumah ibadah berhasil diupdate"]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
Reference in New Issue
Block a user