Mengenal CRUD
CRUD adalah akronim untuk Create, Read, Udate, dan Delete. Operasi CRUD adalah manipulasi data dasar untuk basis data. Kita telah belajar bagaimana melakukan create (mis. Insert), read (mis. Select), update dan delete operasi di bab-bab sebelumnya. Dalam tutorial ini kita akan membuat aplikasi PHP sederhana untuk melakukan semua operasi ini pada tabel database MySQL di satu tempat.
Baiklah, mari kita mulai dengan membuat tabel yang akan kita gunakan dalam semua contoh kita.
Membuat Tabel Database
Jalankan query SQL berikut untuk membuat tabel bernama employees di dalam database MySQL kalian. Kita akan menggunakan tabel ini untuk semua operasi kita di masa depan.
CREATE TABLE employees ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, address VARCHAR(255) NOT NULL, salary INT(10) NOT NULL );
Membuat File Config
Setelah membuat tabel, kita perlu membuat skrip PHP untuk dapat terhubung ke server database MySQL. Mari kita membuat file bernama “config.php” dan memasukkan kode berikut di dalamnya.
Nanti kita akan menyertakan file konfigurasi ini di halaman lain menggunakan fungsi PHP require_once().
<?php /* Database credentials. Assuming you are running MySQL server with default setting (user 'root' with no password) */ define('DB_SERVER', 'localhost'); define('DB_USERNAME', 'root'); define('DB_PASSWORD', ''); define('DB_NAME', 'demo'); /* Attempt to connect to MySQL database */ $link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME); // Check connection if($link === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } ?>
Jika kalian telah mengunduh contoh kode berorientasi objek atau PDO menggunakan tombol unduh, harap hapus teks “-oo-format” atau “-pdo-format” dari nama file sebelum menguji kode tersebut.
Catatan: Ganti kredensial sesuai dengan pengaturan server MySQL kalian sebelum menguji kode ini, misalnya, ganti nama basis data ‘demo‘ dengan nama basis data kalian sendiri, ganti nama pengguna ‘root‘ dengan nama pengguna basis data kalian sendiri, tentukan kata sandi basis data jika ada.
Membuat Landing Page
Pertama kita akan membuat landing page untuk aplikasi CRUD kita yang berisi grid data yang menunjukkan catatan dari tabel database karyawan. Itu juga memiliki ikon action untuk setiap catatan yang ditampilkan di grid, yang dimana kalian dapat memilih untuk melihat rinciannya, memperbaruinya, atau menghapusnya.
Kita juga akan menambahkan tombol create di bagian atas grid data yang dapat digunakan untuk membuat catatan baru di tabel karyawan. Buat file bernama “index.php” dan masukkan kode berikut di dalamnya:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Dashboard</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"></script> <style type="text/css"> .wrapper{ width: 650px; margin: 0 auto; } .page-header h2{ margin-top: 0; } table tr td:last-child a{ margin-right: 15px; } </style> <script type="text/javascript"> $(document).ready(function(){ $('[data-toggle="tooltip"]').tooltip(); }); </script> </head> <body> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header clearfix"> <h2 class="pull-left">Employees Details</h2> <a href="create.php" class="btn btn-success pull-right">Add New Employee</a> </div> <?php // Include config file require_once "config.php"; // Attempt select query execution $sql = "SELECT * FROM employees"; if($result = mysqli_query($link, $sql)){ if(mysqli_num_rows($result) > 0){ echo "<table class='table table-bordered table-striped'>"; echo "<thead>"; echo "<tr>"; echo "<th>#</th>"; echo "<th>Name</th>"; echo "<th>Address</th>"; echo "<th>Salary</th>"; echo "<th>Action</th>"; echo "</tr>"; echo "</thead>"; echo "<tbody>"; while($row = mysqli_fetch_array($result)){ echo "<tr>"; echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['address'] . "</td>"; echo "<td>" . $row['salary'] . "</td>"; echo "<td>"; echo "<a href='read.php?id=". $row['id'] ."' title='View Record' data-toggle='tooltip'><span class='glyphicon glyphicon-eye-open'></span></a>"; echo "<a href='update.php?id=". $row['id'] ."' title='Update Record' data-toggle='tooltip'><span class='glyphicon glyphicon-pencil'></span></a>"; echo "<a href='delete.php?id=". $row['id'] ."' title='Delete Record' data-toggle='tooltip'><span class='glyphicon glyphicon-trash'></span></a>"; echo "</td>"; echo "</tr>"; } echo "</tbody>"; echo "</table>"; // Free result set mysqli_free_result($result); } else{ echo "<p class='lead'><em>No records were found.</em></p>"; } } else{ echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } // Close connection mysqli_close($link); ?> </div> </div> </div> </div> </body> </html>
Setelah tabel employees diisi dengan beberapa catatan landing page yaitu seperti contohnya grid data CRUD mungkin akan terlihat seperti yang ditunjukkan di bawah ini:

Tips: Kita telah menggunakan framework Bootstrap untuk membuat layout aplikasi CRUD ini dengan cepat dan indah. Bootstrap adalah framework front-end yang paling populer dan powerful untuk pengembangan web yang lebih cepat dan lebih responsif. Silakan, cek bagian tutorial Bootstrap untuk mempelajari lebih lanjut tentang framework ini.
Membuat Create Page
Di bagian ini kita akan membangun fungsi Create pada aplikasi CRUD kita.
Mari kita buat file bernama “create.php” dan letakkan kode berikut di dalamnya. Ini akan menghasilkan form web yang dapat digunakan untuk menyisipkan catatan di tabel employees.
<?php // Include config file require_once "config.php"; // Define variables and initialize with empty values $name = $address = $salary = ""; $name_err = $address_err = $salary_err = ""; // Processing form data when form is submitted if($_SERVER["REQUEST_METHOD"] == "POST"){ // Validate name $input_name = trim($_POST["name"]); if(empty($input_name)){ $name_err = "Please enter a name."; } elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){ $name_err = "Please enter a valid name."; } else{ $name = $input_name; } // Validate address $input_address = trim($_POST["address"]); if(empty($input_address)){ $address_err = "Please enter an address."; } else{ $address = $input_address; } // Validate salary $input_salary = trim($_POST["salary"]); if(empty($input_salary)){ $salary_err = "Please enter the salary amount."; } elseif(!ctype_digit($input_salary)){ $salary_err = "Please enter a positive integer value."; } else{ $salary = $input_salary; } // Check input errors before inserting in database if(empty($name_err) && empty($address_err) && empty($salary_err)){ // Prepare an insert statement $sql = "INSERT INTO employees (name, address, salary) VALUES (?, ?, ?)"; if($stmt = mysqli_prepare($link, $sql)){ // Bind variables to the prepared statement as parameters mysqli_stmt_bind_param($stmt, "sss", $param_name, $param_address, $param_salary); // Set parameters $param_name = $name; $param_address = $address; $param_salary = $salary; // Attempt to execute the prepared statement if(mysqli_stmt_execute($stmt)){ // Records created successfully. Redirect to landing page header("location: index.php"); exit(); } else{ echo "Something went wrong. Please try again later."; } } // Close statement mysqli_stmt_close($stmt); } // Close connection mysqli_close($link); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Create Record</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 500px; margin: 0 auto; } </style> </head> <body> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h2>Create Record</h2> </div> <p>Please fill this form and submit to add employee record to the database.</p> <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> <div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>"> <label>Name</label> <input type="text" name="name" class="form-control" value="<?php echo $name; ?>"> <span class="help-block"><?php echo $name_err;?></span> </div> <div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>"> <label>Address</label> <textarea name="address" class="form-control"><?php echo $address; ?></textarea> <span class="help-block"><?php echo $address_err;?></span> </div> <div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>"> <label>Salary</label> <input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>"> <span class="help-block"><?php echo $salary_err;?></span> </div> <input type="submit" class="btn btn-primary" value="Submit"> <a href="index.php" class="btn btn-default">Cancel</a> </form> </div> </div> </div> </div> </body> </html>
File “create.php” yang sama akan menampilkan form HTML dan memproses data form yang dikirimkan (submitted). Ini juga akan melakukan validasi dasar pada input pengguna (baris no-11 hingga 37) sebelum menyimpan data.
Membuat Read Page
Sekarang saatnya untuk membangun fungsi Read dari aplikasi CRUD kita.
Mari kita buat file bernama “create.php” dan letakkan kode berikut di dalamnya. Hal tersebut hanya akan mengambil catatan dari tabel employees berdasarkan atribut id karyawan.
<?php // Check existence of id parameter before processing further if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){ // Include config file require_once "config.php"; // Prepare a select statement $sql = "SELECT * FROM employees WHERE id = ?"; if($stmt = mysqli_prepare($link, $sql)){ // Bind variables to the prepared statement as parameters mysqli_stmt_bind_param($stmt, "i", $param_id); // Set parameters $param_id = trim($_GET["id"]); // Attempt to execute the prepared statement if(mysqli_stmt_execute($stmt)){ $result = mysqli_stmt_get_result($stmt); if(mysqli_num_rows($result) == 1){ /* Fetch result row as an associative array. Since the result set contains only one row, we don't need to use while loop */ $row = mysqli_fetch_array($result, MYSQLI_ASSOC); // Retrieve individual field value $name = $row["name"]; $address = $row["address"]; $salary = $row["salary"]; } else{ // URL doesn't contain valid id parameter. Redirect to error page header("location: error.php"); exit(); } } else{ echo "Oops! Something went wrong. Please try again later."; } } // Close statement mysqli_stmt_close($stmt); // Close connection mysqli_close($link); } else{ // URL doesn't contain id parameter. Redirect to error page header("location: error.php"); exit(); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>View Record</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 500px; margin: 0 auto; } </style> </head> <body> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h1>View Record</h1> </div> <div class="form-group"> <label>Name</label> <p class="form-control-static"><?php echo $row["name"]; ?></p> </div> <div class="form-group"> <label>Address</label> <p class="form-control-static"><?php echo $row["address"]; ?></p> </div> <div class="form-group"> <label>Salary</label> <p class="form-control-static"><?php echo $row["salary"]; ?></p> </div> <p><a href="index.php" class="btn btn-primary">Back</a></p> </div> </div> </div> </div> </body> </html>
Membuat Update Page
Demikian pula, kita dapat membangun fungsionalitas Update aplikasi CRUD kita.
Mari kita buat file bernama “update.php” dan masukkan kode berikut di dalamnya. Ini akan memperbarui catatan yang ada di tabel employees berdasarkan atribut id karyawan.
<?php // Include config file require_once "config.php"; // Define variables and initialize with empty values $name = $address = $salary = ""; $name_err = $address_err = $salary_err = ""; // Processing form data when form is submitted if(isset($_POST["id"]) && !empty($_POST["id"])){ // Get hidden input value $id = $_POST["id"]; // Validate name $input_name = trim($_POST["name"]); if(empty($input_name)){ $name_err = "Please enter a name."; } elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){ $name_err = "Please enter a valid name."; } else{ $name = $input_name; } // Validate address address $input_address = trim($_POST["address"]); if(empty($input_address)){ $address_err = "Please enter an address."; } else{ $address = $input_address; } // Validate salary $input_salary = trim($_POST["salary"]); if(empty($input_salary)){ $salary_err = "Please enter the salary amount."; } elseif(!ctype_digit($input_salary)){ $salary_err = "Please enter a positive integer value."; } else{ $salary = $input_salary; } // Check input errors before inserting in database if(empty($name_err) && empty($address_err) && empty($salary_err)){ // Prepare an update statement $sql = "UPDATE employees SET name=?, address=?, salary=? WHERE id=?"; if($stmt = mysqli_prepare($link, $sql)){ // Bind variables to the prepared statement as parameters mysqli_stmt_bind_param($stmt, "sssi", $param_name, $param_address, $param_salary, $param_id); // Set parameters $param_name = $name; $param_address = $address; $param_salary = $salary; $param_id = $id; // Attempt to execute the prepared statement if(mysqli_stmt_execute($stmt)){ // Records updated successfully. Redirect to landing page header("location: index.php"); exit(); } else{ echo "Something went wrong. Please try again later."; } } // Close statement mysqli_stmt_close($stmt); } // Close connection mysqli_close($link); } else{ // Check existence of id parameter before processing further if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){ // Get URL parameter $id = trim($_GET["id"]); // Prepare a select statement $sql = "SELECT * FROM employees WHERE id = ?"; if($stmt = mysqli_prepare($link, $sql)){ // Bind variables to the prepared statement as parameters mysqli_stmt_bind_param($stmt, "i", $param_id); // Set parameters $param_id = $id; // Attempt to execute the prepared statement if(mysqli_stmt_execute($stmt)){ $result = mysqli_stmt_get_result($stmt); if(mysqli_num_rows($result) == 1){ /* Fetch result row as an associative array. Since the result set contains only one row, we don't need to use while loop */ $row = mysqli_fetch_array($result, MYSQLI_ASSOC); // Retrieve individual field value $name = $row["name"]; $address = $row["address"]; $salary = $row["salary"]; } else{ // URL doesn't contain valid id. Redirect to error page header("location: error.php"); exit(); } } else{ echo "Oops! Something went wrong. Please try again later."; } } // Close statement mysqli_stmt_close($stmt); // Close connection mysqli_close($link); } else{ // URL doesn't contain id parameter. Redirect to error page header("location: error.php"); exit(); } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Update Record</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 500px; margin: 0 auto; } </style> </head> <body> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h2>Update Record</h2> </div> <p>Please edit the input values and submit to update the record.</p> <form action="<?php echo htmlspecialchars(basename($_SERVER['REQUEST_URI'])); ?>" method="post"> <div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>"> <label>Name</label> <input type="text" name="name" class="form-control" value="<?php echo $name; ?>"> <span class="help-block"><?php echo $name_err;?></span> </div> <div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>"> <label>Address</label> <textarea name="address" class="form-control"><?php echo $address; ?></textarea> <span class="help-block"><?php echo $address_err;?></span> </div> <div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>"> <label>Salary</label> <input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>"> <span class="help-block"><?php echo $salary_err;?></span> </div> <input type="hidden" name="id" value="<?php echo $id; ?>"/> <input type="submit" class="btn btn-primary" value="Submit"> <a href="index.php" class="btn btn-default">Cancel</a> </form> </div> </div> </div> </div> </body> </html>
Membuat Delete Page
Akhirnya, kita akan membangun fungsionalitas Delete dari aplikasi CRUD kita.
Mari kita buat file bernama “delete.php” dan masukkan kode berikut di dalamnya. Ini akan menghapus catatan yang ada dari tabel employees berdasarkan atribut id karyawan.
<?php // Process delete operation after confirmation if(isset($_POST["id"]) && !empty($_POST["id"])){ // Include config file require_once "config.php"; // Prepare a delete statement $sql = "DELETE FROM employees WHERE id = ?"; if($stmt = mysqli_prepare($link, $sql)){ // Bind variables to the prepared statement as parameters mysqli_stmt_bind_param($stmt, "i", $param_id); // Set parameters $param_id = trim($_POST["id"]); // Attempt to execute the prepared statement if(mysqli_stmt_execute($stmt)){ // Records deleted successfully. Redirect to landing page header("location: index.php"); exit(); } else{ echo "Oops! Something went wrong. Please try again later."; } } // Close statement mysqli_stmt_close($stmt); // Close connection mysqli_close($link); } else{ // Check existence of id parameter if(empty(trim($_GET["id"]))){ // URL doesn't contain id parameter. Redirect to error page header("location: error.php"); exit(); } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>View Record</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 500px; margin: 0 auto; } </style> </head> <body> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h1>Delete Record</h1> </div> <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> <div class="alert alert-danger fade in"> <input type="hidden" name="id" value="<?php echo trim($_GET["id"]); ?>"/> <p>Are you sure you want to delete this record?</p><br> <p> <input type="submit" value="Yes" class="btn btn-danger"> <a href="index.php" class="btn btn-default">No</a> </p> </div> </form> </div> </div> </div> </div> </body> </html>
Membuat Error Page
Pada akhirnya, mari kita buat satu file lagi “error.php“. Halaman ini akan ditampilkan jika permintaan tidak valid yaitu jika parameter id tidak ada dari string kueri URL atau tidak valid.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Error</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 750px; margin: 0 auto; } </style> </head> <body> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h1>Invalid Request</h1> </div> <div class="alert alert-danger fade in"> <p>Sorry, you've made an invalid request. Please <a href="index.php" class="alert-link">go back</a> and try again.</p> </div> </div> </div> </div> </div> </body> </html>