CRUD PHP dan MySQL Sederhana untuk Pemula

CRUD PHP dan MySQL Sederhana untuk Pemula

CRUD PHP dan MySQL Sederhana untuk Pemula - Ilustrasi AI

Hampir setiap aplikasi web yang sukses—mulai dari media sosial, e-commerce, hingga sistem manajemen inventaris—berputar di sekitar satu konsep dasar: manajemen data. Konsep ini diringkas dalam akronim yang sangat dikenal di dunia pengembangan: CRUD.

CRUD, yang merupakan singkatan dari Create (Membuat), Read (Membaca), Update (Memperbarui), dan Delete (Menghapus), adalah empat operasi dasar yang harus dapat dilakukan oleh aplikasi apapun terhadap data di database. Menguasai CRUD PHP MySQL adalah langkah fundamental pertama Anda menuju menjadi seorang backend developer yang kompeten.

Tutorial ini akan memandu Anda langkah demi langkah, dari persiapan lingkungan hingga implementasi kelima operasi tersebut menggunakan PHP, database MySQL, dan ekstensi MySQLi dengan metode prepared statements (yang sangat penting untuk keamanan). Mari kita mulai membangun aplikasi CRUD sederhana Anda!

Memahami Konsep Dasar CRUD dan Tumpukan Teknologi

Sebelum menyelam ke dalam kode, penting untuk memahami peran setiap komponen yang kita gunakan:

1. PHP (Hypertext Preprocessor)

PHP adalah bahasa skrip sisi server yang bertanggung jawab untuk memproses permintaan pengguna, berinteraksi dengan database, dan menghasilkan HTML yang dikirim kembali ke browser. Dalam konteks CRUD, PHP adalah "otak" yang menjalankan logika aplikasi.

2. MySQL

MySQL adalah sistem manajemen database relasional (RDBMS) yang digunakan untuk menyimpan, mengelola, dan mengambil data. Semua informasi pengguna, produk, atau posting blog akan disimpan di sini.

3. CRUD: Empat Pilar Manajemen Data

  • Create (C): Menyisipkan data baru ke dalam database (biasanya menggunakan kueri SQL INSERT INTO). Contoh: mendaftar pengguna baru.
  • Read (R): Mengambil dan menampilkan data dari database (menggunakan kueri SQL SELECT). Contoh: menampilkan daftar semua produk.
  • Update (U): Mengubah data yang sudah ada (menggunakan kueri SQL UPDATE). Contoh: mengganti alamat email pengguna.
  • Delete (D): Menghapus data dari database (menggunakan kueri SQL DELETE FROM). Contoh: menghapus postingan blog.

Persiapan Lingkungan Pengembangan

Untuk menjalankan CRUD PHP MySQL, Anda memerlukan lingkungan lokal yang meniru server web.

Alat yang Dibutuhkan

  1. Server Lokal: XAMPP, WAMP, atau MAMP (XAMPP direkomendasikan karena mencakup Apache, MySQL, dan PHP). Pastikan Apache dan MySQL sedang berjalan.
  2. Text Editor: VS Code, Sublime Text, atau lainnya.
  3. Database: Akses ke phpMyAdmin (biasanya melalui http://localhost/phpmyadmin) untuk membuat database.

Setup Database MySQL

Di phpMyAdmin, buat database baru (misalnya: db_crud). Kemudian, buat tabel bernama mahasiswa.


CREATE TABLE mahasiswa (
    id INT(11) PRIMARY KEY AUTO_INCREMENT,
    nama VARCHAR(100) NOT NULL,
    nim VARCHAR(15) UNIQUE NOT NULL,
    jurusan VARCHAR(50) NOT NULL
);

    

Struktur Proyek

Buat folder proyek di direktori htdocs (XAMPP) Anda (misalnya: crud_mahasiswa).


/crud_mahasiswa
  |- koneksi.php
  |- index.php (Read)
  |- tambah.php (Form Create)
  |- proses_tambah.php (Action Create)
  |- edit.php (Form Update)
  |- proses_edit.php (Action Update)
  |- hapus.php (Action Delete)

    

Langkah 1: Koneksi Database (Best Practice Keamanan)

File koneksi.php adalah jantung dari aplikasi kita. Kita akan menggunakan MySQLi (Improved MySQL extension) dengan pendekatan prosedural atau berorientasi objek. Di sini, kita menggunakan pendekatan berorientasi objek karena lebih modern dan fleksibel.

koneksi.php


<?php

$host = "localhost"; // Biasanya localhost
$user = "root";      // Default XAMPP
$pass = "";          // Default XAMPP (kosong)
$db   = "db_crud";

// Membuat koneksi
$koneksi = new mysqli($host, $user, $pass, $db);

// Memeriksa koneksi
if ($koneksi->connect_error) {
    die("Koneksi gagal: " . $koneksi->connect_error);
}

// Opsional: Mengatur charset ke utf8
$koneksi->set_charset("utf8");

// Catatan: Variabel $koneksi kini dapat digunakan di file lain
// dengan menggunakan perintah 'include' atau 'require'.

    

Langkah 2: Operasi Read (Menampilkan Data)

Operasi Read adalah bagian termudah dari CRUD PHP MySQL, karena hanya melibatkan pengambilan data dan menampilkannya di tabel HTML.

index.php


<?php
    require 'koneksi.php';
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <title>Data Mahasiswa - CRUD PHP MySQL</title>
    <style>
        table, th, td { border: 1px solid black; border-collapse: collapse; padding: 8px; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>

    <h2>Daftar Mahasiswa</h2>
    <p><a href="tambah.php">[+] Tambah Mahasiswa Baru</a></p>

    <table>
        <thead>
            <tr>
                <th>No</th>
                <th>NIM</th>
                <th>Nama</th>
                <th>Jurusan</th>
                <th>Aksi</th>
            </tr>
        </thead>
        <tbody>
        <?php
            $sql = "SELECT id, nim, nama, jurusan FROM mahasiswa ORDER BY nama ASC";
            $result = $koneksi->query($sql);

            if ($result->num_rows > 0) {
                $no = 1;
                while($row = $result->fetch_assoc()) {
                    echo "<tr>";
                    echo "<td>" . $no++ . "</td>";
                    echo "<td>" . htmlspecialchars($row['nim']) . "</td>";
                    echo "<td>" . htmlspecialchars($row['nama']) . "</td>";
                    echo "<td>" . htmlspecialchars($row['jurusan']) . "</td>";
                    echo "<td>";
                    echo "<a href='edit.php?id=" . $row['id'] . "'>Edit</a> | ";
                    echo "<a href='hapus.php?id=" . $row['id'] . "' onclick=\"return confirm('Yakin ingin menghapus data ini?')\">Hapus</a>";
                    echo "</td>";
                    echo "</tr>";
                }
            } else {
                echo "<tr><td colspan='5'>Tidak ada data mahasiswa.</td></tr>";
            }

            // Menutup koneksi (walaupun di PHP skrip akan menutupnya secara otomatis)
            $koneksi->close();
        ?>
        </tbody>
    </table>

</body>
</html>

    

Langkah 3: Operasi Create (Menambah Data)

Operasi Create memerlukan dua file: satu untuk form input (tambah.php) dan satu untuk memproses data (proses_tambah.php).

tambah.php (Form Input)


<!DOCTYPE html>
<html lang="id">
<head>
    <title>Tambah Mahasiswa</title>
</head>
<body>
    <h2>Tambah Data Mahasiswa</h2>
    <form action="proses_tambah.php" method="POST">
        <label for="nim">NIM:</label><br>
        <input type="text" id="nim" name="nim" required><br><br>

        <label for="nama">Nama:</label><br>
        <input type="text" id="nama" name="nama" required><br><br>
        
        <label for="jurusan">Jurusan:</label><br>
        <input type="text" id="jurusan" name="jurusan" required><br><br>
        
        <input type="submit" value="Simpan Data">
        <a href="index.php">Kembali</a>
    </form>
</body>
</html>

    

proses_tambah.php (Action Create - Menggunakan Prepared Statement)

Ini adalah bagian krusial. Kita menggunakan Prepared Statement (prepare dan bind_param) untuk memastikan bahwa input pengguna diperlakukan sebagai data murni, bukan sebagai bagian dari perintah SQL, sehingga mencegah serangan SQL Injection.


<?php
require 'koneksi.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 1. Ambil dan sanitasi data input
    $nim     = htmlspecialchars($_POST['nim']);
    $nama    = htmlspecialchars($_POST['nama']);
    $jurusan = htmlspecialchars($_POST['jurusan']);

    // 2. Query SQL menggunakan placeholder (?)
    $sql = "INSERT INTO mahasiswa (nim, nama, jurusan) VALUES (?, ?, ?)";

    // 3. Persiapkan Statement
    $stmt = $koneksi->prepare($sql);

    // 4. Bind Parameter (s = string)
    // 'sss' berarti 3 parameter yang akan di-bind semuanya bertipe string
    $stmt->bind_param("sss", $nim, $nama, $jurusan);

    // 5. Eksekusi Statement
    if ($stmt->execute()) {
        header("Location: index.php?status=sukses_tambah");
        exit();
    } else {
        echo "Error: " . $stmt->error;
    }

    // 6. Tutup Statement
    $stmt->close();
    $koneksi->close();
}
?>

    

Langkah 4: Operasi Update (Mengubah Data)

Sama seperti Create, operasi Update memerlukan form (edit.php) untuk mengambil data lama, dan proses aksi (proses_edit.php).

edit.php (Mengambil Data Lama dan Form Edit)


<?php
require 'koneksi.php';

$id = $_GET['id'] ?? null;

if ($id) {
    // Ambil data berdasarkan ID yang dipilih
    $stmt = $koneksi->prepare("SELECT nim, nama, jurusan FROM mahasiswa WHERE id = ?");
    $stmt->bind_param("i", $id); // i = integer
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows === 0) {
        die("Data tidak ditemukan.");
    }
    $data = $result->fetch_assoc();
    $stmt->close();
} else {
    die("ID tidak ditemukan.");
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <title>Edit Mahasiswa</title>
</head>
<body>
    <h2>Edit Data Mahasiswa</h2>
    <form action="proses_edit.php" method="POST">
        <input type="hidden" name="id" value="<?php echo $id; ?>">
        
        <label for="nim">NIM:</label><br>
        <input type="text" id="nim" name="nim" value="<?php echo htmlspecialchars($data['nim']); ?>" required><br><br>

        <label for="nama">Nama:</label><br>
        <input type="text" id="nama" name="nama" value="<?php echo htmlspecialchars($data['nama']); ?>" required><br><br>
        
        <label for="jurusan">Jurusan:</label><br>
        <input type="text" id="jurusan" name="jurusan" value="<?php echo htmlspecialchars($data['jurusan']); ?>" required><br><br>
        
        <input type="submit" value="Update Data">
        <a href="index.php">Batal</a>
    </form>
</body>
</html>
<?php $koneksi->close(); ?>

    

proses_edit.php (Action Update)


<?php
require 'koneksi.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $id      = $_POST['id'];
    $nim     = htmlspecialchars($_POST['nim']);
    $nama    = htmlspecialchars($_POST['nama']);
    $jurusan = htmlspecialchars($_POST['jurusan']);

    // Query Update menggunakan Prepared Statement
    $sql = "UPDATE mahasiswa SET nim = ?, nama = ?, jurusan = ? WHERE id = ?";
    
    $stmt = $koneksi->prepare($sql);
    
    // Bind parameter: sssi (3 string, 1 integer)
    $stmt->bind_param("sssi", $nim, $nama, $jurusan, $id);

    if ($stmt->execute()) {
        header("Location: index.php?status=sukses_update");
        exit();
    } else {
        echo "Error: " . $stmt->error;
    }

    $stmt->close();
    $koneksi->close();
}
?>

    

Langkah 5: Operasi Delete (Menghapus Data)

Operasi Delete paling sederhana. Kita hanya perlu mengambil ID dari URL dan menjalankan kueri DELETE. Penting untuk menggunakan Prepared Statement di sini juga, meskipun hanya untuk satu ID, demi keamanan.

hapus.php


<?php
require 'koneksi.php';

$id = $_GET['id'] ?? null;

if ($id) {
    // Query Delete menggunakan Prepared Statement
    $sql = "DELETE FROM mahasiswa WHERE id = ?";
    
    $stmt = $koneksi->prepare($sql);
    
    // Bind parameter: i (integer)
    $stmt->bind_param("i", $id);

    if ($stmt->execute()) {
        header("Location: index.php?status=sukses_hapus");
        exit();
    } else {
        echo "Error: " . $stmt->error;
    }

    $stmt->close();
    $koneksi->close();
} else {
    header("Location: index.php?status=gagal_hapus_id_kosong");
    exit();
}
?>

    

Kesalahan Umum yang Sering Ditemui Pemula dalam CRUD PHP MySQL

Meskipun CRUD PHP MySQL terlihat mudah, pemula sering tersandung pada beberapa isu umum:

1. Mengabaikan Prepared Statements (Bahaya SQL Injection)

Kesalahan: Langsung memasukkan variabel user ke dalam kueri SQL, seperti $sql = "INSERT INTO tabel VALUES ('$_POST[nama]')";.
Solusi: Selalu gunakan Prepared Statements (seperti yang kita lakukan di atas) atau, setidaknya, fungsi sanitasi data seperti mysqli_real_escape_string(). Ini adalah standar profesional wajib.

2. Koneksi Database Gagal (Error 2002 atau Access Denied)

Seringkali terjadi karena salah satu dari hal berikut:

  • Server MySQL belum dinyalakan di XAMPP/WAMP.
  • Username atau Password di koneksi.php salah (misalnya, pengguna mencoba menggunakan password di XAMPP yang defaultnya kosong).
  • Nama database di koneksi.php salah ketik.

3. Error "Undefined Index"

Ini terjadi ketika Anda mencoba mengakses variabel $_POST atau $_GET yang tidak dikirimkan. Misalnya, jika Anda salah mengetik nama input di form HTML (misalnya name="nama_user") tetapi di PHP Anda mencoba mengakses $_POST['nama']. Selalu cek konsistensi nama input.

FAQ (Pertanyaan yang Sering Diajukan)

Apa perbedaan antara MySQLi dan PDO?

Keduanya adalah ekstensi PHP untuk berinteraksi dengan database MySQL. MySQLi (MySQL Improved) hanya bekerja dengan MySQL. PDO (PHP Data Objects) adalah lapisan abstraksi database, artinya ia dapat bekerja dengan berbagai jenis database (PostgreSQL, SQL Server, dll.) dengan antarmuka yang sama. Untuk proyek sederhana berbasis MySQL, MySQLi sudah memadai. Untuk proyek yang lebih besar atau yang membutuhkan fleksibilitas database, PDO lebih disukai.

Apakah aman menyimpan password di database MySQL?

Tidak, Anda tidak boleh menyimpan password dalam bentuk teks biasa. Password harus selalu di-hash menggunakan algoritma satu arah yang kuat seperti password_hash() di PHP sebelum disimpan.

Mengapa saya harus menggunakan htmlspecialchars() saat menampilkan data?

Ini adalah tindakan pencegahan terhadap serangan XSS (Cross-Site Scripting). Jika data mengandung kode HTML atau JavaScript berbahaya (misalnya tag <script>), htmlspecialchars() akan mengubahnya menjadi entitas HTML yang tidak dieksekusi oleh browser, memastikan data ditampilkan dengan aman.

Kesimpulan dan Langkah Selanjutnya

Selamat! Anda telah berhasil membangun aplikasi CRUD PHP MySQL yang berfungsi penuh dan, yang paling penting, aman menggunakan Prepared Statements.

Menguasai CRUD adalah fondasi yang akan memungkinkan Anda membangun aplikasi web dinamis yang kompleks. Ini adalah keterampilan inti yang harus dimiliki setiap developer.

Langkah selanjutnya untuk meningkatkan aplikasi dasar ini adalah:

  1. Menerapkan validasi form yang lebih ketat (validasi sisi server).
  2. Menambahkan styling menggunakan CSS atau framework CSS (seperti Bootstrap) agar tampilan lebih menarik.
  3. Memindahkan logika database ke dalam kelas (menggunakan konsep OOP) agar kode lebih rapi dan mudah dipertahankan (refactoring).


Posting Komentar

Lebih baru Lebih lama