CRUD adalah singkatan dari Create, Read, Update, Delete — empat operasi dasar pada data yang menjadi inti hampir setiap aplikasi, mulai dari data mahasiswa, produk, hingga artikel. Menguasai CRUD berarti Anda menguasai fondasi pemrograman web dinamis. Pada tutorial ini kita akan membuat CRUD PHP MySQL sederhana untuk mengelola data mahasiswa, dengan kode lengkap dan penjelasan tiap bagian.
Yang Akan Kita Buat
- index.php — menampilkan semua data (Read).
- tambah.php — form menambah data baru (Create).
- edit.php — form mengubah data (Update).
- hapus.php — menghapus data (Delete).

Langkah 1: Membuat Tabel
Di phpMyAdmin, buat database latihan (jika belum ada) lalu jalankan:
CREATE TABLE mahasiswa (
id INT AUTO_INCREMENT PRIMARY KEY,
nim VARCHAR(20) NOT NULL,
nama VARCHAR(100) NOT NULL,
jurusan VARCHAR(50) NOT NULL
);
Langkah 2: File Koneksi
Buat koneksi.php yang akan dipakai semua file:
<?php
$koneksi = new mysqli("localhost", "root", "", "latihan");
if ($koneksi->connect_error) {
die("Koneksi gagal: " . $koneksi->connect_error);
}
?>
Langkah 3: Menampilkan Data (Read)
Buat index.php. Halaman ini mengambil semua baris dari tabel lalu menampilkannya dalam tabel HTML:
<?php require "koneksi.php"; ?>
<!DOCTYPE html>
<html lang="id">
<head><meta charset="UTF-8"><title>Data Mahasiswa</title></head>
<body>
<h2>Data Mahasiswa</h2>
<a href="tambah.php">+ Tambah Data</a>
<table border="1" cellpadding="8">
<tr>
<th>No</th><th>NIM</th><th>Nama</th><th>Jurusan</th><th>Aksi</th>
</tr>
<?php
$no = 1;
$query = $koneksi->query("SELECT * FROM mahasiswa ORDER BY id DESC");
while ($row = $query->fetch_assoc()):
?>
<tr>
<td><?= $no++ ?></td>
<td><?= htmlspecialchars($row["nim"]) ?></td>
<td><?= htmlspecialchars($row["nama"]) ?></td>
<td><?= htmlspecialchars($row["jurusan"]) ?></td>
<td>
<a href="edit.php?id=<?= $row["id"] ?>">Edit</a> |
<a href="hapus.php?id=<?= $row["id"] ?>" onclick="return confirm('Yakin hapus?')">Hapus</a>
</td>
</tr>
<?php endwhile; ?>
</table>
</body>
</html>
Perhatikan htmlspecialchars() pada setiap data yang ditampilkan — ini mencegah XSS bila ada data yang mengandung tag HTML.
Langkah 4: Menambah Data (Create)
Buat tambah.php. File ini menampilkan form dan menyimpan data baru saat dikirim:
<?php
require "koneksi.php";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$nim = trim($_POST["nim"]);
$nama = trim($_POST["nama"]);
$jurusan = trim($_POST["jurusan"]);
$stmt = $koneksi->prepare("INSERT INTO mahasiswa (nim, nama, jurusan) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $nim, $nama, $jurusan);
if ($stmt->execute()) {
header("Location: index.php"); // kembali ke daftar
exit;
} else {
echo "Gagal menyimpan: " . $stmt->error;
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head><meta charset="UTF-8"><title>Tambah Data</title></head>
<body>
<h2>Tambah Mahasiswa</h2>
<form method="post">
NIM: <input type="text" name="nim" required><br><br>
Nama: <input type="text" name="nama" required><br><br>
Jurusan: <input type="text" name="jurusan" required><br><br>
<button type="submit">Simpan</button>
<a href="index.php">Batal</a>
</form>
</body>
</html>
Langkah 5: Mengubah Data (Update)
Buat edit.php. File ini mengambil data lama berdasarkan id, menampilkannya di form, lalu menyimpan perubahan:
<?php
require "koneksi.php";
$id = (int) $_GET["id"]; // paksa jadi angka demi keamanan
// Simpan perubahan saat form dikirim
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$nim = trim($_POST["nim"]);
$nama = trim($_POST["nama"]);
$jurusan = trim($_POST["jurusan"]);
$stmt = $koneksi->prepare("UPDATE mahasiswa SET nim=?, nama=?, jurusan=? WHERE id=?");
$stmt->bind_param("sssi", $nim, $nama, $jurusan, $id);
$stmt->execute();
header("Location: index.php");
exit;
}
// Ambil data lama untuk ditampilkan di form
$stmt = $koneksi->prepare("SELECT * FROM mahasiswa WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$data = $stmt->get_result()->fetch_assoc();
if (!$data) {
die("Data tidak ditemukan.");
}
?>
<!DOCTYPE html>
<html lang="id">
<head><meta charset="UTF-8"><title>Edit Data</title></head>
<body>
<h2>Edit Mahasiswa</h2>
<form method="post">
NIM: <input type="text" name="nim" value="<?= htmlspecialchars($data["nim"]) ?>" required><br><br>
Nama: <input type="text" name="nama" value="<?= htmlspecialchars($data["nama"]) ?>" required><br><br>
Jurusan: <input type="text" name="jurusan" value="<?= htmlspecialchars($data["jurusan"]) ?>" required><br><br>
<button type="submit">Perbarui</button>
<a href="index.php">Batal</a>
</form>
</body>
</html>
Trik penting: value="<?= ... ?>" pada input membuat form otomatis terisi data lama, sehingga pengguna tinggal mengubah yang perlu.
Langkah 6: Menghapus Data (Delete)
Buat hapus.php:
<?php
require "koneksi.php";
$id = (int) $_GET["id"];
$stmt = $koneksi->prepare("DELETE FROM mahasiswa WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
header("Location: index.php");
exit;
?>
Konfirmasi hapus sudah kita pasang di index.php lewat onclick="return confirm(...)" agar pengguna tidak salah klik.
Kesalahan Umum
- Tidak memaksa
idjadi integer — gunakan(int) $_GET["id"]agar aman. - Menyusun query dengan menggabung string — rentan SQL injection. Selalu prepared statement.
- Lupa
exit;setelahheader("Location")— kode di bawahnya tetap jalan. - Tidak memakai
htmlspecialchars()saat menampilkan data.
Kesimpulan
Selamat! Anda telah membuat aplikasi CRUD PHP MySQL lengkap dengan operasi Create, Read, Update, dan Delete yang aman. Pola empat file ini bisa Anda terapkan ke data apa pun — produk, artikel, transaksi. Langkah berikutnya, tambahkan validasi input lebih ketat, pagination untuk data yang banyak, dan proteksi login agar hanya admin yang bisa mengelola data.
Referensi: untuk penjelasan fungsi lebih mendalam, kunjungi dokumentasi resmi PHP (php.net).

