- Part 1: Setup & Menampilkan Data
- Part 2: CRUD (Tambah, Edit, Hapus) (sedang dibaca)
- Part 3: Pencarian & Pagination
- Part 4: Login & Session
Pada Part 1, kita sudah membuat fondasi aplikasi data alumni dan menampilkan datanya. Sekarang di Part 2 kita lengkapi menjadi aplikasi CRUD penuh dengan PHP native, memakai prepared statement agar aman dari SQL injection.

Empat Operasi CRUD
CRUD adalah Create (tambah), Read (tampil, sudah di Part 1), Update (edit), dan Delete (hapus). Kita akan membuat file terpisah untuk tiap operasi — pendekatan khas PHP native.
Menambahkan Tombol Aksi di Daftar
Perbarui tabel di index.php, tambahkan tombol Tambah dan kolom Aksi. Kita juga tampilkan flash message sukses:
<?php if (!empty($_SESSION['sukses'])): ?>
<div class="kotak-sukses"><?= $_SESSION['sukses']; unset($_SESSION['sukses']); ?></div>
<?php endif ?>
<h2>Daftar Alumni</h2>
<a href="tambah.php" class="tombol">+ Tambah Alumni</a>
<table border="1" cellpadding="8" cellspacing="0">
<thead>
<tr><th>NIM</th><th>Nama</th><th>Jurusan</th><th>Angkatan</th><th>Aksi</th></tr>
</thead>
<tbody>
<?php foreach ($alumni as $a): ?>
<tr>
<td><?= htmlspecialchars($a['nim']) ?></td>
<td><?= htmlspecialchars($a['nama']) ?></td>
<td><?= htmlspecialchars($a['jurusan']) ?></td>
<td><?= htmlspecialchars($a['angkatan']) ?></td>
<td>
<a href="edit.php?id=<?= $a['id'] ?>">Edit</a>
<a href="hapus.php?id=<?= $a['id'] ?>"
onclick="return confirm('Yakin hapus data ini?')">Hapus</a>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
Agar flash message berfungsi, tambahkan session_start(); di baris paling atas index.php (sebelum output apa pun).
Membuat Form Tambah Alumni
Buat file tambah.php. File ini menampilkan form sekaligus memproses penyimpanan saat dikirim:
<?php
session_start();
require 'config/koneksi.php';
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nim = trim($_POST['nim']);
$nama = trim($_POST['nama']);
$jurusan = trim($_POST['jurusan']);
$angkatan = trim($_POST['angkatan']);
$pekerjaan = trim($_POST['pekerjaan']);
if ($nim === '' || $nama === '') {
$error = 'NIM dan Nama wajib diisi.';
} else {
$sql = "INSERT INTO alumni (nim, nama, jurusan, angkatan, pekerjaan)
VALUES (?, ?, ?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nim, $nama, $jurusan, $angkatan, $pekerjaan]);
$_SESSION['sukses'] = 'Data alumni berhasil ditambahkan.';
header('Location: index.php');
exit;
}
}
require 'templates/header.php';
?>
<h2>Tambah Alumni</h2>
<?php if ($error): ?>
<div class="kotak-error"><?= $error ?></div>
<?php endif ?>
<form method="post">
<label>NIM</label>
<input type="text" name="nim" value="<?= htmlspecialchars($_POST['nim'] ?? '') ?>">
<label>Nama</label>
<input type="text" name="nama" value="<?= htmlspecialchars($_POST['nama'] ?? '') ?>">
<label>Jurusan</label>
<input type="text" name="jurusan" value="<?= htmlspecialchars($_POST['jurusan'] ?? '') ?>">
<label>Angkatan</label>
<input type="number" name="angkatan" value="<?= htmlspecialchars($_POST['angkatan'] ?? '') ?>">
<label>Pekerjaan</label>
<input type="text" name="pekerjaan" value="<?= htmlspecialchars($_POST['pekerjaan'] ?? '') ?>">
<button type="submit" class="tombol">Simpan</button>
</form>
<?php require 'templates/footer.php'; ?>
Kunci keamanan di sini adalah prepared statement: kita menulis ? sebagai placeholder, lalu mengirim nilai lewat execute([...]). PDO otomatis meng-escape nilai, sehingga input pengguna tidak bisa menyisipkan perintah SQL berbahaya.

Membuat Form Edit Alumni
Buat edit.php. Ia mengambil data lama berdasarkan ID lalu memproses perubahan:
<?php
session_start();
require 'config/koneksi.php';
$id = (int) ($_GET['id'] ?? 0);
// Ambil data lama
$stmt = $pdo->prepare("SELECT * FROM alumni WHERE id = ?");
$stmt->execute([$id]);
$alumni = $stmt->fetch();
if (!$alumni) {
die('Data tidak ditemukan.');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$sql = "UPDATE alumni
SET nim = ?, nama = ?, jurusan = ?, angkatan = ?, pekerjaan = ?
WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([
$_POST['nim'], $_POST['nama'], $_POST['jurusan'],
$_POST['angkatan'], $_POST['pekerjaan'], $id,
]);
$_SESSION['sukses'] = 'Data alumni berhasil diperbarui.';
header('Location: index.php');
exit;
}
require 'templates/header.php';
?>
<h2>Edit Alumni</h2>
<form method="post">
<label>NIM</label>
<input type="text" name="nim" value="<?= htmlspecialchars($alumni['nim']) ?>">
<label>Nama</label>
<input type="text" name="nama" value="<?= htmlspecialchars($alumni['nama']) ?>">
<label>Jurusan</label>
<input type="text" name="jurusan" value="<?= htmlspecialchars($alumni['jurusan']) ?>">
<label>Angkatan</label>
<input type="number" name="angkatan" value="<?= htmlspecialchars($alumni['angkatan']) ?>">
<label>Pekerjaan</label>
<input type="text" name="pekerjaan" value="<?= htmlspecialchars($alumni['pekerjaan']) ?>">
<button type="submit" class="tombol">Perbarui</button>
</form>
<?php require 'templates/footer.php'; ?>
Perhatikan (int) $_GET['id'] — kita paksa ID menjadi bilangan bulat sebagai lapisan pengaman tambahan.
Menghapus Data Alumni
Buat hapus.php yang ringkas:
<?php
session_start();
require 'config/koneksi.php';
$id = (int) ($_GET['id'] ?? 0);
$stmt = $pdo->prepare("DELETE FROM alumni WHERE id = ?");
$stmt->execute([$id]);
$_SESSION['sukses'] = 'Data alumni berhasil dihapus.';
header('Location: index.php');
exit;
Berkat konfirmasi JavaScript pada tombol Hapus (onclick="return confirm(...)"), pengguna tidak akan menghapus data secara tak sengaja.

Menambahkan Gaya untuk Notifikasi
.kotak-sukses {
background-color: #dcfce7;
border: 1px solid #16a34a;
color: #166534;
padding: 12px 16px;
border-radius: 6px;
margin-bottom: 16px;
}
.kotak-error {
background-color: #fee2e2;
border: 1px solid #dc2626;
color: #991b1b;
padding: 12px 16px;
border-radius: 6px;
margin-bottom: 16px;
}
Penutup
Aplikasi data alumni Anda kini bisa menambah, menampilkan, mengedit, dan menghapus data — CRUD penuh dengan PHP native yang aman berkat prepared statement. Anda memahami betul apa yang terjadi di setiap baris, tanpa “keajaiban” framework.
Ketika data alumni bertambah menjadi ratusan, kita butuh pencarian dan pagination. Keduanya kita bangun di Part 3. Sampai jumpa!
Referensi: untuk pendalaman lebih lanjut, kunjungi manual resmi PHP.

