Poli Umum, Gigi, KIA, dan lainnya — bangun fondasi data pelayanan kesehatan dengan PHP dan MySQL, langkah demi langkah.
#MasterDataPoli#PHP & MySQL#CRUD#XAMPP
⏱️
±12 menit
Estimasi baca
📊
Menengah
Level
📅
2026
Tahun
Bayangkan kamu bertugas di loket pendaftaran. Pasien datang, lalu kamu bingung: poli gigi itu ditulis "Poli Gigi", "poli gigi", atau "Gigi & Mulut"? Satu rumah sakit, tiga ejaan, dan laporan kunjungan pun berantakan. Biang keroknya hampir selalu sama: master data poli yang tidak dikelola rapi.
Artikel ke-11 dari seri Pemrograman Web D4 MIK ini mengajakmu membangun modul CRUD untuk Poli Umum, Poli Gigi, Poli KIA, dan poli lainnya memakai PHP dan MySQL di XAMPP. Satu pertemuan praktikum cukup. Buka Sublime Text, kita mulai!
Memahami Master Data Poli: Fondasi Data Pelayanan Kesehatan
Analogi gampangnya begini: master data itu seperti daftar menu di restoran, sedangkan data transaksi seperti pesanan pelanggan. Menu cukup ditulis sekali dan jarang berubah, tapi setiap pesanan merujuk ke menu itu. Di fasilitas kesehatan, daftar poli adalah "menu"-nya, dan setiap kunjungan pasien adalah "pesanan"-nya.
📐 KONSEP UTAMA
Master data = data referensi yang jarang berubah dan dipakai oleh banyak transaksi.
[ POLI ] 1 ───── N [ KUNJUNGAN ] N ───── 1 [ PASIEN ]
master transaksi master
Aspek
Master Data Poli
Data Kunjungan (Transaksi)
Contoh isi
Poli Umum, Poli Gigi, Poli KIA
Budi berobat ke Poli Gigi, 12 Okt 2026
Frekuensi berubah
Jarang (saat ada poli baru)
Setiap hari
Jumlah baris
Puluhan
Ribuan sampai jutaan
Risiko jika salah
Laporan semua poli ikut kacau
Satu kunjungan keliru
⚡ Insight Penting
Karena master data poli dirujuk banyak tabel lain, kesalahan kecil di sini menjalar ke mana-mana. Itulah kenapa modul ini kita kerjakan sebelum modul kunjungan di Artikel 12.
Menyiapkan Database untuk Master Data Poli di phpMyAdmin
Sebelum menulis PHP, siapkan dulu "lemari arsip"-nya. Ikuti langkah berikut di komputer laboratorium (Windows):
1
Nyalakan layanan. Buka XAMPP Control Panel, klik Start pada Apache dan MySQL sampai keduanya berwarna hijau.
2
Buka phpMyAdmin. Ketik http://localhost/phpmyadmin di browser.
3
Pilih database. Pakai database db_klinik dari artikel sebelumnya. Kalau belum ada, buat dulu dengan collation utf8mb4_general_ci.
4
Jalankan SQL. Klik tab SQL, tempel kode di bawah, lalu klik Go.
📄 tabel_poli.sql
CREATE TABLE poli (
id_poli INT AUTO_INCREMENT PRIMARY KEY,
kode_poli VARCHAR(10) NOT NULL UNIQUE,
nama_poli VARCHAR(50) NOT NULL,
lokasi_ruang VARCHAR(50),
status ENUM('aktif','nonaktif') NOT NULL DEFAULT 'aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO poli (kode_poli, nama_poli, lokasi_ruang) VALUES
('POL-UM', 'Poli Umum', 'Gedung A, Ruang 1'),
('POL-GG', 'Poli Gigi', 'Gedung A, Ruang 2'),
('POL-KIA', 'Poli KIA', 'Gedung B, Ruang 1');
Hasil yang diharapkan: di sisi kiri phpMyAdmin muncul tabel poli, dan tab Browse menampilkan 3 baris data fiktif.
💡 Tips
Kolom kode_poli dibuat UNIQUE supaya database sendiri yang menolak kode ganda. Jangan hanya mengandalkan petugas yang teliti — manusia bisa lelah, constraint tidak.
Membangun Modul CRUD Master Data Poli dengan PHP dan MySQL
Buat folder C:\xampp\htdocs\klinik\, lalu simpan lima file berikut dengan Sublime Text. Kita kerjakan berurutan dari koneksi sampai hapus.
Hasil yang diharapkan: buka http://localhost/klinik/poli.php dan tabel berisi Poli Gigi, Poli KIA, dan Poli Umum (urut abjad) tampil lengkap dengan tautan Ubah dan Hapus.
⚠️ Perhatian
Data dari database selalu dibungkus htmlspecialchars() sebelum ditampilkan. Tanpa itu, nama poli yang berisi tag HTML bisa merusak halaman atau membuka celah XSS.
③ Create: poli_tambah.php
📄 poli_tambah.php
<?php
require "koneksi.php";
$error = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$kode = trim($_POST['kode_poli']);
$nama = trim($_POST['nama_poli']);
$ruang = trim($_POST['lokasi_ruang']);
$status = $_POST['status'];
if ($kode === "" || $nama === "") {
$error = "Kode dan nama poli wajib diisi.";
} else {
try {
$stmt = $koneksi->prepare("INSERT INTO poli (kode_poli, nama_poli, lokasi_ruang, status) VALUES (?, ?, ?, ?)");
$stmt->bind_param("ssss", $kode, $nama, $ruang, $status);
$stmt->execute();
header("Location: poli.php?pesan=Poli+berhasil+ditambahkan");
exit;
} catch (mysqli_sql_exception $e) {
$error = ($e->getCode() == 1062) ? "Kode poli sudah dipakai." : "Gagal menyimpan data.";
}
}
}
?>
<h2>Tambah Poli</h2>
<?php if ($error) echo "<p style='color:red'>" . htmlspecialchars($error) . "</p>"; ?>
<form method="post">
Kode Poli <input type="text" name="kode_poli" maxlength="10"><br>
Nama Poli <input type="text" name="nama_poli" maxlength="50"><br>
Lokasi Ruang <input type="text" name="lokasi_ruang" maxlength="50"><br>
Status <select name="status">
<option value="aktif">Aktif</option>
<option value="nonaktif">Nonaktif</option>
</select><br>
<button type="submit">Simpan</button> <a href="poli.php">Batal</a>
</form>
Hasil yang diharapkan: isi kode POL-ANK dan nama Poli Anak, klik Simpan, lalu kamu kembali ke daftar dengan pesan sukses. Coba kirim kode POL-UM lagi dan pesan "Kode poli sudah dipakai." akan muncul.
🔥 Fakta Menarik
Kategori Injection (termasuk SQL Injection) masuk daftar OWASP Top 10 edisi 2021 sebagai A03. Prepared statement dengan tanda ? seperti di kode ini adalah pertahanan utama yang direkomendasikan OWASP.
④ Update: poli_edit.php
📄 poli_edit.php
<?php
require "koneksi.php";
$id = (int) ($_GET['id'] ?? 0);
$stmt = $koneksi->prepare("SELECT * FROM poli WHERE id_poli = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$poli = $stmt->get_result()->fetch_assoc();
if (!$poli) { die("Data poli tidak ditemukan."); }
$error = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$kode = trim($_POST['kode_poli']);
$nama = trim($_POST['nama_poli']);
$ruang = trim($_POST['lokasi_ruang']);
$status = $_POST['status'];
try {
$up = $koneksi->prepare("UPDATE poli SET kode_poli=?, nama_poli=?, lokasi_ruang=?, status=? WHERE id_poli=?");
$up->bind_param("ssssi", $kode, $nama, $ruang, $status, $id);
$up->execute();
header("Location: poli.php?pesan=Poli+berhasil+diubah");
exit;
} catch (mysqli_sql_exception $e) {
$error = ($e->getCode() == 1062) ? "Kode poli sudah dipakai." : "Gagal mengubah data.";
}
}
?>
<h2>Ubah Poli</h2>
<?php if ($error) echo "<p style='color:red'>" . htmlspecialchars($error) . "</p>"; ?>
<form method="post">
Kode Poli <input type="text" name="kode_poli" value="<?= htmlspecialchars($poli['kode_poli']) ?>"><br>
Nama Poli <input type="text" name="nama_poli" value="<?= htmlspecialchars($poli['nama_poli']) ?>"><br>
Lokasi Ruang <input type="text" name="lokasi_ruang" value="<?= htmlspecialchars($poli['lokasi_ruang']) ?>"><br>
Status <select name="status">
<option value="aktif" <?= $poli['status'] == 'aktif' ? 'selected' : '' ?>>Aktif</option>
<option value="nonaktif" <?= $poli['status'] == 'nonaktif' ? 'selected' : '' ?>>Nonaktif</option>
</select><br>
<button type="submit">Perbarui</button> <a href="poli.php">Batal</a>
</form>
Hasil yang diharapkan: klik Ubah pada Poli Umum, form terisi data lama. Ganti ruang menjadi "Gedung A, Ruang 3", simpan, dan perubahan langsung terlihat di daftar.
⑤ Delete: poli_hapus.php
📄 poli_hapus.php
<?php
require "koneksi.php";
$id = (int) ($_GET['id'] ?? 0);
try {
$stmt = $koneksi->prepare("DELETE FROM poli WHERE id_poli = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$pesan = "Poli berhasil dihapus";
} catch (mysqli_sql_exception $e) {
$pesan = ($e->getCode() == 1451)
? "Poli masih dipakai data lain, tidak bisa dihapus"
: "Gagal menghapus data";
}
header("Location: poli.php?pesan=" . urlencode($pesan));
exit;
🔍 Analisis: Hapus Permanen atau Nonaktifkan?
🗑️ Hapus permanen (DELETE) Cocok untuk data salah ketik yang belum dipakai. Baris hilang selamanya, dan MySQL menolak jika sudah dirujuk tabel lain lewat foreign key.
🔒 Nonaktifkan (status) Cocok untuk poli yang sudah punya riwayat kunjungan. Poli tidak muncul di pendaftaran baru, tetapi riwayat lama tetap utuh.
Di dunia nyata, poli yang pernah melayani pasien sebaiknya dinonaktifkan, bukan dihapus. Kamu akan melihat alasannya di Artikel 12.
Error yang Sering Muncul & Cara Mengatasinya pada Master Data Poli
Error itu normal, bahkan pertanda kamu sedang belajar. Berikut lima yang paling sering muncul saat praktikum:
Pesan / Gejala
Penyebab
Solusi
Unknown database 'db_klinik'
Nama database salah atau belum dibuat
Cek ejaan di phpMyAdmin, samakan dengan koneksi.php
Access denied for user 'root'
Password MySQL tidak sesuai
Default XAMPP kosong (""); sesuaikan jika laboratorium memakai password
Duplicate entry ... for key 'kode_poli'
Kode poli sudah ada (kode error 1062)
Gunakan kode lain; kode di atas sudah menangkapnya dengan try/catch
Kode PHP tampil mentah di browser
File dibuka via file:// atau disimpan berekstensi .html
Simpan sebagai .php di htdocs, buka lewat http://localhost/klinik/
Cannot delete ... foreign key constraint fails
Poli masih dirujuk tabel lain (kode error 1451)
Nonaktifkan poli, atau hapus data yang merujuk lebih dulu
📝 Latihan Mandiri
Kerjakan tiga tugas berikut untuk mengasah Sub-CPMK 7 (mengembangkan modul master data pelayanan kesehatan):
Tambah kolom jam_praktik (misalnya 08.00–14.00) lewat ALTER TABLE, lalu tampilkan dan ubah datanya di modul CRUD.
Buat fitur pencarian nama poli di poli.php memakai LIKE dan prepared statement.
Ganti tombol Hapus menjadi "Nonaktifkan" yang mengubah status menjadi nonaktif, lalu beri warna berbeda pada baris poli nonaktif.
⚡ Insight Penting
Pola yang kamu pelajari hari ini (tabel, koneksi, form, prepared statement) akan kamu pakai ulang untuk master dokter, master obat, hingga master diagnosis. Kuasai sekali, pakai berkali-kali.
🎯 Kesimpulan
Master data poli adalah fondasi yang dirujuk semua modul pelayanan. Hari ini kamu sudah membuat tabel poli dengan kode unik, lalu membangun CRUD lengkap: tampil, tambah, ubah, dan hapus, semuanya dengan prepared statement, htmlspecialchars(), dan penanganan error yang rapi.
Dengan master data poli yang bersih, Artikel 12 tentang relasi tabel dan kunjungan pasien akan jauh lebih mulus. Sudah berhasil menjalankannya? Ceritakan error yang kamu temui di kolom komentar, dan bagikan artikel ini ke teman sekelasmu!
saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux
No comments:
Post a Comment