Cara Membuat CRUD dengan PHP & MySQL: Panduan Lengkap untuk Pemula

Apa Itu CRUD dan Mengapa Penting untuk Dipelajari?
Cara membuat CRUD dengan PHP adalah salah satu keterampilan fundamental yang harus dikuasai oleh setiap developer web. CRUD adalah akronim dari empat operasi dasar dalam pengelolaan data:
- Create - Menambahkan data baru ke database
- Read - Membaca atau menampilkan data dari database
- Update - Mengubah atau memperbarui data yang sudah ada
- Delete - Menghapus data dari database
Hampir setiap aplikasi web membutuhkan operasi CRUD. Sistem manajemen produk toko online, pengelolaan artikel blog, data pengguna, sistem inventaris - semuanya menggunakan prinsip CRUD yang sama. Dengan memahami CRUD PHP MySQL, Anda telah memiliki fondasi untuk membangun hampir jenis aplikasi web apapun.
Pada tutorial ini, kita akan membuat aplikasi manajemen data mahasiswa sederhana menggunakan PHP murni (native PHP) dan MySQL, tanpa framework - sehingga Anda benar-benar memahami cara kerja dasarnya.
Persiapan: Tools yang Diperlukan
Sebelum memulai tutorial CRUD PHP MySQL ini, siapkan:

- XAMPP atau Laragon - Paket all-in-one yang menyertakan PHP, MySQL (MariaDB), dan Apache. Unduh dari apachefriends.org (XAMPP) atau laragon.org (Laragon, lebih ringan dan cepat).
- VS Code - Text editor dengan ekstensi PHP IntelliSense untuk autocomplete dan syntax highlighting.
- Browser Modern - Chrome atau Firefox untuk testing dan debugging.
- phpMyAdmin - Sudah termasuk di XAMPP/Laragon, digunakan untuk mengelola database MySQL secara visual.
Setelah XAMPP/Laragon terinstall, simpan semua file proyek di dalam folder htdocs (XAMPP)
atau www (Laragon) agar bisa diakses via browser.
Langkah 1: Membuat Database dan Tabel MySQL
Buka phpMyAdmin di http://localhost/phpmyadmin, lalu buat database baru bernama
db_mahasiswa. Klik tab "SQL" dan jalankan query berikut untuk membuat tabel:
CREATE DATABASE db_mahasiswa;
USE db_mahasiswa;
CREATE TABLE mahasiswa (
id INT AUTO_INCREMENT PRIMARY KEY,
nim VARCHAR(20) NOT NULL UNIQUE,
nama VARCHAR(100) NOT NULL,
jurusan VARCHAR(100) NOT NULL,
angkatan YEAR NOT NULL,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Tambahkan beberapa data contoh:
INSERT INTO mahasiswa (nim, nama, jurusan, angkatan, email) VALUES
('2021001', 'Budi Santoso', 'Teknik Informatika', 2021, 'budi@email.com'),
('2021002', 'Sari Dewi', 'Sistem Informasi', 2021, 'sari@email.com'),
('2022001', 'Andi Pratama', 'Teknik Komputer', 2022, 'andi@email.com');
Langkah 2: Membuat Koneksi Database (config.php)
Buat folder proyek baru di htdocs/crud-php/. Di dalam folder tersebut, buat file
config.php yang berisi konfigurasi koneksi database:
<?php
// Konfigurasi database
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', ''); // Password MySQL Anda (kosong untuk XAMPP default)
define('DB_NAME', 'db_mahasiswa');
// Membuat koneksi menggunakan MySQLi
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// Cek apakah koneksi berhasil
if (!$conn) {
die('Koneksi database gagal: ' . mysqli_connect_error());
}
// Set charset ke UTF-8 agar karakter Indonesia tampil benar
mysqli_set_charset($conn, 'utf8mb4');
?>
File config.php ini akan di-include di setiap file PHP lain yang membutuhkan koneksi database.
Dengan menggunakan define() dan satu file konfigurasi, Anda hanya perlu mengubah satu tempat
jika konfigurasi database berubah.
Langkah 3: READ - Menampilkan Daftar Data (index.php)
Operasi READ adalah yang paling sering digunakan. Buat file index.php untuk menampilkan
semua data mahasiswa dari database:
<?php
require_once 'config.php';
// Query untuk mengambil semua data mahasiswa
$query = "SELECT * FROM mahasiswa ORDER BY created_at DESC";
$result = mysqli_query($conn, $query);
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data Mahasiswa - CRUD PHP MySQL</title>
<style>
body { font-family: Arial, sans-serif; max-width: 1100px; margin: 30px auto; padding: 0 20px; }
h1 { color: #333; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 10px 14px; text-align: left; }
th { background-color: #4f46e5; color: white; }
tr:nth-child(even) { background-color: #f9f9f9; }
tr:hover { background-color: #f0f0ff; }
.btn { padding: 6px 12px; text-decoration: none; border-radius: 4px; font-size: 13px; }
.btn-tambah { background: #22c55e; color: white; display: inline-block; margin-bottom: 15px; }
.btn-edit { background: #3b82f6; color: white; }
.btn-hapus { background: #ef4444; color: white; }
.alert-success { background: #dcfce7; border: 1px solid #22c55e; padding: 10px; margin-bottom: 15px; border-radius: 4px; }
</style>
</head>
<body>
<h1>Data Mahasiswa</h1>
<?php if (isset($_GET['pesan'])): ?>
<div class="alert-success"><?= htmlspecialchars($_GET['pesan']) ?></div>
<?php endif ?>
<a href="tambah.php" class="btn btn-tambah">+ Tambah Mahasiswa</a>
<table>
<thead>
<tr>
<th>No</th>
<th>NIM</th>
<th>Nama</th>
<th>Jurusan</th>
<th>Angkatan</th>
<th>Email</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
<?php
$no = 1;
while ($row = mysqli_fetch_assoc($result)):
?>
<tr>
<td><?= $no++ ?></td>
<td><?= htmlspecialchars($row['nim']) ?></td>
<td><?= htmlspecialchars($row['nama']) ?></td>
<td><?= htmlspecialchars($row['jurusan']) ?></td>
<td><?= htmlspecialchars($row['angkatan']) ?></td>
<td><?= htmlspecialchars($row['email']) ?></td>
<td>
<a href="edit.php?id=<?= $row['id'] ?>" class="btn btn-edit">Edit</a>
<a href="hapus.php?id=<?= $row['id'] ?>" class="btn btn-hapus"
onclick="return confirm('Yakin hapus data ini?')">Hapus</a>
</td>
</tr>
<?php endwhile ?>
</tbody>
</table>
</body>
</html>
<?php mysqli_close($conn); ?>
Langkah 4: CREATE - Tambah Data Baru (tambah.php)
Buat file tambah.php untuk form penambahan data mahasiswa baru.
File ini menangani dua kondisi: menampilkan form kosong (GET) dan memproses data yang dikirim (POST).
<?php
require_once 'config.php';
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Ambil dan bersihkan input dari form
$nim = trim(mysqli_real_escape_string($conn, $_POST['nim']));
$nama = trim(mysqli_real_escape_string($conn, $_POST['nama']));
$jurusan = trim(mysqli_real_escape_string($conn, $_POST['jurusan']));
$angkatan = (int) $_POST['angkatan'];
$email = trim(mysqli_real_escape_string($conn, $_POST['email']));
// Validasi sederhana
if (empty($nim) || empty($nama) || empty($jurusan) || empty($angkatan)) {
$error = 'NIM, nama, jurusan, dan angkatan wajib diisi!';
} else {
// Insert ke database menggunakan Prepared Statement
$stmt = mysqli_prepare($conn,
"INSERT INTO mahasiswa (nim, nama, jurusan, angkatan, email) VALUES (?, ?, ?, ?, ?)"
);
mysqli_stmt_bind_param($stmt, 'sssss', $nim, $nama, $jurusan, $angkatan, $email);
if (mysqli_stmt_execute($stmt)) {
mysqli_stmt_close($stmt);
header('Location: index.php?pesan=Data mahasiswa berhasil ditambahkan!');
exit;
} else {
$error = 'Gagal menyimpan data. NIM mungkin sudah terdaftar.';
}
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Tambah Mahasiswa</title>
<style>
body { font-family: Arial, sans-serif; max-width: 550px; margin: 30px auto; padding: 20px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input, select { width: 100%; padding: 8px; margin-bottom: 15px; border: 1px solid #ccc; box-sizing: border-box; }
button { background: #22c55e; color: white; padding: 10px 20px; border: none; cursor: pointer; font-size: 15px; }
.error { color: red; background: #fee2e2; padding: 10px; margin-bottom: 15px; border-radius: 4px; }
a { color: #4f46e5; }
</style>
</head>
<body>
<h1>Tambah Mahasiswa Baru</h1>
<a href="index.php">← Kembali ke Daftar</a>
<?php if ($error): ?>
<p class="error"><?= htmlspecialchars($error) ?></p>
<?php endif ?>
<form method="POST" action="tambah.php">
<label>NIM *</label>
<input type="text" name="nim" required maxlength="20" placeholder="Contoh: 2024001">
<label>Nama Lengkap *</label>
<input type="text" name="nama" required maxlength="100" placeholder="Nama mahasiswa">
<label>Jurusan *</label>
<input type="text" name="jurusan" required maxlength="100" placeholder="Contoh: Teknik Informatika">
<label>Angkatan *</label>
<input type="number" name="angkatan" required min="2000" max="2099" placeholder="Contoh: 2024">
<label>Email</label>
<input type="email" name="email" maxlength="100" placeholder="email@contoh.com">
<button type="submit">Simpan Data</button>
</form>
</body>
</html>

Langkah 5: UPDATE - Edit Data (edit.php)
Buat file edit.php yang menampilkan form berisi data yang sudah ada untuk diedit:
<?php
require_once 'config.php';
$id = (int) ($_GET['id'] ?? 0);
$error = '';
// Ambil data mahasiswa berdasarkan ID
$stmt = mysqli_prepare($conn, "SELECT * FROM mahasiswa WHERE id = ?");
mysqli_stmt_bind_param($stmt, 'i', $id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$mahasiswa = mysqli_fetch_assoc($result);
if (!$mahasiswa) {
header('Location: index.php?pesan=Data tidak ditemukan.');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nim = trim(mysqli_real_escape_string($conn, $_POST['nim']));
$nama = trim(mysqli_real_escape_string($conn, $_POST['nama']));
$jurusan = trim(mysqli_real_escape_string($conn, $_POST['jurusan']));
$angkatan = (int) $_POST['angkatan'];
$email = trim(mysqli_real_escape_string($conn, $_POST['email']));
if (empty($nim) || empty($nama) || empty($jurusan) || empty($angkatan)) {
$error = 'NIM, nama, jurusan, dan angkatan wajib diisi!';
} else {
$stmt = mysqli_prepare($conn,
"UPDATE mahasiswa SET nim=?, nama=?, jurusan=?, angkatan=?, email=? WHERE id=?"
);
mysqli_stmt_bind_param($stmt, 'sssssi', $nim, $nama, $jurusan, $angkatan, $email, $id);
if (mysqli_stmt_execute($stmt)) {
header('Location: index.php?pesan=Data mahasiswa berhasil diperbarui!');
exit;
} else {
$error = 'Gagal memperbarui data.';
}
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Edit Mahasiswa</title>
<style>
body { font-family: Arial, sans-serif; max-width: 550px; margin: 30px auto; padding: 20px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input { width: 100%; padding: 8px; margin-bottom: 15px; border: 1px solid #ccc; box-sizing: border-box; }
button { background: #3b82f6; color: white; padding: 10px 20px; border: none; cursor: pointer; font-size: 15px; }
.error { color: red; background: #fee2e2; padding: 10px; margin-bottom: 15px; }
a { color: #4f46e5; }
</style>
</head>
<body>
<h1>Edit Data Mahasiswa</h1>
<a href="index.php">← Kembali ke Daftar</a>
<?php if ($error): ?>
<p class="error"><?= htmlspecialchars($error) ?></p>
<?php endif ?>
<form method="POST">
<label>NIM *</label>
<input type="text" name="nim" required value="<?= htmlspecialchars($mahasiswa['nim']) ?>">
<label>Nama Lengkap *</label>
<input type="text" name="nama" required value="<?= htmlspecialchars($mahasiswa['nama']) ?>">
<label>Jurusan *</label>
<input type="text" name="jurusan" required value="<?= htmlspecialchars($mahasiswa['jurusan']) ?>">
<label>Angkatan *</label>
<input type="number" name="angkatan" required value="<?= htmlspecialchars($mahasiswa['angkatan']) ?>">
<label>Email</label>
<input type="email" name="email" value="<?= htmlspecialchars($mahasiswa['email']) ?>">
<button type="submit">Perbarui Data</button>
</form>
</body>
</html>
Langkah 6: DELETE - Hapus Data (hapus.php)
Buat file hapus.php untuk menghapus data berdasarkan ID. File ini tidak menampilkan form,
langsung memproses penghapusan dan redirect ke halaman daftar:
<?php
require_once 'config.php';
$id = (int) ($_GET['id'] ?? 0);
if ($id > 0) {
// Gunakan Prepared Statement untuk keamanan
$stmt = mysqli_prepare($conn, "DELETE FROM mahasiswa WHERE id = ?");
mysqli_stmt_bind_param($stmt, 'i', $id);
if (mysqli_stmt_execute($stmt)) {
$pesan = 'Data mahasiswa berhasil dihapus.';
} else {
$pesan = 'Gagal menghapus data.';
}
mysqli_stmt_close($stmt);
} else {
$pesan = 'ID tidak valid.';
}
mysqli_close($conn);
header('Location: index.php?pesan=' . urlencode($pesan));
exit;
Langkah 7: Struktur File Akhir dan Pengujian
Pastikan folder proyek Anda memiliki struktur seperti ini:
crud-php/
├── config.php ← Konfigurasi koneksi database
├── index.php ← Halaman daftar mahasiswa (READ)
├── tambah.php ← Form tambah mahasiswa (CREATE)
├── edit.php ← Form edit mahasiswa (UPDATE)
└── hapus.php ← Proses hapus mahasiswa (DELETE)
Buka browser dan akses http://localhost/crud-php/ untuk melihat hasilnya.
Uji semua operasi CRUD: tambah mahasiswa baru, lihat daftar, edit data, dan hapus data.
Keamanan: Hal Penting yang Harus Diperhatikan
Tutorial di atas menggunakan beberapa praktik keamanan yang perlu Anda pahami:
-
Prepared Statements - Semua operasi INSERT, UPDATE, DELETE menggunakan
mysqli_prepare()danmysqli_stmt_bind_param()untuk mencegah SQL Injection. Ini adalah teknik keamanan terpenting dalam PHP. - htmlspecialchars() - Semua output ke HTML dibungkus dengan fungsi ini untuk mencegah serangan XSS (Cross-Site Scripting).
-
Type casting integer - ID dari URL dikonversi ke integer dengan
(int)untuk memastikan nilainya selalu angka. - Validasi sisi server - Selalu validasi input di sisi server (PHP), bukan hanya di sisi client (JavaScript/HTML), karena validasi client bisa diabaikan.
Untuk aplikasi production, tambahkan juga: session untuk autentikasi login, CSRF token untuk form, rate limiting, dan password hashing untuk data sensitif.
Meningkatkan CRUD: Menggunakan PDO sebagai Alternatif MySQLi
Selain MySQLi, PHP juga menyediakan PDO (PHP Data Objects) sebagai cara lain berinteraksi dengan database. PDO lebih fleksibel karena mendukung berbagai jenis database (MySQL, PostgreSQL, SQLite) dengan sintaks yang sama.
<?php
// Koneksi menggunakan PDO
$dsn = 'mysql:host=localhost;dbname=db_mahasiswa;charset=utf8mb4';
try {
$pdo = new PDO($dsn, 'root', '', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
die('Koneksi gagal: ' . $e->getMessage());
}
// Contoh query SELECT dengan PDO
$stmt = $pdo->prepare("SELECT * FROM mahasiswa WHERE id = ?");
$stmt->execute([$id]);
$mahasiswa = $stmt->fetch();
Banyak framework PHP modern seperti Laravel menggunakan PDO secara internal. Mempelajari PDO akan memudahkan transisi Anda ke framework PHP di kemudian hari.
FAQ: Pertanyaan Umum tentang Cara Membuat CRUD PHP
- Apa perbedaan MySQLi dan PDO untuk koneksi database PHP?
- MySQLi hanya mendukung MySQL/MariaDB, sedangkan PDO mendukung 12+ jenis database. MySQLi bisa digunakan prosedural maupun OOP, PDO hanya OOP. Untuk pemula, MySQLi prosedural lebih mudah dipahami. Untuk proyek profesional, PDO lebih direkomendasikan karena lebih fleksibel.
- Apa itu SQL Injection dan bagaimana cara mencegahnya?
-
SQL Injection adalah serangan di mana penyerang menyisipkan kode SQL berbahaya melalui input form.
Pencegahannya: selalu gunakan Prepared Statements (
mysqli_prepareatauPDO::prepare). Jangan pernah langsung menggabungkan input user ke string query SQL. - Apakah saya perlu mempelajari framework PHP setelah menguasai CRUD native?
- Ya, sangat direkomendasikan. CRUD PHP native adalah fondasi penting, tetapi untuk proyek nyata, framework seperti CodeIgniter 4 atau Laravel jauh lebih efisien. Framework menyediakan ORM, routing, validasi, dan keamanan built-in yang menghemat waktu pengembangan secara signifikan.
- Mengapa menggunakan htmlspecialchars() di setiap output PHP?
-
htmlspecialchars()mengkonversi karakter khusus HTML menjadi entities yang aman, mencegah serangan XSS (Cross-Site Scripting). Selalu gunakan fungsi ini untuk setiap data yang berasal dari database atau input user sebelum ditampilkan ke browser. - Bagaimana cara menambahkan fitur pencarian ke aplikasi CRUD PHP?
-
Tambahkan form search, tangkap keyword dengan
$_GET['keyword'], lalu modifikasi query SQL menggunakanLIKEdengan Prepared Statement:SELECT * FROM mahasiswa WHERE nama LIKE ? OR nim LIKE ?, bind parameter dengan nilai%keyword%. - Bagaimana cara menambahkan pagination ke daftar data CRUD PHP?
-
Gunakan
LIMITdanOFFSETdi query SQL. Hitung total data denganCOUNT(*), tentukan jumlah data per halaman, hitung total halaman, lalu gunakan:SELECT * FROM mahasiswa LIMIT 10 OFFSET (halaman-1)*10. - Apakah CRUD PHP bisa digunakan untuk membuat REST API?
-
Ya. Ubah output dari HTML menjadi JSON menggunakan
json_encode(), set headerContent-Type: application/json, dan tangani method HTTP (GET, POST, PUT, DELETE) menggunakan$_SERVER['REQUEST_METHOD']. Untuk API yang lebih terstruktur, gunakan framework seperti CodeIgniter 4 atau Laravel.
Baca Juga:
Kesimpulan
Cara membuat CRUD dengan PHP dan MySQL adalah keterampilan fondasi yang membuka pintu ke hampir seluruh dunia web development berbasis PHP. Dengan menyelesaikan tutorial ini, Anda sudah mampu membangun aplikasi web yang dapat menyimpan, menampilkan, mengubah, dan menghapus data dari database.
Pelajari juga konsep keamanan lebih lanjut seperti autentikasi sesi, CSRF protection, dan validasi input yang lebih komprehensif sebelum men-deploy aplikasi ke internet. Setelah itu, langkah berikutnya yang sangat direkomendasikan adalah mempelajari framework PHP seperti CodeIgniter 4 atau Laravel untuk membangun aplikasi yang lebih terstruktur dan efisien.
Siap untuk mempublikasikan aplikasi PHP Anda? Pastikan Anda menggunakan hosting yang mendukung PHP 8.1+ dan MySQL agar aplikasi berjalan optimal di lingkungan production.
Artikel Terkait
Cara Membuat Website Dinamis dengan PHP: Panduan Pemula Lengkap
Panduan lengkap cara membuat website dinamis dengan PHP dari nol. Pelajari dasar-dasar PHP, koneksi database MySQL, form handling, session, hingga deploy website PHP ke hosting dengan langkah mudah.
Baca Selengkapnya →Cara Membuat Database MySQL di cPanel: Panduan Lengkap untuk Pemula
Panduan lengkap cara membuat database MySQL di cPanel dari nol. Pelajari cara membuat database, user MySQL, mengatur privileges, menggunakan phpMyAdmin, import & export database dengan mudah.
Baca Selengkapnya →Cara Membuat Website dari Nol: Panduan Lengkap 2026
Pelajari cara membuat website dari nol dengan panduan lengkap step-by-step. Pilih hosting, domain, CMS, dan desain website profesional untuk bisnis Anda.
Baca Selengkapnya →Cara Upload Website ke Hosting: 4 Metode Lengkap (FTP, cPanel, Git)
Panduan lengkap cara upload website ke hosting dengan 4 metode: cPanel File Manager, FTP FileZilla, Git deployment, dan SSH. Cocok untuk pemula hingga developer profesional. Dilengkapi troubleshooting dan tips praktis.
Baca Selengkapnya →Butuh Hosting untuk Website Anda?
Dapatkan hosting cepat, aman, dan terpercaya dengan harga terjangkau. Gratis domain, SSL, dan support 24/7.
Jangan Ketinggalan Promo!
Subscribe newsletter kami dan dapatkan diskon hingga 50% untuk pembelian pertama kamu.
Gratis, tanpa spam. Bisa unsubscribe kapan saja.