crud master poli php | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: crud master poli php

Monday, October 12, 2026

crud master poli php

🏥🩺

Kelola Master Poli: Modul CRUD Data Poliklinik

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 isiPoli Umum, Poli Gigi, Poli KIABudi berobat ke Poli Gigi, 12 Okt 2026
Frekuensi berubahJarang (saat ada poli baru)Setiap hari
Jumlah barisPuluhanRibuan sampai jutaan
Risiko jika salahLaporan semua poli ikut kacauSatu 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.

① Koneksi: koneksi.php

📄 koneksi.php
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$koneksi = new mysqli("localhost", "root", "", "db_klinik");
$koneksi->set_charset("utf8mb4");

② Read: poli.php

📄 poli.php
<?php
require "koneksi.php";
$hasil = $koneksi->query("SELECT * FROM poli ORDER BY nama_poli ASC");
?>
<h2>Master Data Poli</h2>
<?php if (isset($_GET['pesan'])) echo "<p>" . htmlspecialchars($_GET['pesan']) . "</p>"; ?>
<a href="poli_tambah.php">+ Tambah Poli</a>
<table border="1" cellpadding="8" cellspacing="0">
  <tr><th>No</th><th>Kode</th><th>Nama Poli</th><th>Ruang</th><th>Status</th><th>Aksi</th></tr>
  <?php $no = 1; while ($row = $hasil->fetch_assoc()) { ?>
  <tr>
    <td><?= $no++ ?></td>
    <td><?= htmlspecialchars($row['kode_poli']) ?></td>
    <td><?= htmlspecialchars($row['nama_poli']) ?></td>
    <td><?= htmlspecialchars($row['lokasi_ruang']) ?></td>
    <td><?= $row['status'] ?></td>
    <td>
      <a href="poli_edit.php?id=<?= $row['id_poli'] ?>">Ubah</a> |
      <a href="poli_hapus.php?id=<?= $row['id_poli'] ?>" onclick="return confirm('Hapus poli ini?')">Hapus</a>
    </td>
  </tr>
  <?php } ?>
</table>

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 dibuatCek ejaan di phpMyAdmin, samakan dengan koneksi.php
Access denied for user 'root'Password MySQL tidak sesuaiDefault 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 browserFile dibuka via file:// atau disimpan berekstensi .htmlSimpan sebagai .php di htdocs, buka lewat http://localhost/klinik/
Cannot delete ... foreign key constraint failsPoli 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):

  1. Tambah kolom jam_praktik (misalnya 08.00–14.00) lewat ALTER TABLE, lalu tampilkan dan ubah datanya di modul CRUD.
  2. Buat fitur pencarian nama poli di poli.php memakai LIKE dan prepared statement.
  3. 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!

💬 Tulis Komentar 🔗 Bagikan Artikel
🏷️ Tag
#PemrogramanWeb #D4MIK #MasterPoli #ModulCRUD #DataPoliklinik
📂 Label
Master Data Poli CRUD PHP MySQL Modul Poliklinik Praktikum MIK
📚
ARTIKEL UTAMA SERI
Pemrograman Web D4 MIK

Artikel ini adalah bagian ke-11 dari 16. Lihat seluruh rangkaian materi di Daftar Isi.

📖 Buka Daftar Isi Artikel
← ARTIKEL SEBELUMNYA
Artikel 10: Ubah dan Hapus dengan Aman: CRUD Bagian Update dan Delete Data Pasien (Konfirmasi Hapus, Prepared Statement)
Baca artikel →
ARTIKEL SELANJUTNYA →
Artikel 12: Hubungkan Pasien dan Poli: Relasi Tabel, Foreign Key, dan Form Pendaftaran Kunjungan Pasien (JOIN)
Baca artikel →

No comments:

Post a Comment

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