Membuat CRUD dengan PHP dan MySQL dengan Fitur Upload Gambar dan Validasi File
Membangun aplikasi CRUD (Create, Read, Update, Delete) dengan PHP dan MySQL adalah salah satu latihan dasar yang harus dikuasai oleh setiap web developer pemula. CRUD memungkinkan aplikasi untuk menambah, menampilkan, mengubah, dan menghapus data dari database.
Namun, jika aplikasi CRUD hanya mengelola data teks, fiturnya masih terbatas. Untuk membuatnya lebih nyata seperti sistem informasi mahasiswa, aplikasi produk, atau katalog barang, kita perlu menambahkan fitur upload gambar.
Di artikel ini, kita tidak hanya membahas cara membuat CRUD dengan PHP dan MySQL lengkap dengan fitur upload gambar, tetapi juga menambahkan validasi file upload. Validasi ini penting agar hanya file gambar yang valid yang bisa masuk, serta mencegah file dengan ukuran terlalu besar atau format yang berbahaya.
Mengapa Validasi File Upload Penting?
Jika tidak ada validasi, user bisa mengupload file apa saja, termasuk script berbahaya. Potensi masalah yang bisa muncul:
-
Upload file berbahaya seperti
.php
atau.exe
. -
Ukuran file terlalu besar sehingga membebani server.
-
Format file tidak sesuai sehingga menimbulkan error saat ditampilkan.
Dengan validasi, kita bisa membatasi hanya file gambar tertentu (misalnya JPG, JPEG, PNG, GIF) dengan ukuran maksimal (misalnya 2 MB).
Persiapan Aplikasi CRUD
Sebelum menambahkan validasi file upload, siapkan:
-
Database MySQL dengan tabel
mahasiswa
(sudah ada kolomfoto
). -
File koneksi PHP (
koneksi.php
) untuk menghubungkan ke database. -
Folder
uploads/
untuk menyimpan gambar.
Struktur tabel mahasiswa:
CREATE DATABASE crud_upload;
USE crud_upload;
CREATE TABLE mahasiswa (
id INT(11) AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
nim VARCHAR(20) NOT NULL,
jurusan VARCHAR(50) NOT NULL,
foto VARCHAR(255) DEFAULT NULL
);
1. Fitur Create + Validasi Upload
File: tambah.php
<?php include 'koneksi.php'; ?>
<h2>Tambah Data Mahasiswa</h2>
<form method="POST" enctype="multipart/form-data">
<label>Nama:</label>
<input type="text" name="nama" required><br>
<label>NIM:</label>
<input type="text" name="nim" required><br>
<label>Jurusan:</label>
<input type="text" name="jurusan" required><br>
<label>Foto:</label>
<input type="file" name="foto" accept="image/*"><br>
<button type="submit" name="simpan">Simpan</button>
</form>
<?php
if (isset($_POST['simpan'])) {
$nama = htmlspecialchars($_POST['nama']);
$nim = htmlspecialchars($_POST['nim']);
$jurusan = htmlspecialchars($_POST['jurusan']);
if (empty($nama) || empty($nim) || empty($jurusan)) {
echo "Semua field wajib diisi!";
exit;
}
if (!is_numeric($nim)) {
echo "NIM harus berupa angka!";
exit;
}
// Validasi file upload
$foto = $_FILES['foto']['name'];
$tmp = $_FILES['foto']['tmp_name'];
$size = $_FILES['foto']['size'];
$folder = "uploads/";
$foto_baru = null;
if ($foto != "") {
$ekstensi = strtolower(pathinfo($foto, PATHINFO_EXTENSION));
$ekstensi_valid = ['jpg','jpeg','png','gif'];
if (!in_array($ekstensi, $ekstensi_valid)) {
echo "Hanya file JPG, JPEG, PNG, atau GIF yang diizinkan!";
exit;
}
if ($size > 2*1024*1024) { // 2MB
echo "Ukuran file terlalu besar! Maksimal 2MB.";
exit;
}
$foto_baru = time() . "_" . $foto;
move_uploaded_file($tmp, $folder.$foto_baru);
}
$query = "INSERT INTO mahasiswa (nama, nim, jurusan, foto)
VALUES ('$nama', '$nim', '$jurusan', '$foto_baru')";
$result = mysqli_query($koneksi, $query);
if ($result) {
echo "Data berhasil disimpan!";
} else {
echo "Gagal menyimpan data!";
}
}
?>
2. Fitur Read + Gambar
File: index.php
<?php include 'koneksi.php'; ?>
<h2>Data Mahasiswa</h2>
<a href="tambah.php">Tambah Data</a>
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<th>ID</th>
<th>Nama</th>
<th>NIM</th>
<th>Jurusan</th>
<th>Foto</th>
<th>Aksi</th>
</tr>
<?php
$query = "SELECT * FROM mahasiswa";
$result = mysqli_query($koneksi, $query);
while ($row = mysqli_fetch_assoc($result)) {
echo "<tr>
<td>".$row['id']."</td>
<td>".$row['nama']."</td>
<td>".$row['nim']."</td>
<td>".$row['jurusan']."</td>
<td>";
if ($row['foto']) {
echo "<img src='uploads/".$row['foto']."' width='80'>";
} else {
echo "-";
}
echo "</td>
<td>
<a href='edit.php?id=".$row['id']."'>Edit</a> |
<a href='hapus.php?id=".$row['id']."'>Hapus</a>
</td>
</tr>";
}
?>
</table>
3. Fitur Update + Validasi Upload Baru
File: edit.php
<?php
include 'koneksi.php';
$id = $_GET['id'];
$query = "SELECT * FROM mahasiswa WHERE id=$id";
$result = mysqli_query($koneksi, $query);
$data = mysqli_fetch_assoc($result);
if (isset($_POST['update'])) {
$nama = htmlspecialchars($_POST['nama']);
$nim = htmlspecialchars($_POST['nim']);
$jurusan = htmlspecialchars($_POST['jurusan']);
if (empty($nama) || empty($nim) || empty($jurusan)) {
echo "Semua field harus diisi!";
exit;
}
if (!is_numeric($nim)) {
echo "NIM harus berupa angka!";
exit;
}
if ($_FILES['foto']['name'] != "") {
$foto = $_FILES['foto']['name'];
$tmp = $_FILES['foto']['tmp_name'];
$size = $_FILES['foto']['size'];
$folder = "uploads/";
$ekstensi = strtolower(pathinfo($foto, PATHINFO_EXTENSION));
$ekstensi_valid = ['jpg','jpeg','png','gif'];
if (!in_array($ekstensi, $ekstensi_valid)) {
echo "Format file tidak valid!";
exit;
}
if ($size > 2*1024*1024) {
echo "Ukuran file terlalu besar! Maksimal 2MB.";
exit;
}
$foto_baru = time() . "_" . $foto;
move_uploaded_file($tmp, $folder.$foto_baru);
if ($data['foto'] != "" && file_exists("uploads/".$data['foto'])) {
unlink("uploads/".$data['foto']);
}
$update = "UPDATE mahasiswa
SET nama='$nama', nim='$nim', jurusan='$jurusan', foto='$foto_baru'
WHERE id=$id";
} else {
$update = "UPDATE mahasiswa
SET nama='$nama', nim='$nim', jurusan='$jurusan'
WHERE id=$id";
}
mysqli_query($koneksi, $update);
header("Location: index.php");
}
?>
<h2>Edit Data Mahasiswa</h2>
<form method="POST" enctype="multipart/form-data">
<label>Nama:</label>
<input type="text" name="nama" value="<?php echo $data['nama']; ?>" required><br>
<label>NIM:</label>
<input type="text" name="nim" value="<?php echo $data['nim']; ?>" required><br>
<label>Jurusan:</label>
<input type="text" name="jurusan" value="<?php echo $data['jurusan']; ?>" required><br>
<label>Foto:</label>
<input type="file" name="foto" accept="image/*"><br>
<?php if ($data['foto']) { echo "<img src='uploads/".$data['foto']."' width='100'><br>"; } ?>
<button type="submit" name="update">Update</button>
</form>
4. Fitur Delete + Foto
File: hapus.php
<?php
include 'koneksi.php';
$id = $_GET['id'];
$query = "SELECT * FROM mahasiswa WHERE id=$id";
$result = mysqli_query($koneksi, $query);
$data = mysqli_fetch_assoc($result);
if ($data['foto'] != "" && file_exists("uploads/".$data['foto'])) {
unlink("uploads/".$data['foto']);
}
$delete = "DELETE FROM mahasiswa WHERE id=$id";
mysqli_query($koneksi, $delete);
header("Location: index.php");
?>
Kesimpulan
Dengan langkah-langkah di atas, kita telah berhasil membuat aplikasi CRUD dengan PHP dan MySQL lengkap dengan fitur upload gambar serta validasi file. Validasi yang kita tambahkan meliputi:
-
Membatasi tipe file gambar → hanya JPG, JPEG, PNG, dan GIF.
-
Membatasi ukuran file → maksimal 2 MB.
-
Menjaga keamanan aplikasi → mencegah upload file berbahaya.
Dengan validasi ini, aplikasi menjadi lebih aman, rapi, dan siap digunakan di lingkungan nyata.
Posting Komentar