Cara Membuat CRUD Data Siswa dengan PHP PDO & MySQL di XAMPP
Ditulis oleh
mrjj
Kamu pakai Windows dan ingin belajar bikin aplikasi web CRUD dari nol? Artikel ini cocok banget buat kamu — siswa SMK, mahasiswa, atau siapa pun yang baru mulai belajar PHP.
Kita akan bikin aplikasi Data Siswa yang bisa:
- ✅ Menampilkan daftar siswa
- ✅ Menambah data siswa baru
- ✅ Mengedit data siswa
- ✅ Menghapus data siswa
Semua pakai PHP PDO, MySQL, dan XAMPP di Windows. Ikuti step by step, dijamin bisa! 🚀
📌 Apa Itu CRUD?
CRUD adalah singkatan dari:
| Huruf | Arti | Fungsi |
|---|---|---|
| C | Create | Menambah data baru |
| R | Read | Menampilkan data |
| U | Update | Mengubah data |
| D | Delete | Menghapus data |
Hampir semua aplikasi (Instagram, WhatsApp, Tokopedia) punya 4 fungsi ini. Jadi kalau kamu bisa bikin CRUD, kamu sudah punya dasar bikin aplikasi besar! 💪
📌 Apa Itu PDO?
PDO (PHP Data Objects) adalah cara modern PHP untuk terhubung ke database. Kenapa kita pakai PDO, bukan mysqli?
Keunggulan PDO:
- Lebih aman — mendukung prepared statement yang mencegah SQL Injection.
- Fleksibel — bisa ganti database (MySQL, PostgreSQL, SQLite) tanpa ubah banyak kode.
- OOP friendly — kode lebih rapi dan mudah dikelola.
📌 Apa Itu XAMPP?
XAMPP adalah paket aplikasi yang berisi:
- Apache → web server
- MySQL / MariaDB → database
- PHP → bahasa pemrograman
- Perl → bahasa skrip (jarang dipakai pemula)
XAMPP memudahkan kita belajar PHP tanpa harus install satu-satu. Tinggal download, install, jalankan! 🎉
🎯 Tujuan Akhir Artikel
Setelah baca artikel ini sampai selesai, kamu akan bisa:
- Install dan menjalankan XAMPP di Windows
- Membuat database + tabel siswa dan kelas
- Menghubungkan PHP ke MySQL pakai PDO
- Membuat 4 halaman:
index.php,create.php,edit.php,delete.php - Menjalankan aplikasi di browser lewat
localhost
🛠️ Persiapan: Download & Install XAMPP
Langkah 1: Download XAMPP
- Buka website resmi: https://www.apachefriends.org/
- Klik tombol Download untuk versi Windows.
- Pilih versi PHP terbaru (misal PHP 8.2). Ukuran sekitar 150 MB.
- Tunggu sampai selesai download.
Langkah 2: Install XAMPP
- Klik dua kali file
xampp-windows-x64-8.2.x-installer.exe. - Klik Yes kalau muncul peringatan UAC.
- Klik Next sampai muncul pilihan folder instalasi.
- Penting: Biarkan folder default
C:\xampp(jangan diubah, agar tidak bingung nanti). - Uncheck semua opsi tambahan (kecuali kamu butuh), klik Next.
- Klik Next lagi, lalu Finish.
Langkah 3: Jalankan XAMPP
- Buka XAMPP Control Panel dari Start Menu (cari “XAMPP”).
- Klik tombol Start di sebelah Apache.
- Klik tombol Start di sebelah MySQL.
- Kalau dua-duanya hijau, berarti siap! ✅
⚠️ Kalau Apache gagal start: biasanya karena port 80 dipakai Skype/IIS. Solusinya: klik Config di Apache → Apache (httpd.conf) → cari
Listen 80→ ganti jadiListen 8080. Nanti akses aplikasi lewathttp://localhost:8080.
🗂️ Struktur Folder Project
Project akan kita letakkan di dalam folder htdocs XAMPP:
C:\xampp\htdocs\crud-siswa\
├── config\
│ └── database.php → Koneksi ke database
├── functions.php → Semua fungsi CRUD
├── index.php → Halaman daftar siswa (Read)
├── create.php → Form tambah siswa (Create)
├── edit.php → Form edit siswa (Update)
└── delete.php → Proses hapus siswa (Delete)
🔧 Langkah 1: Buat Database di phpMyAdmin
Cara 1: Lewat Browser (Paling Mudah)
- Buka browser (Chrome/Firefox), ketik:
http://localhost/phpmyadmin - Klik tab SQL di bagian atas.
- Copy-paste semua kode SQL di bawah ini:
CREATE DATABASE IF NOT EXISTS sekolah;
USE sekolah;
CREATE TABLE kelas (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_kelas VARCHAR(50) NOT NULL
);
CREATE TABLE siswa (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
nis CHAR(10) UNIQUE,
tanggal_lahir DATE,
kelas_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kelas_id) REFERENCES kelas(id)
);
INSERT INTO kelas (nama_kelas) VALUES
('X RPL 1'),
('X RPL 2'),
('XI RPL 1'),
('XII RPL 1');
- Klik tombol Go / Kirim di kanan bawah.
- Selesai! Database
sekolahsudah dibuat. ✅
Penjelasan singkat:
CREATE DATABASE→ bikin database bernamasekolah.AUTO_INCREMENT→ id bertambah otomatis (1, 2, 3, …).UNIQUE→ NIS tidak boleh sama antar siswa.FOREIGN KEY→kelas_iddi tabel siswa terhubung keiddi tabel kelas.
Cara 2: Cek Hasil
Di phpMyAdmin sebelah kiri, kamu akan lihat:
- Database
sekolah→ di dalamnya ada 2 tabel:kelasdansiswa.
📁 Langkah 2: Buat Folder Project
- Buka File Explorer Windows.
- Masuk ke folder
C:\xampp\htdocs\. - Klik kanan di area kosong → New → Folder.
- Beri nama:
crud-siswa. - Masuk ke folder tersebut, buat lagi folder baru bernama
config.
Sekarang strukturnya:
C:\xampp\htdocs\
└── crud-siswa\
└── config\
🗄️ Langkah 3: Buat File Koneksi Database
Buka Notepad++ atau VS Code (recommended). Buat file baru, isi dengan kode di bawah, lalu simpan sebagai:
C:\xampp\htdocs\crud-siswa\config\database.php
<?php
// config/database.php
// Tampilkan error saat development (matikan saat production!)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Konfigurasi database
$host = "localhost";
$dbname = "sekolah";
$username = "root"; // default XAMPP
$password = ""; // default XAMPP: kosong
try {
// Buat koneksi PDO
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
// Set mode error: tampilkan sebagai Exception
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Hasil query otomatis jadi array asosiatif
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
Penjelasan:
$username = "root"→ default user MySQL di XAMPP.$password = ""→ default password di XAMPP memang kosong.new PDO(...)→ membuat koneksi ke database.ATTR_ERRMODE→ kalau ada error, langsung tampil pesannya.
💡 Tips VS Code: Kalau pakai VS Code, install extension PHP Intelephense biar ada auto-complete dan deteksi error.
🧩 Langkah 4: Buat File Fungsi CRUD
Buat file baru, simpan sebagai:
C:\xampp\htdocs\crud-siswa\functions.php
<?php
// functions.php
require_once __DIR__ . '/config/database.php';
/**
* Ambil semua siswa + nama kelas (JOIN)
*/
function getAllSiswa($pdo) {
$sql = "SELECT siswa.*, kelas.nama_kelas
FROM siswa
LEFT JOIN kelas ON siswa.kelas_id = kelas.id
ORDER BY siswa.id DESC";
return $pdo->query($sql)->fetchAll();
}
/**
* Ambil satu siswa berdasarkan ID
*/
function getSiswaById($pdo, $id) {
$stmt = $pdo->prepare("SELECT * FROM siswa WHERE id = :id");
$stmt->execute([':id' => $id]);
return $stmt->fetch();
}
/**
* Ambil semua kelas untuk dropdown
*/
function getAllKelas($pdo) {
return $pdo->query("SELECT * FROM kelas ORDER BY nama_kelas")->fetchAll();
}
/**
* Tambah siswa baru (menerima array)
*/
function tambahSiswa($pdo, array $data) {
$sql = "INSERT INTO siswa (nama, nis, tanggal_lahir, kelas_id)
VALUES (:nama, :nis, :tanggal_lahir, :kelas_id)";
$stmt = $pdo->prepare($sql);
return $stmt->execute([
':nama' => $data['nama'],
':nis' => $data['nis'],
':tanggal_lahir' => $data['tanggal_lahir'],
':kelas_id' => $data['kelas_id'],
]);
}
/**
* Update data siswa
*/
function updateSiswa($pdo, $id, array $data) {
$sql = "UPDATE siswa
SET nama = :nama, nis = :nis,
tanggal_lahir = :tanggal_lahir, kelas_id = :kelas_id
WHERE id = :id";
$stmt = $pdo->prepare($sql);
return $stmt->execute([
':nama' => $data['nama'],
':nis' => $data['nis'],
':tanggal_lahir' => $data['tanggal_lahir'],
':kelas_id' => $data['kelas_id'],
':id' => $id,
]);
}
/**
* Hapus siswa
*/
function hapusSiswa($pdo, $id) {
$stmt = $pdo->prepare("DELETE FROM siswa WHERE id = :id");
return $stmt->execute([':id' => $id]);
}
Poin penting:
- Kita pakai prepared statement (
prepare+execute) untuk mencegah SQL Injection. - Data dikirim sebagai array supaya mudah divalidasi.
LEFT JOIN→ ambil data siswa + nama kelasnya sekaligus.
📄 Langkah 5: Buat Halaman Daftar Siswa (Read)
Buat file baru, simpan sebagai:
C:\xampp\htdocs\crud-siswa\index.php
<?php
require_once __DIR__ . '/functions.php';
$semuaSiswa = getAllSiswa($pdo);
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Data Siswa</title>
<style>
body { font-family: Arial, sans-serif; margin: 30px; background: #f9f9f9; }
h2 { color: #333; }
table { border-collapse: collapse; width: 100%; margin-top: 15px; background: #fff; }
th, td { border: 1px solid #ddd; padding: 10px 12px; text-align: left; }
th { background: #007bff; color: #fff; }
tr:nth-child(even) { background: #f4f4f4; }
.btn { padding: 6px 12px; text-decoration: none; border-radius: 4px; color: #fff; display: inline-block; }
.btn-add { background: #28a745; margin-bottom: 10px; }
.btn-edit { background: #007bff; }
.btn-del { background: #dc3545; }
.msg { padding: 10px; background: #d4edda; color: #155724; margin-bottom: 15px; border-radius: 4px; }
</style>
</head>
<body>
<h2>📋 Daftar Siswa</h2>
<?php if (isset($_GET['msg'])): ?>
<div class="msg"><?= htmlspecialchars($_GET['msg']) ?></div>
<?php endif; ?>
<a href="create.php" class="btn btn-add">+ Tambah Siswa</a>
<table>
<tr>
<th>No</th><th>Nama</th><th>NIS</th>
<th>Tanggal Lahir</th><th>Kelas</th><th>Aksi</th>
</tr>
<?php if (empty($semuaSiswa)): ?>
<tr><td colspan="6" style="text-align:center;">Belum ada data</td></tr>
<?php else: ?>
<?php foreach ($semuaSiswa as $i => $siswa): ?>
<tr>
<td><?= $i + 1 ?></td>
<td><?= htmlspecialchars($siswa['nama']) ?></td>
<td><?= htmlspecialchars($siswa['nis']) ?></td>
<td><?= htmlspecialchars($siswa['tanggal_lahir']) ?></td>
<td><?= htmlspecialchars($siswa['nama_kelas'] ?? '-') ?></td>
<td>
<a href="edit.php?id=<?= $siswa['id'] ?>" class="btn btn-edit">Edit</a>
<a href="delete.php?id=<?= $siswa['id'] ?>"
class="btn btn-del"
onclick="return confirm('Yakin hapus data ini?')">Hapus</a>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</table>
</body>
</html>
Penjelasan:
getAllSiswa($pdo)→ ambil semua data siswa (array of array).foreach→ looping untuk menampilkan tiap baris.htmlspecialchars()→ mencegah XSS (karakter aneh di HTML).
➕ Langkah 6: Buat Halaman Tambah Siswa (Create)
Buat file baru, simpan sebagai:
C:\xampp\htdocs\crud-siswa\create.php
<?php
require_once __DIR__ . '/functions.php';
$daftarKelas = getAllKelas($pdo);
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Tampung input ke array
$data = [
'nama' => trim($_POST['nama'] ?? ''),
'nis' => trim($_POST['nis'] ?? ''),
'tanggal_lahir' => $_POST['tanggal_lahir'] ?? '',
'kelas_id' => $_POST['kelas_id'] ?? null,
];
// Validasi
if ($data['nama'] === '') $errors[] = "Nama wajib diisi.";
if ($data['nis'] === '') $errors[] = "NIS wajib diisi.";
if ($data['tanggal_lahir'] === '') $errors[] = "Tanggal lahir wajib diisi.";
if (empty($data['kelas_id'])) $errors[] = "Kelas wajib dipilih.";
if (empty($errors)) {
try {
tambahSiswa($pdo, $data);
header("Location: index.php?msg=Data berhasil ditambahkan");
exit;
} catch (PDOException $e) {
$errors[] = "Gagal menyimpan: " . $e->getMessage();
}
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Tambah Siswa</title>
<style>
body { font-family: Arial; margin: 30px; background: #f9f9f9; }
label { display:block; margin-top: 10px; font-weight: bold; }
input, select { padding: 8px; width: 300px; border: 1px solid #ccc; border-radius: 4px; }
.error { background: #f8d7da; color: #721c24; padding: 10px; border-radius: 4px; }
button { margin-top: 15px; padding: 8px 16px; background: #28a745; color: #fff; border: none; border-radius: 4px; cursor: pointer; }
button:hover { background: #218838; }
a { margin-left: 10px; }
</style>
</head>
<body>
<h2>➕ Tambah Siswa</h2>
<?php if ($errors): ?>
<div class="error">
<?php foreach ($errors as $e): ?>
<div>• <?= htmlspecialchars($e) ?></div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<form method="post">
<label>Nama</label>
<input type="text" name="nama" value="<?= htmlspecialchars($_POST['nama'] ?? '') ?>" required>
<label>NIS</label>
<input type="text" name="nis" maxlength="10" value="<?= htmlspecialchars($_POST['nis'] ?? '') ?>" required>
<label>Tanggal Lahir</label>
<input type="date" name="tanggal_lahir" value="<?= htmlspecialchars($_POST['tanggal_lahir'] ?? '') ?>" required>
<label>Kelas</label>
<select name="kelas_id" required>
<option value="">-- Pilih Kelas --</option>
<?php foreach ($daftarKelas as $kelas): ?>
<option value="<?= $kelas['id'] ?>"
<?= (($_POST['kelas_id'] ?? '') == $kelas['id']) ? 'selected' : '' ?>>
<?= htmlspecialchars($kelas['nama_kelas']) ?>
</option>
<?php endforeach; ?>
</select>
<br>
<button type="submit">Simpan</button>
<a href="index.php">Batal</a>
</form>
</body>
</html>
Alur kerja:
- User isi form → data masuk ke array
$data. - Validasi → kalau lolos, panggil
tambahSiswa($pdo, $data). - Redirect ke
index.phpdengan pesan sukses.
✏️ Langkah 7: Buat Halaman Edit Siswa (Update)
Buat file baru, simpan sebagai:
C:\xampp\htdocs\crud-siswa\edit.php
<?php
require_once __DIR__ . '/functions.php';
// Ambil ID dari URL
$id = $_GET['id'] ?? null;
if (!$id) { header("Location: index.php"); exit; }
// Ambil data siswa
$siswa = getSiswaById($pdo, $id);
if (!$siswa) { header("Location: index.php?msg=Data tidak ditemukan"); exit; }
$daftarKelas = getAllKelas($pdo);
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$data = [
'nama' => trim($_POST['nama'] ?? ''),
'nis' => trim($_POST['nis'] ?? ''),
'tanggal_lahir' => $_POST['tanggal_lahir'] ?? '',
'kelas_id' => $_POST['kelas_id'] ?? null,
];
if ($data['nama'] === '') $errors[] = "Nama wajib diisi.";
if ($data['nis'] === '') $errors[] = "NIS wajib diisi.";
if ($data['tanggal_lahir'] === '') $errors[] = "Tanggal lahir wajib diisi.";
if (empty($data['kelas_id'])) $errors[] = "Kelas wajib dipilih.";
if (empty($errors)) {
try {
updateSiswa($pdo, $id, $data);
header("Location: index.php?msg=Data berhasil diperbarui");
exit;
} catch (PDOException $e) {
$errors[] = "Gagal update: " . $e->getMessage();
}
}
$siswa = array_merge($siswa, $data);
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Edit Siswa</title>
<style>
body { font-family: Arial; margin: 30px; background: #f9f9f9; }
label { display:block; margin-top: 10px; font-weight: bold; }
input, select { padding: 8px; width: 300px; border: 1px solid #ccc; border-radius: 4px; }
.error { background: #f8d7da; color: #721c24; padding: 10px; border-radius: 4px; }
button { margin-top: 15px; padding: 8px 16px; background: #007bff; color: #fff; border: none; border-radius: 4px; cursor: pointer; }
button:hover { background: #0056b3; }
a { margin-left: 10px; }
</style>
</head>
<body>
<h2>✏️ Edit Siswa</h2>
<?php if ($errors): ?>
<div class="error">
<?php foreach ($errors as $e): ?>
<div>• <?= htmlspecialchars($e) ?></div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<form method="post">
<label>Nama</label>
<input type="text" name="nama" value="<?= htmlspecialchars($siswa['nama']) ?>" required>
<label>NIS</label>
<input type="text" name="nis" maxlength="10" value="<?= htmlspecialchars($siswa['nis']) ?>" required>
<label>Tanggal Lahir</label>
<input type="date" name="tanggal_lahir" value="<?= htmlspecialchars($siswa['tanggal_lahir']) ?>" required>
<label>Kelas</label>
<select name="kelas_id" required>
<option value="">-- Pilih Kelas --</option>
<?php foreach ($daftarKelas as $kelas): ?>
<option value="<?= $kelas['id'] ?>"
<?= ($siswa['kelas_id'] == $kelas['id']) ? 'selected' : '' ?>>
<?= htmlspecialchars($kelas['nama_kelas']) ?>
</option>
<?php endforeach; ?>
</select>
<br>
<button type="submit">Update</button>
<a href="index.php">Batal</a>
</form>
</body>
</html>
🗑️ Langkah 8: Buat Proses Hapus Siswa (Delete)
Buat file baru, simpan sebagai:
C:\xampp\htdocs\crud-siswa\delete.php
<?php
require_once __DIR__ . '/functions.php';
$id = $_GET['id'] ?? null;
if ($id) {
try {
hapusSiswa($pdo, $id);
header("Location: index.php?msg=Data berhasil dihapus");
} catch (PDOException $e) {
header("Location: index.php?msg=Gagal menghapus: " . urlencode($e->getMessage()));
}
} else {
header("Location: index.php");
}
exit;
Kenapa tidak pakai form? Karena konfirmasi hapus sudah ditangani JavaScript di index.php (onclick="return confirm(...)").
💡 Tips keamanan: Untuk aplikasi production, sebaiknya hapus pakai method POST, bukan GET.
🧪 Langkah 9: Uji Coba Aplikasi di Browser
- Buka browser (Chrome/Edge/Firefox).
- Ketik di address bar:
http://localhost/crud-siswa/ - Kamu akan lihat halaman Daftar Siswa dengan tombol + Tambah Siswa.
Uji semua fitur CRUD:
- Create → Klik + Tambah Siswa → isi form → Simpan
- Read → Data baru muncul di tabel
- Update → Klik Edit → ubah data → Update
- Delete → Klik Hapus → konfirmasi → data hilang
Kalau semua berjalan lancar, selamat! CRUD-mu sudah jadi! 🎉
🚨 Troubleshooting: Kalau Ada Error
1. Halaman Putih / Blank
Penyebab: Ada error PHP tapi disembunyikan.
Solusi: Buka C:\xampp\php\php.ini, cari baris:
display_errors = Off
Ganti jadi:
display_errors = On
Simpan, lalu restart Apache dari XAMPP Control Panel.
2. Access denied for user 'root'@'localhost'
Penyebab: Password MySQL di XAMPP diubah (tidak kosong lagi).
Solusi: Sesuaikan $password di config/database.php. Atau reset password root MySQL lewat phpMyAdmin.
3. Unknown database 'sekolah'
Penyebab: Database belum dibuat.
Solusi: Jalankan SQL di Langkah 1.
4. Duplicate entry 'xxxx' for key 'nis'
Penyebab: NIS sudah dipakai siswa lain (karena UNIQUE).
Solusi: Ganti NIS di form.
5. Call to undefined function getAllSiswa()
Penyebab: File functions.php tidak ter-include dengan benar.
Solusi: Pastikan di index.php ada require_once __DIR__ . '/functions.php';.
6. Apache Gagal Start (Port 80 Dipakai)
Penyebab: Skype, IIS, atau VMware pakai port 80.
Solusi: Ganti port Apache di httpd.conf:
Listen 8080
ServerName localhost:8080
Akses aplikasi lewat http://localhost:8080/crud-siswa/.
7. MySQL Gagal Start (Port 3306 Dipakai)
Penyebab: MySQL lain (dari instalasi terpisah) sudah jalan.
Solusi: Matikan MySQL lain lewat Services Windows (Win + R → services.msc).
📚 Ringkasan Alur Data
┌─────────────┐
│ Form HTML │ ← User isi data
└──────┬──────┘
│ POST
▼
┌─────────────┐
│ $_POST │ ← Data masuk ke PHP
└──────┬──────┘
│
▼
┌─────────────┐
│ $data │ ← Ditampung di array
│ (array) │
└──────┬──────┘
│
▼
┌─────────────────┐
│ fungsi CRUD │ ← tambahSiswa/updateSiswa/hapusSiswa
│ (functions.php)│
└──────┬──────────┘
│ prepare + execute
▼
┌─────────────┐
│ Database │ ← Data tersimpan di MySQL
│ MySQL │
└─────────────┘
💡 Tips Belajar Lebih Lanjut
Setelah CRUD dasar ini berhasil, coba kembangkan:
- 🔐 Login admin sebelum masuk CRUD
- 🔍 Pencarian siswa berdasarkan nama / kelas
- 📄 Pagination kalau data banyak
- 📸 Upload foto siswa
- 💬 Flash message pakai session (biar tidak muncul di URL)
- 🎨 Bootstrap / Tailwind biar tampilan lebih menarik
- 🌐 Deploy ke hosting biar bisa diakses online
🎓 Kesimpulan
Selamat! Kamu sudah berhasil membuat aplikasi CRUD Data Siswa lengkap dengan:
- ✅ XAMPP sebagai environment lokal di Windows
- ✅ PHP PDO untuk koneksi database yang aman
- ✅ MySQL dengan relasi tabel (foreign key)
- ✅ Array untuk mengirim data ke fungsi
- ✅ Validasi input dan prepared statement
Dengan menguasai CRUD ini, kamu sudah punya fondasi kuat untuk membangun aplikasi web yang lebih kompleks, seperti sistem absensi, sistem nilai, atau manajemen inventaris.
Selamat ngoding, dan terus belajar! 🚀
📖 Referensi
Kata kunci: crud php pdo mysql, tutorial crud siswa, belajar php pdo xampp, crud xampp windows, aplikasi data siswa php, tutorial php mysql pemula, cara membuat crud php, pdo prepared statement, belajar web programming windows, crud sekolah xampp.