Operasi CRUD dengan PHP dan MySQL
CRUD (Create, Read, Update, Delete) adalah operasi dasar dalam pengelolaan data. Pelajari cara membuat aplikasi web lengkap dengan fitur tambah, lihat, edit, dan hapus data menggunakan PHP dan MySQL.
Persiapan Project CRUD
Kita akan membuat aplikasi manajemen data mahasiswa dengan fitur CRUD lengkap.
Struktur Database
-- Membuat database
CREATE DATABASE crud_app;
USE crud_app;
-- Membuat tabel mahasiswa
CREATE TABLE mahasiswa (
id INT AUTO_INCREMENT PRIMARY KEY,
nim VARCHAR(20) UNIQUE NOT NULL,
nama VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
jurusan VARCHAR(50) NOT NULL,
semester INT NOT NULL,
alamat TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Insert data contoh
INSERT INTO mahasiswa (nim, nama, email, jurusan, semester, alamat) VALUES
('2021001', 'Ahmad Wijaya', 'ahmad.wijaya@email.com', 'Teknik Informatika', 3, 'Jl. Merdeka No. 10, Jakarta'),
('2021002', 'Siti Nurhaliza', 'siti.nurhaliza@email.com', 'Sistem Informasi', 3, 'Jl. Sudirman No. 15, Bandung'),
('2021003', 'Budi Santoso', 'budi.santoso@email.com', 'Teknik Elektro', 5, 'Jl. Gatot Subroto No. 20, Surabaya');
Konfigurasi Database
<?php
// config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'crud_app');
// Fungsi koneksi database
function getConnection() {
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
$pdo = new PDO($dsn, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch(PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
}
?>
File CSS untuk Styling
/* style.css */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f4f4f4;
}
.container {
max-width: 1200px;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.header {
text-align: center;
color: #333;
margin-bottom: 30px;
}
.btn {
padding: 8px 16px;
margin: 5px;
border: none;
border-radius: 4px;
cursor: pointer;
text-decoration: none;
display: inline-block;
}
.btn-primary { background-color: #007bff; color: white; }
.btn-success { background-color: #28a745; color: white; }
.btn-warning { background-color: #ffc107; color: black; }
.btn-danger { background-color: #dc3545; color: white; }
.btn:hover {
opacity: 0.8;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #ddd;
}
th {
background-color: #f8f9fa;
font-weight: bold;
}
tr:hover {
background-color: #f5f5f5;
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input, select, textarea {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
box-sizing: border-box;
}
textarea {
height: 80px;
resize: vertical;
}
.alert {
padding: 15px;
margin-bottom: 20px;
border-radius: 4px;
}
.alert-success {
background-color: #d4edda;
border: 1px solid #c3e6cb;
color: #155724;
}
.alert-danger {
background-color: #f8d7da;
border: 1px solid #f5c6cb;
color: #721c24;
}
Struktur File Project
Struktur Folder:
crud_app/ ├── config.php ├── style.css ├── index.php (Read - List data) ├── create.php (Create - Tambah data) ├── edit.php (Update - Edit data) ├── delete.php (Delete - Hapus data) └── view.php (Read - Detail data)
CREATE - Menambah Data
Operasi CREATE digunakan untuk menambahkan data baru ke database.
<?php
require_once 'config.php';
$errors = [];
$success = false;
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Validasi input
$nim = trim($_POST['nim'] ?? '');
$nama = trim($_POST['nama'] ?? '');
$email = trim($_POST['email'] ?? '');
$jurusan = trim($_POST['jurusan'] ?? '');
$semester = $_POST['semester'] ?? '';
$alamat = trim($_POST['alamat'] ?? '');
// Validasi required fields
if (empty($nim)) $errors[] = "NIM harus diisi";
if (empty($nama)) $errors[] = "Nama harus diisi";
if (empty($email)) $errors[] = "Email harus diisi";
if (empty($jurusan)) $errors[] = "Jurusan harus diisi";
if (empty($semester)) $errors[] = "Semester harus diisi";
// Validasi format email
if (!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Format email tidak valid";
}
// Validasi semester
if (!empty($semester) && (!is_numeric($semester) || $semester < 1 || $semester > 8)) {
$errors[] = "Semester harus berupa angka 1-8";
}
// Jika tidak ada error, simpan ke database
if (empty($errors)) {
try {
$pdo = getConnection();
// Cek apakah NIM atau email sudah ada
$stmt = $pdo->prepare("SELECT COUNT(*) FROM mahasiswa WHERE nim = ? OR email = ?");
$stmt->execute([$nim, $email]);
if ($stmt->fetchColumn() > 0) {
$errors[] = "NIM atau Email sudah terdaftar";
} else {
// Insert data baru
$sql = "INSERT INTO mahasiswa (nim, nama, email, jurusan, semester, alamat) VALUES (?, ?, ?, ?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nim, $nama, $email, $jurusan, $semester, $alamat]);
$success = true;
// Reset form setelah berhasil
$nim = $nama = $email = $jurusan = $semester = $alamat = '';
}
} catch (PDOException $e) {
$errors[] = "Error database: " . $e->getMessage();
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Tambah Mahasiswa</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="header">
<h1>Tambah Data Mahasiswa</h1>
<a href="index.php" class="btn btn-primary">Kembali ke Daftar</a>
</div>
<?php if ($success): ?>
<div class="alert alert-success">
Data mahasiswa berhasil ditambahkan!
</div>
<?php endif; ?>
<?php if (!empty($errors)): ?>
<div class="alert alert-danger">
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo htmlspecialchars($error); ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<form method="POST" action="">
<div class="form-group">
<label for="nim">NIM:</label>
<input type="text" id="nim" name="nim" value="<?php echo htmlspecialchars($nim ?? ''); ?>" required>
</div>
<div class="form-group">
<label for="nama">Nama Lengkap:</label>
<input type="text" id="nama" name="nama" value="<?php echo htmlspecialchars($nama ?? ''); ?>" required>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="<?php echo htmlspecialchars($email ?? ''); ?>" required>
</div>
<div class="form-group">
<label for="jurusan">Jurusan:</label>
<select id="jurusan" name="jurusan" required>
<option value="">Pilih Jurusan</option>
<option value="Teknik Informatika" <?php echo ($jurusan ?? '') == 'Teknik Informatika' ? 'selected' : ''; ?>>Teknik Informatika</option>
<option value="Sistem Informasi" <?php echo ($jurusan ?? '') == 'Sistem Informasi' ? 'selected' : ''; ?>>Sistem Informasi</option>
<option value="Teknik Elektro" <?php echo ($jurusan ?? '') == 'Teknik Elektro' ? 'selected' : ''; ?>>Teknik Elektro</option>
<option value="Teknik Mesin" <?php echo ($jurusan ?? '') == 'Teknik Mesin' ? 'selected' : ''; ?>>Teknik Mesin</option>
<option value="Teknik Sipil" <?php echo ($jurusan ?? '') == 'Teknik Sipil' ? 'selected' : ''; ?>>Teknik Sipil</option>
</select>
</div>
<div class="form-group">
<label for="semester">Semester:</label>
<select id="semester" name="semester" required>
<option value="">Pilih Semester</option>
<?php for ($i = 1; $i <= 8; $i++): ?>
<option value="<?php echo $i; ?>" <?php echo ($semester ?? '') == $i ? 'selected' : ''; ?>>
Semester <?php echo $i; ?>
</option>
<?php endfor; ?>
</select>
</div>
<div class="form-group">
<label for="alamat">Alamat:</label>
<textarea id="alamat" name="alamat" placeholder="Masukkan alamat lengkap"><?php echo htmlspecialchars($alamat ?? ''); ?></textarea>
</div>
<div class="form-group">
<button type="submit" class="btn btn-success">Simpan Data</button>
<a href="index.php" class="btn btn-secondary">Batal</a>
</div>
</form>
</div>
</body>
</html>
READ - Menampilkan Data
Operasi READ digunakan untuk menampilkan data dari database. Kita akan membuat halaman list dan detail data.
Halaman List Data (index.php)
<?php
require_once 'config.php';
// Pagination
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = 10;
$offset = ($page - 1) * $limit;
// Search functionality
$search = $_GET['search'] ?? '';
$jurusan_filter = $_GET['jurusan'] ?? '';
try {
$pdo = getConnection();
// Build query with search and filter
$where = [];
$params = [];
if (!empty($search)) {
$where[] = "(nama LIKE ? OR nim LIKE ? OR email LIKE ?)";
$params[] = "%$search%";
$params[] = "%$search%";
$params[] = "%$search%";
}
if (!empty($jurusan_filter)) {
$where[] = "jurusan = ?";
$params[] = $jurusan_filter;
}
$whereClause = !empty($where) ? 'WHERE ' . implode(' AND ', $where) : '';
// Count total records
$countSql = "SELECT COUNT(*) FROM mahasiswa $whereClause";
$countStmt = $pdo->prepare($countSql);
$countStmt->execute($params);
$totalRecords = $countStmt->fetchColumn();
$totalPages = ceil($totalRecords / $limit);
// Get data with pagination
$sql = "SELECT * FROM mahasiswa $whereClause ORDER BY created_at DESC LIMIT $limit OFFSET $offset";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$mahasiswa = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Get unique jurusan for filter
$jurusanStmt = $pdo->query("SELECT DISTINCT jurusan FROM mahasiswa ORDER BY jurusan");
$jurusanList = $jurusanStmt->fetchAll(PDO::FETCH_COLUMN);
} catch (PDOException $e) {
die("Error: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Data Mahasiswa</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="header">
<h1>Data Mahasiswa</h1>
<a href="create.php" class="btn btn-success">Tambah Mahasiswa</a>
</div>
<!-- Search and Filter -->
<form method="GET" action="" style="margin-bottom: 20px;">
<div style="display: flex; gap: 10px; align-items: center;">
<input type="text" name="search" placeholder="Cari nama, NIM, atau email..."
value="<?php echo htmlspecialchars($search); ?>" style="flex: 1;">
<select name="jurusan">
<option value="">Semua Jurusan</option>
<?php foreach ($jurusanList as $jur): ?>
<option value="<?php echo htmlspecialchars($jur); ?>"
<?php echo $jurusan_filter == $jur ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($jur); ?>
</option>
<?php endforeach; ?>
</select>
<button type="submit" class="btn btn-primary">Cari</button>
<a href="index.php" class="btn btn-secondary">Reset</a>
</div>
</form>
<p>Total: <strong><?php echo $totalRecords; ?></strong> mahasiswa</p>
<?php if (empty($mahasiswa)): ?>
<div class="alert alert-info">
Tidak ada data mahasiswa yang ditemukan.
</div>
<?php else: ?>
<table>
<thead>
<tr>
<th>No</th>
<th>NIM</th>
<th>Nama</th>
<th>Email</th>
<th>Jurusan</th>
<th>Semester</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
<?php foreach ($mahasiswa as $index => $mhs): ?>
<tr>
<td><?php echo $offset + $index + 1; ?></td>
<td><?php echo htmlspecialchars($mhs['nim']); ?></td>
<td><?php echo htmlspecialchars($mhs['nama']); ?></td>
<td><?php echo htmlspecialchars($mhs['email']); ?></td>
<td><?php echo htmlspecialchars($mhs['jurusan']); ?></td>
<td><?php echo $mhs['semester']; ?></td>
<td>
<a href="view.php?id=<?php echo $mhs['id']; ?>" class="btn btn-primary">Detail</a>
<a href="edit.php?id=<?php echo $mhs['id']; ?>" class="btn btn-warning">Edit</a>
<a href="delete.php?id=<?php echo $mhs['id']; ?>" class="btn btn-danger"
onclick="return confirm('Yakin ingin menghapus data ini?')">Hapus</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<!-- Pagination -->
<?php if ($totalPages > 1): ?>
<div style="margin-top: 20px; text-align: center;">
<?php for ($i = 1; $i <= $totalPages; $i++): ?>
<?php
$queryParams = $_GET;
$queryParams['page'] = $i;
$queryString = http_build_query($queryParams);
?>
<a href="?<?php echo $queryString; ?>"
class="btn <?php echo $i == $page ? 'btn-primary' : 'btn-secondary'; ?>">
<?php echo $i; ?>
</a>
<?php endfor; ?>
</div>
<?php endif; ?>
<?php endif; ?>
</div>
</body>
</html>
Halaman Detail Data (view.php)
<?php
require_once 'config.php';
$id = $_GET['id'] ?? 0;
if (!$id) {
header('Location: index.php');
exit;
}
try {
$pdo = getConnection();
$stmt = $pdo->prepare("SELECT * FROM mahasiswa WHERE id = ?");
$stmt->execute([$id]);
$mahasiswa = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$mahasiswa) {
header('Location: index.php');
exit;
}
} catch (PDOException $e) {
die("Error: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Detail Mahasiswa</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="header">
<h1>Detail Mahasiswa</h1>
<a href="index.php" class="btn btn-primary">Kembali ke Daftar</a>
</div>
<table style="width: 100%; max-width: 600px;">
<tr>
<th style="width: 150px; text-align: left;">NIM</th>
<td><?php echo htmlspecialchars($mahasiswa['nim']); ?></td>
</tr>
<tr>
<th>Nama Lengkap</th>
<td><?php echo htmlspecialchars($mahasiswa['nama']); ?></td>
</tr>
<tr>
<th>Email</th>
<td><?php echo htmlspecialchars($mahasiswa['email']); ?></td>
</tr>
<tr>
<th>Jurusan</th>
<td><?php echo htmlspecialchars($mahasiswa['jurusan']); ?></td>
</tr>
<tr>
<th>Semester</th>
<td>Semester <?php echo $mahasiswa['semester']; ?></td>
</tr>
<tr>
<th>Alamat</th>
<td><?php echo $mahasiswa['alamat'] ? nl2br(htmlspecialchars($mahasiswa['alamat'])) : '-'; ?></td>
</tr>
<tr>
<th>Terdaftar</th>
<td><?php echo date('d/m/Y H:i', strtotime($mahasiswa['created_at'])); ?></td>
</tr>
<tr>
<th>Terakhir Update</th>
<td><?php echo date('d/m/Y H:i', strtotime($mahasiswa['updated_at'])); ?></td>
</tr>
</table>
<div style="margin-top: 20px;">
<a href="edit.php?id=<?php echo $mahasiswa['id']; ?>" class="btn btn-warning">Edit Data</a>
<a href="delete.php?id=<?php echo $mahasiswa['id']; ?>" class="btn btn-danger"
onclick="return confirm('Yakin ingin menghapus data ini?')">Hapus Data</a>
</div>
</div>
</body>
</html>
UPDATE - Mengubah Data
Operasi UPDATE digunakan untuk mengubah data yang sudah ada di database.
<?php
require_once 'config.php';
$id = $_GET['id'] ?? 0;
$errors = [];
$success = false;
if (!$id) {
header('Location: index.php');
exit;
}
try {
$pdo = getConnection();
// Get existing data
$stmt = $pdo->prepare("SELECT * FROM mahasiswa WHERE id = ?");
$stmt->execute([$id]);
$mahasiswa = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$mahasiswa) {
header('Location: index.php');
exit;
}
} catch (PDOException $e) {
die("Error: " . $e->getMessage());
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Get form data
$nim = trim($_POST['nim'] ?? '');
$nama = trim($_POST['nama'] ?? '');
$email = trim($_POST['email'] ?? '');
$jurusan = trim($_POST['jurusan'] ?? '');
$semester = $_POST['semester'] ?? '';
$alamat = trim($_POST['alamat'] ?? '');
// Validation
if (empty($nim)) $errors[] = "NIM harus diisi";
if (empty($nama)) $errors[] = "Nama harus diisi";
if (empty($email)) $errors[] = "Email harus diisi";
if (empty($jurusan)) $errors[] = "Jurusan harus diisi";
if (empty($semester)) $errors[] = "Semester harus diisi";
if (!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Format email tidak valid";
}
if (!empty($semester) && (!is_numeric($semester) || $semester < 1 || $semester > 8)) {
$errors[] = "Semester harus berupa angka 1-8";
}
// Check for duplicate NIM/email (excluding current record)
if (empty($errors)) {
try {
$stmt = $pdo->prepare("SELECT COUNT(*) FROM mahasiswa WHERE (nim = ? OR email = ?) AND id != ?");
$stmt->execute([$nim, $email, $id]);
if ($stmt->fetchColumn() > 0) {
$errors[] = "NIM atau Email sudah terdaftar";
} else {
// Update data
$sql = "UPDATE mahasiswa SET nim = ?, nama = ?, email = ?, jurusan = ?, semester = ?, alamat = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nim, $nama, $email, $jurusan, $semester, $alamat, $id]);
$success = true;
// Refresh data
$stmt = $pdo->prepare("SELECT * FROM mahasiswa WHERE id = ?");
$stmt->execute([$id]);
$mahasiswa = $stmt->fetch(PDO::FETCH_ASSOC);
}
} catch (PDOException $e) {
$errors[] = "Error database: " . $e->getMessage();
}
}
} else {
// Pre-fill form with existing data
$nim = $mahasiswa['nim'];
$nama = $mahasiswa['nama'];
$email = $mahasiswa['email'];
$jurusan = $mahasiswa['jurusan'];
$semester = $mahasiswa['semester'];
$alamat = $mahasiswa['alamat'];
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Edit Mahasiswa</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="header">
<h1>Edit Data Mahasiswa</h1>
<a href="index.php" class="btn btn-primary">Kembali ke Daftar</a>
</div>
<?php if ($success): ?>
<div class="alert alert-success">
Data mahasiswa berhasil diupdate!
</div>
<?php endif; ?>
<?php if (!empty($errors)): ?>
<div class="alert alert-danger">
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo htmlspecialchars($error); ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<form method="POST" action="">
<div class="form-group">
<label for="nim">NIM:</label>
<input type="text" id="nim" name="nim" value="<?php echo htmlspecialchars($nim); ?>" required>
</div>
<div class="form-group">
<label for="nama">Nama Lengkap:</label>
<input type="text" id="nama" name="nama" value="<?php echo htmlspecialchars($nama); ?>" required>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="<?php echo htmlspecialchars($email); ?>" required>
</div>
<div class="form-group">
<label for="jurusan">Jurusan:</label>
<select id="jurusan" name="jurusan" required>
<option value="">Pilih Jurusan</option>
<option value="Teknik Informatika" <?php echo $jurusan == 'Teknik Informatika' ? 'selected' : ''; ?>>Teknik Informatika</option>
<option value="Sistem Informasi" <?php echo $jurusan == 'Sistem Informasi' ? 'selected' : ''; ?>>Sistem Informasi</option>
<option value="Teknik Elektro" <?php echo $jurusan == 'Teknik Elektro' ? 'selected' : ''; ?>>Teknik Elektro</option>
<option value="Teknik Mesin" <?php echo $jurusan == 'Teknik Mesin' ? 'selected' : ''; ?>>Teknik Mesin</option>
<option value="Teknik Sipil" <?php echo $jurusan == 'Teknik Sipil' ? 'selected' : ''; ?>>Teknik Sipil</option>
</select>
</div>
<div class="form-group">
<label for="semester">Semester:</label>
<select id="semester" name="semester" required>
<option value="">Pilih Semester</option>
<?php for ($i = 1; $i <= 8; $i++): ?>
<option value="<?php echo $i; ?>" <?php echo $semester == $i ? 'selected' : ''; ?>>
Semester <?php echo $i; ?>
</option>
<?php endfor; ?>
</select>
</div>
<div class="form-group">
<label for="alamat">Alamat:</label>
<textarea id="alamat" name="alamat" placeholder="Masukkan alamat lengkap"><?php echo htmlspecialchars($alamat); ?></textarea>
</div>
<div class="form-group">
<button type="submit" class="btn btn-success">Update Data</button>
<a href="view.php?id=<?php echo $id; ?>" class="btn btn-primary">Lihat Detail</a>
<a href="index.php" class="btn btn-secondary">Batal</a>
</div>
</form>
</div>
</body>
</html>
DELETE - Menghapus Data
Operasi DELETE digunakan untuk menghapus data dari database. Implementasi yang aman harus memiliki konfirmasi dan validasi.
<?php
require_once 'config.php';
$id = $_GET['id'] ?? 0;
$error = '';
$success = false;
if (!$id) {
header('Location: index.php');
exit;
}
try {
$pdo = getConnection();
// Get data to be deleted
$stmt = $pdo->prepare("SELECT * FROM mahasiswa WHERE id = ?");
$stmt->execute([$id]);
$mahasiswa = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$mahasiswa) {
header('Location: index.php');
exit;
}
} catch (PDOException $e) {
die("Error: " . $e->getMessage());
}
// Handle deletion
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['confirm_delete'])) {
try {
$stmt = $pdo->prepare("DELETE FROM mahasiswa WHERE id = ?");
$result = $stmt->execute([$id]);
if ($result) {
$success = true;
} else {
$error = "Gagal menghapus data";
}
} catch (PDOException $e) {
$error = "Error database: " . $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Hapus Mahasiswa</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="header">
<h1>Hapus Data Mahasiswa</h1>
<a href="index.php" class="btn btn-primary">Kembali ke Daftar</a>
</div>
<?php if ($success): ?>
<div class="alert alert-success">
<h3>Data berhasil dihapus!</h3>
<p>Data mahasiswa <strong><?php echo htmlspecialchars($mahasiswa['nama']); ?></strong> telah dihapus dari sistem.</p>
<a href="index.php" class="btn btn-primary">Kembali ke Daftar</a>
</div>
<?php else: ?>
<?php if ($error): ?>
<div class="alert alert-danger">
<?php echo htmlspecialchars($error); ?>
</div>
</php endif; ?>
<div class="alert alert-danger">
<h3>Konfirmasi Penghapusan</h3>
<p>Anda yakin ingin menghapus data mahasiswa berikut?</p>
<p><strong>Data ini tidak dapat dikembalikan setelah dihapus!</strong></p>
</div>
<table style="width: 100%; max-width: 600px; margin-bottom: 20px;">
<tr>
<th style="width: 150px; text-align: left;">NIM</th>
<td><?php echo htmlspecialchars($mahasiswa['nim']); ?></td>
</tr>
<tr>
<th>Nama Lengkap</th>
<td><?php echo htmlspecialchars($mahasiswa['nama']); ?></td>
</tr>
<tr>
<th>Email</th>
<td><?php echo htmlspecialchars($mahasiswa['email']); ?></td>
</tr>
<tr>
<th>Jurusan</th>
<td><?php echo htmlspecialchars($mahasiswa['jurusan']); ?></td>
</tr>
<tr>
<th>Semester</th>
<td>Semester <?php echo $mahasiswa['semester']; ?></td>
</tr>
</table>
<form method="POST" action="" style="display: inline;">
<input type="hidden" name="confirm_delete" value="1">
<button type="submit" class="btn btn-danger" onclick="return confirm('Apakah Anda benar-benar yakin?')">
Ya, Hapus Data
</button>
</form>
<a href="index.php" class="btn btn-secondary">Batal</a>
<a href="view.php?id=<?php echo $id; ?>" class="btn btn-primary">Lihat Detail</a>
<?php endif; ?>
</div>
</body>
</html>
Soft Delete (Opsional)
Sebagai alternatif penghapusan permanen, Anda bisa menggunakan soft delete dengan menambahkan kolom deleted_at
:
-- Tambahkan kolom deleted_at ke tabel
ALTER TABLE mahasiswa ADD COLUMN deleted_at TIMESTAMP NULL;
<?php
// Soft delete - tandai sebagai dihapus tanpa menghapus data
$stmt = $pdo->prepare("UPDATE mahasiswa SET deleted_at = NOW() WHERE id = ?");
$stmt->execute([$id]);
// Modifikasi query SELECT untuk tidak menampilkan data yang dihapus
$sql = "SELECT * FROM mahasiswa WHERE deleted_at IS NULL ORDER BY created_at DESC";
// Untuk mengembalikan data yang dihapus
$stmt = $pdo->prepare("UPDATE mahasiswa SET deleted_at = NULL WHERE id = ?");
$stmt->execute([$id]);
?>
Fitur Tambahan yang Bisa Dikembangkan:
- Export data ke Excel/CSV
- Import data dari file
- Upload foto mahasiswa
- Filter dan sorting lanjutan
- Audit trail (log perubahan data)
- Backup dan restore database
Sebelumnya:
Database MySQLSelanjutnya:
Session dan CookiePath Belajar PHP
Memahami apa itu PHP dan cara instalasinya
Mempelajari cara menulis kode PHP yang benar
Memahami alur program dan pengorganisasian kode
Membuat aplikasi web interaktif
Mengelola data dan keamanan aplikasi
Topik lanjutan untuk pengembangan professional
Tutorial Saat Ini
Level: Menengah
Memerlukan pemahaman dasar PHP
Daftar Isi
Tutorial Terkait
Tips Belajar
🚀 Mulai dengan tutorial "Pengenalan PHP" untuk memahami konsep dasar
1 dari 10💻 Praktikkan setiap contoh kode di komputer Anda sendiri
2 dari 10🔄 Ulangi tutorial jika masih belum paham - itu normal!
3 dari 10🧪 Coba modifikasi contoh kode untuk bereksperimen
4 dari 10👥 Bergabung dengan komunitas PHP Indonesia untuk berdiskusi
5 dari 10📝 Buat catatan atau cheat sheet untuk referensi cepat
6 dari 10🎯 Fokus pada satu topik sampai benar-benar paham
7 dari 10🏗️ Buat project kecil setelah menyelesaikan setiap step
8 dari 10❓ Jangan malu bertanya jika mengalami kesulitan
9 dari 10⏰ Belajar secara konsisten, meski hanya 30 menit per hari
10 dari 10