Lewati ke konten utama

Cara Membuat CRUD Dengan PHP Dan MySQL Untuk Pemula

26 menit

Operasi CRUD jadi sisi utama di pada proses peningkatan web. Operasi ini jadi pokok dari semua proses pengendalian data pada suatu web. Oleh karena itu, operasi CRUD jadi penting untuk didalami saat sebelum Anda membuat web yang handal.

Agar Anda lebih gampang untuk pahami CRUD, pada artikel ini kami akan coba membahas langkah membuat CRUD memakai bahasa pemrograman PHP. Keinginannya sesudah membaca artikel ini Anda dapat membuat CRUD dengan PHP dan MySQL secara cepat. Yok baca penjelasannya!

Apa itu CRUD? #

CRUD ialah ringkasan dari Create, Read, Up-date, dan Delete. Proses ini benar-benar terkait dengan ambil atau transaksi bisnis data dari atau ke database. Ini jadi penting jika terkait dengan mekanisme info perusahaan karena data yang diolah umumnya sebagai data transaksi bisnis.

Untuk PHP Developer, operasi CRUD umumnya jadi pillar untuk pelajari proses pengendalian data memakai PHP dan sudah pasti MySQL database. Nach CRUD ini dapat dimisalkan sebagai lajur atau jaringan yang menyambungkan di antara bahasa pemrograman PHP dengan MySQL.

Ulasan Operasi CRUD Beserta Contohnya #

  • Create (C) sebagai proses pembikinan data baru. Proses ini umumnya dilaksanakan saat Anda mendaftarkan pada suatu halaman web. Data yang Anda masukan akan diletakkan dalam database memakai operasi Create.

  • Read (R) sebagai proses ambil data dari database. Proses ini umumnya terjadi saat Anda ingin lakukan proses login di halaman web tertentu. Saat Anda click “Login” karena itu web akan jalankan proses “Read” untuk lakukan klarifikasi account yang Anda pakai.

  • Contoh operasi yang lebih simpel yakni saat Anda terhubung sebuah halaman web, waktu itu juga proses Read jalan. Dari hasil operasi ini ialah penampilan halaman web yang Anda saksikan di browser. Up-date (U) ialah proses ubah data yang ada dalam database. Contoh proses ini saat Anda mengganti profile dalam account media sosial. Saat Anda click “Ganti”, web akan mengirim proses Up-date ke database. Selanjutnya database menanggapinya dengan ubah data lama jadi data baru yang Anda tambah lewat halaman profile.

  • Delete (D) ialah proses untuk hapus data yang berada di database. Proses ini serupa dengan Up-date, perbedaannya, proses Delete akan ubah data yang berada di database jadi ‘tidak ada'.

Tersebut deskripsi kecil pemakaian CRUD di web.

Agar lebih gampang pahami, berikut ini sebagai contoh pemakaian CRUD dengan memakai bahasa pemrograman PHP dan MySQL databases.

Cara Membuat CRUD Dengan PHP Dan MySQL Untuk Pemula #

Developer program situs kerap memakai PHP dan MySQL sebagai elemen intinya. Bahasa pemrograman PHP mengolah beragam peranan untuk jalankan operasi CRUD. Dan MySQL bekerja untuk simpan database dari web.

MySQL sebetulnya bukan hanya dapat dijangkau memakai PHP saja, bahasa pemrograman lain seperti Python, JavaScript, dan semacamnya bisa juga untuk terhubung MySQL.

Dan PHP bisa juga memakai server database lain seperti PostgreSQL, MongoDB, dan semacamnya.

Tetapi pada perumpamaan ini kami memakai PHP dan MySQL karena lebih simpel dan gampang untuk dimengerti.

Catatan: Perlu Anda kenali , ada tiga type jaringan -koneksi ini kadang disebutkan dengan API MySQL- di antara PHP ke MySQL, yakni mysql, mysqli, dan PDO (PHP Data Objek). Mysqli sebagai versus alternatif dari mysql. Ini karena mysql tidak diperkembangkan kembali semenjak versus PHP 5.5. Dan saat ingin menyambungkan PHP dengan MySQL dan penyuplai database lain, Anda perlu memakai type jaringan PDO.

Kesempatan kali ini, kita akan belajar memakai PHP dan MySQL untuk membikin program simpel. Pada contoh kasus berikut ini, kami akan coba membuat suatu program simpel untuk menyaksikan dan menambah data karyawan.

1. Membuat Tabel Database #

Agar Anda dapat lakukan operasi CRUD sudah pasti perlu sebuah data . Maka hal pertama kali yang perlu Anda kerjakan untuk membikin CRUD ialah menambah data ke database di MySQL.

Anda bisa menambah data karyawan memakai query berikut ini.

Pertama buat database lebih dulu.

CREATE DATABASE niagahoster; Selanjutnya masukan TABEL yang nanti dipakai untuk data karyawan (employee).

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
);

Query di atas sebagai SQL yang bekerja untuk mempersiapkan database dan TABEL yang berisi faktor id, name (nama), alamat (address), dan salary (upah).

Anda dapat menambah faktor lain, seperti nomor smartphone, status, hoby, dan lain-lain.

Yakinkan database sukses dibuat dengan mengetikan perintah “show tables;”.

2. Membuat File Config #

Nach! Sesudah Anda menyiapkan data, cara setelah itu menyiapkan jaringan agar PHP bisa tersambung dengan MySQL. Triknya dengan membuat suatu file berisi script PHP khusus untuk lakukan jaringan.

Anda dapat menamai apa saja sesuai kemauan. Pada perumpamaan ini, kami memakai nama file config.php. Selanjutnya masukan baris code berikut ini.

File ini kelak akan dipadukan dengan file lain memakai peranan PHP require_once() dan berlaku untuk file yang lain.

Anda dapat menyaksikan pada baris code berikut ini.

Nach! Sesudah Anda menyiapkan data, cara setelah itu menyiapkan jaringan agar PHP bisa tersambung dengan MySQL. Triknya dengan membuat suatu file berisi script PHP khusus untuk lakukan jaringan.

Anda dapat menamai apa saja sesuai kemauan. Pada perumpamaan ini, kami memakai nama file config.php. Selanjutnya masukan baris code berikut ini.

File ini kelak akan dipadukan dengan file lain memakai peranan PHP require_once() dan berlaku untuk file yang lain.

Anda dapat menyaksikan pada baris code berikut ini.

<?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', 'password');
define('DB_NAME', 'niagahoster');

/* 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());
}
?>

Perlu jadi catatan. Anda harus menukar DB_SERVER, DB_USERNAME, DB_PASSWORD, dan DB_NAME dengan detil database Anda masing-masing.

File config.php umumnya berisi beberapa komposisi yang terkait dengan web . Maka file ini jadi pusat komposisi dan kerap diundang/dipakai di file yang lain.

3. Membuat Landing Page #

Sesudah Anda membuat data dan mengoneksikan PHP ke database, cara setelah itu membuat tempat untuk tampilkan data itu. Kami akan membuat suatu landing page untuk program CRUD. Landing page ini kelak akan tampilkan record dari tabel database employees.

Dalam landing page ini bakal ada ikon pada tiap record dari tabel database employee. Pada tiap data yang tampil dalam tabel bakal ada ikon yang dapat dipakai untuk jalankan perintah up-date, delete, dan menyaksikan detil info atau data.

Kami akan menambah tombol create untuk menambah data employees. Tombol ini bermanfaat untuk menambah record baru pada tabel employees dalam database.

Untuk membuat, silahkan masukan baris code berikut ini ke file indeks.php.

<!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">Informasi Pegawai</h2>
                        <a href="create.php" class="btn btn-success pull-right">Tambah Baru</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>Nama</th>";
                                        echo "<th>Alamat</th>";
                                        echo "<th>Salary</th>";
                                        echo "<th>Pengaturan</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>

Masukan beberapa data karyawan lewat halaman landing page. Baris code di lebih kurang tampilkan tabel berikut di bawah ini.

4. Membuat Halaman Create #

Create sebagai proses untuk masukkan info/data ke database. Nach dalam langkah ini Anda akan pelajari bagaimanakah cara memakai Create (C) dalam baris code.

Langsung buat file bernama “create.php”. Selanjutnya masukan baris code berikut ini.

ine 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>Tambah Record</h2>
                    </div>
                    <p>Silahkan isi form di bawah ini kemudian submit untuk menambahkan data pegawai ke dalam database.</p>
                    <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
                        <div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
                            <label>Nama</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>Alamat</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>

Baris code di atas akan tampilkan form yang berperan untuk menambah data karyawan ke database. Dalam baris code di atas ada validasi input saat sebelum data diletakkan dalam database.

5. Membuat Halaman Read #

File yang bekerja untuk masukkan data telah ada. Pekerjaan setelah itu membuat file yang bekerja untuk ambil/membaca data dari database dan tampilkannya berbentuk tabel.

Silahkan buat file bernama “read.php” selanjutnya masukan baris code berikut ini ke dalamnya.

Baris code di bawah akan tampilkan info dengan detil masing-masing karyawan bila Anda mengeklik ikon read yang berada di dalam tabel.

<?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>

6. Membuat Halaman Update #

Sesudah membuat Create dan Read, saat ini gantian Anda untuk membikin file Up-date untuk ubah data yang telah diletakkan.

Silahkan buat file “up-date.php” dan tambah baris code berikut ini ke dalamnya. Baris code ini akan arahkan Anda ke halaman yang lain berisi form untuk mengganti info yang telah berada di dalam database.

<?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>

7. Membuat Halaman Delete #

Agar Anda bisa hapus info/data karyawan yang telah masuk ke database, karena itu perlu sebuah peranan untuk menghapusinya.

Silakan buat file bernama “delete.php” selanjutnya masukan baris code berikut ini ke dalamnya. Baris code ini akan hapus data saat Anda click ikon delete yang berada di dalam tabel.

<?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>

8. Membuat Halaman Error #

Kadang ada baris code yang memiliki masalah. Agar Anda tak perlu mengumumkan halaman error pada tiap file, akan lebih bagus bila Anda membuat halaman error sendiri.

Halaman ini akan tampilkan pesan error bila terjadi nalar atau baris code yang memiliki masalah. Anda juga bisa sesuaikan info dalam error ini sesuai keperluan.

<!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>

Membuat CRUD di Halaman CRUD #

Contoh di atas sebagai contoh simpel pemakaian CRUD untuk menambah, mengganti, ambil, dan hapus data dari dan ke database. Pemakaian CRUD masih luas.

Salah satunya yang kerap ditemui ialah saat Anda lakukan login ke halaman web tertentu. Itu sebetulnya ialah contoh kecil dari pemakaian CRUD.

Di bagian ini akan mengulas berkenaan langkah membuat halaman login memakai mekanisme autentifikasi dengan operasi CRUD. Terlihat sederhana, tetapi cukup penting karena terkait dengan keamanan sebuah program situs. Mengapa? Autentifikasi sebagai proses yang dipakai untuk batasi akses dari pemakai yang tidak memiliki hak akses atau tools/feature tertentu.

Sama dengan cara awalnya, Anda harus juga menyiapkan lebih dulu database yang berisi daftar pemakai untuk jalankan proses login. Artikel ini akan memakai PHP dan MySQL sebagai bahasa pemrograman khusus dan database server-nya.

Di bagian pertama Anda akan diperlihatkan langkah membuat form pemakai untuk proses register. Selanjutnya membuat form login di bagian ke-2 dan seperti umumnya, yakni membuat halaman khusus dan script untuk lakukan log out.

1. Membuat Sistem Registrasi #

Sisi ini kelak Anda akan membuat suatu form register komplet dengan database didalamnya. Pemakai segera dapat lakukan register cukup dengan mengisikan form yang telah ada.

Jadi langkah awal yang penting dilaksanakan ialah mempersiapkan database sebagai penyimpanan data pemakai.

Membuat Tabel Database #

Lakukan perintah berikut ini untuk menambah record ke database yang telah dibikin awalnya (di artikel ini misalnya database niagahoster).

Anda dapat sesuaikan jumlah faktor sesuai keperluan. Tetapi saat membuat tabel untuk pemakai, hal yang terpenting ialah menambah faktor id, username, dan sandi. Ke-3 faktor itu nanti jadi pokok di saat membuat form login memakai autentifikasi.

CREATE TABLE users (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Pastikan bahwa tabel users sudah terbuat dengan baik.

2. Membuat File Config #

Sesudah membuat tabel, agar dapat jalankan proses CRUD, cara setelah itu membuat jembatan penyambung di antara PHP dengan MySQL. Anda tinggal membuat script PHP yang bekerja untuk menyambungkan ke database server.

Silakan membuat file “config.php” (atau dapat mengopi dari program sebelumnya), selanjutnya masukan baris code berikut ini

<?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', 'password');
define('DB_NAME', 'niagahoster');

/* 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());
}
?>

Tukar info di atas sesuai penataan di MySQL server Anda. Tukar username, sandi, dan nama database sama seperti yang Anda bikin.

3. Membuat Form Registrasi #

Sesudah data siap dan PHP bisa tersambung dengan MySQL, cara setelah itu membuat penampilan front-end untuk tampilkan hasil operasinya.

Buat file bernama “registrasi.php” selanjutnya tambah baris code berikut ini. Tetapi perlu Anda kenali jika baris code berikut ini meluluskan pemakai untuk membikin account-nya sendiri (tanpa perlu proses klarifikasi).

<?php
// Include config file
require_once "config.php";
 
// Define variables and initialize with empty values
$username = $password = $confirm_password = "";
$username_err = $password_err = $confirm_password_err = "";
 
// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Validate username
    if(empty(trim($_POST["username"]))){
        $username_err = "Please enter a username.";
    } else{
        // Prepare a select statement
        $sql = "SELECT id FROM users WHERE username = ?";
        
        if($stmt = mysqli_prepare($link, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "s", $param_username);
            
            // Set parameters
            $param_username = trim($_POST["username"]);
            
            // Attempt to execute the prepared statement
            if(mysqli_stmt_execute($stmt)){
                /* store result */
                mysqli_stmt_store_result($stmt);
                
                if(mysqli_stmt_num_rows($stmt) == 1){
                    $username_err = "This username is already taken.";
                } else{
                    $username = trim($_POST["username"]);
                }
            } else{
                echo "Oops! Something went wrong. Please try again later.";
            }
        }
         
        // Close statement
        mysqli_stmt_close($stmt);
    }
    
    // Validate password
    if(empty(trim($_POST["password"]))){
        $password_err = "Please enter a password.";     
    } elseif(strlen(trim($_POST["password"])) < 6){
        $password_err = "Password must have atleast 6 characters.";
    } else{
        $password = trim($_POST["password"]);
    }
    
    // Validate confirm password
    if(empty(trim($_POST["confirm_password"]))){
        $confirm_password_err = "Please confirm password.";     
    } else{
        $confirm_password = trim($_POST["confirm_password"]);
        if(empty($password_err) && ($password != $confirm_password)){
            $confirm_password_err = "Password did not match.";
        }
    }
    
    // Check input errors before inserting in database
    if(empty($username_err) && empty($password_err) && empty($confirm_password_err)){
        
        // Prepare an insert statement
        $sql = "INSERT INTO users (username, password) VALUES (?, ?)";
         
        if($stmt = mysqli_prepare($link, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_password);
            
            // Set parameters
            $param_username = $username;
            $param_password = password_hash($password, PASSWORD_DEFAULT); // Creates a password hash
            
            // Attempt to execute the prepared statement
            if(mysqli_stmt_execute($stmt)){
                // Redirect to login page
                header("location: login.php");
            } 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>Sign Up</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
    <style type="text/css">
        body{ font: 14px sans-serif; }
        .wrapper{ width: 350px; padding: 20px; }
    </style>
</head>
<body>
    <div class="wrapper">
        <h2>Sign Up</h2>
        <p>Please fill this form to create an account.</p>
        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
            <div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>">
                <label>Username</label>
                <input type="text" name="username" class="form-control" value="<?php echo $username; ?>">
                <span class="help-block"><?php echo $username_err; ?></span>
            </div>    
            <div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
                <label>Password</label>
                <input type="password" name="password" class="form-control" value="<?php echo $password; ?>">
                <span class="help-block"><?php echo $password_err; ?></span>
            </div>
            <div class="form-group <?php echo (!empty($confirm_password_err)) ? 'has-error' : ''; ?>">
                <label>Confirm Password</label>
                <input type="password" name="confirm_password" class="form-control" value="<?php echo $confirm_password; ?>">
                <span class="help-block"><?php echo $confirm_password_err; ?></span>
            </div>
            <div class="form-group">
                <input type="submit" class="btn btn-primary" value="Submit">
                <input type="reset" class="btn btn-default" value="Reset">
            </div>
            <p>Already have an account? <a href="login.php">Login here</a>.</p>
        </form>
    </div>    
</body>
</html>

Contoh di atas memakai peranan PHP ‘password_hash()’ yang berperan untuk mengganti dari sandi string jadi text hash.

Ini lumayan menarik karena peranan itu menghasilkan sebuah sandi memakai one-way hashing algoritme yang lumayan kuat. Peranan ini lakukan mekanisme acak salt automatically (pengacakan garam) saat lakukan hashing sandi.

Proses hashing yang sudah dilakukan itu memungkinkannya pemakaian satu sandi yang serupa. Tetapi karena ada proses hashing ini, sandi dapat sama, tetapi code hash tetap berlainan.

Disamping itu, baris code di atas akan tampilkan form untuk register sekalian pengujian error. Pemakai yang tidak isi data kosong atau mungkin tidak komplet akan terima pemberitahuan error dan data tidak diletakkan. Error ini bermanfaat saat pemakai ingin membuat username yang telah ada.

Penampilan baris code di atas lebih kurang berikut di bawah ini.

4. Membuat Sistem Login #

Sesudah Anda masukkan data dan membuat file komposisi, cara setelah itu membuat sisi login dan halaman khusus. Nanti dalam form login Anda bisa masukkan username dan sandi sesuai yang telah dibikin di form register.

Saat pemakai lakukan submit (login) karena itu mekanisme akan lewat klarifikasi ke data yang telah diletakkan dalam database. Bila username dan sandi sama sesuai, pemakai bisa dipercayai dan dapat masuk langsung ke mekanisme. Tetapi bila salah karena itu pemakai akan memperoleh info penampikan (rejected).

Berikut beberapa langkah untuk membikin form login dan atribut yang lain.

5. Membuat Form Login #

Pertama, buat lebih dulu file “login.php” dan masukan code berikut ini ke dalamnya.

<?php
// Initialize the session
session_start();
 
// Check if the user is already logged in, if yes then redirect him to welcome page
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){
  header("location: welcome.php");
  exit;
}
 
// Include config file
require_once "config.php";
 
// Define variables and initialize with empty values
$username = $password = "";
$username_err = $password_err = "";
 
// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Check if username is empty
    if(empty(trim($_POST["username"]))){
        $username_err = "Please enter username.";
    } else{
        $username = trim($_POST["username"]);
    }
    
    // Check if password is empty
    if(empty(trim($_POST["password"]))){
        $password_err = "Please enter your password.";
    } else{
        $password = trim($_POST["password"]);
    }
    
    // Validate credentials
    if(empty($username_err) && empty($password_err)){
        // Prepare a select statement
        $sql = "SELECT id, username, password FROM users WHERE username = ?";
        
        if($stmt = mysqli_prepare($link, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "s", $param_username);
            
            // Set parameters
            $param_username = $username;
            
            // Attempt to execute the prepared statement
            if(mysqli_stmt_execute($stmt)){
                // Store result
                mysqli_stmt_store_result($stmt);
                
                // Check if username exists, if yes then verify password
                if(mysqli_stmt_num_rows($stmt) == 1){                    
                    // Bind result variables
                    mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);
                    if(mysqli_stmt_fetch($stmt)){
                        if(password_verify($password, $hashed_password)){
                            // Password is correct, so start a new session
                            session_start();
                            
                            // Store data in session variables
                            $_SESSION["loggedin"] = true;
                            $_SESSION["id"] = $id;
                            $_SESSION["username"] = $username;                            
                            
                            // Redirect user to welcome page
                            header("location: welcome.php");
                        } else{
                            // Display an error message if password is not valid
                            $password_err = "The password you entered was not valid.";
                        }
                    }
                } else{
                    // Display an error message if username doesn't exist
                    $username_err = "No account found with that username.";
                }
            } else{
                echo "Oops! 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>Login</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
    <style type="text/css">
        body{ font: 14px sans-serif; }
        .wrapper{ width: 350px; padding: 20px; }
    </style>
</head>
<body>
    <div class="wrapper">
        <h2>Login</h2>
        <p>Please fill in your credentials to login.</p>
        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
            <div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>">
                <label>Username</label>
                <input type="text" name="username" class="form-control" value="<?php echo $username; ?>">
                <span class="help-block"><?php echo $username_err; ?></span>
            </div>    
            <div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
                <label>Password</label>
                <input type="password" name="password" class="form-control">
                <span class="help-block"><?php echo $password_err; ?></span>
            </div>
            <div class="form-group">
                <input type="submit" class="btn btn-primary" value="Login">
            </div>
            <p>Don't have an account? <a href="register.php">Sign up now</a>.</p>
        </form>
    </div>    
</body>
</html>

Baris code di atas akan ambil input id, username, dan sandi yang ditempatkan pemakai selanjutnya mengonfirmasi ke tabel ‘users’ dalam database.

Bila sandi dan username yang ditempatkan sama sesuai, pemakai langsung akan masuk dan tampilkan halaman (sesi) baru -pada kasus ini kita menggunakan file “welcome.php’'.

Baris code di atas lebih kurang akan tampilkan penampilan semacam ini.

6. Membuat Halaman Utama #

Sesudah form login usai sudah pasti membuat halaman khusus untuk diperlihatkan saat pemakai sukses masuk ke mekanisme.

Nach! Kadang di proses login ada data yang dari sumber yang tidak dipercayai yang berusaha untuk masuk ke mekanisme. Umumnya ini diisikan oleh pemakai anonymous. Ini benar-benar berefek karena kadang memiliki kandungan script yang beresiko misalnya gempuran cross-site scripting (XSS).

Agar Anda terbebas dari XSS, PHP sediakan peranan yang bermanfaat untuk menanggulanginya yakni memakai peranan htmlspecialchars() saat sebelum tampilkan halaman di browser. Peranan ini membuat semua tipe tag HTML yang memiliki kandungan script ‘jahat’ jadi tidak beresiko.

Untuk membikin file ini, silahkan buat file “welcome.php” selanjutnya masukan baris code di bawah.

<?php
// Initialize the session
session_start();
 
// Check if the user is logged in, if not then redirect him to login page
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: login.php");
    exit;
}
?>
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
    <style type="text/css">
        body{ font: 14px sans-serif; text-align: center; }
    </style>
</head>
<body>
    <div class="page-header">
        <h1>Hi, <b><?php echo htmlspecialchars($_SESSION["username"]); ?></b>. Welcome to our site.</h1>
    </div>
    <p>
        <a href="reset-password.php" class="btn btn-warning">Reset Your Password</a>
        <a href="logout.php" class="btn btn-danger">Sign Out of Your Account</a>
    </p>
</body>
</html>

7. Membuat Script Logout #

Agar pemakai bisa beralih dari account satu ke saya yang lain, Anda perlu membuat feature log-out.

Peranan dari file ini ialah tutup halaman (sesi) saat pemakai ini keluar account-nya.

Dalam script ini ada sebuah peranan yang jalan saat pemakai lakukan click pada tombol atau link log-out atau sign-out. Script akan tutup sesi dan lakukan redirect ke halaman login.

Silahkan buat file bernama “log out.php” selanjutnya masukan baris code berikut ini.

<?php
// Initialize the session
session_start();
 
// Unset all of the session variables
$_SESSION = array();
 
// Destroy the session.
session_destroy();
 
// Redirect to login page
header("location: login.php");
exit;
?>

8. Membuat Fitur Reset Password #

Opsional! Anda dapat meneruskan ke sisi ini bila ingin menambah feature reset sandi dalam program.

<?php
// Initialize the session
session_start();
 
// Check if the user is logged in, otherwise redirect to login page
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: login.php");
    exit;
}
 
// Include config file
require_once "config.php";
 
// Define variables and initialize with empty values
$new_password = $confirm_password = "";
$new_password_err = $confirm_password_err = "";
 
// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Validate new password
    if(empty(trim($_POST["new_password"]))){
        $new_password_err = "Please enter the new password.";     
    } elseif(strlen(trim($_POST["new_password"])) < 6){
        $new_password_err = "Password must have atleast 6 characters.";
    } else{
        $new_password = trim($_POST["new_password"]);
    }
    
    // Validate confirm password
    if(empty(trim($_POST["confirm_password"]))){
        $confirm_password_err = "Please confirm the password.";
    } else{
        $confirm_password = trim($_POST["confirm_password"]);
        if(empty($new_password_err) && ($new_password != $confirm_password)){
            $confirm_password_err = "Password did not match.";
        }
    }
        
    // Check input errors before updating the database
    if(empty($new_password_err) && empty($confirm_password_err)){
        // Prepare an update statement
        $sql = "UPDATE users SET password = ? WHERE id = ?";
        
        if($stmt = mysqli_prepare($link, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "si", $param_password, $param_id);
            
            // Set parameters
            $param_password = password_hash($new_password, PASSWORD_DEFAULT);
            $param_id = $_SESSION["id"];
            
            // Attempt to execute the prepared statement
            if(mysqli_stmt_execute($stmt)){
                // Password updated successfully. Destroy the session, and redirect to login page
                session_destroy();
                header("location: login.php");
                exit();
            } else{
                echo "Oops! 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>Reset Password</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
    <style type="text/css">
        body{ font: 14px sans-serif; }
        .wrapper{ width: 350px; padding: 20px; }
    </style>
</head>
<body>
    <div class="wrapper">
        <h2>Reset Password</h2>
        <p>Please fill out this form to reset your password.</p>
        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> 
            <div class="form-group <?php echo (!empty($new_password_err)) ? 'has-error' : ''; ?>">
                <label>New Password</label>
                <input type="password" name="new_password" class="form-control" value="<?php echo $new_password; ?>">
                <span class="help-block"><?php echo $new_password_err; ?></span>
            </div>
            <div class="form-group <?php echo (!empty($confirm_password_err)) ? 'has-error' : ''; ?>">
                <label>Confirm Password</label>
                <input type="password" name="confirm_password" class="form-control">
                <span class="help-block"><?php echo $confirm_password_err; ?></span>
            </div>
            <div class="form-group">
                <input type="submit" class="btn btn-primary" value="Submit">
                <a class="btn btn-link" href="welcome.php">Cancel</a>
            </div>
        </form>
    </div>    
</body>
</html>

Penutup Cara Membuat CRUD Dengan PHP Dan MySQL Untuk Pemula #

Begitu panduan Cara Membuat CRUD Dengan PHP Dan MySQL Untuk Pemula. CRUD (Create, Read, Up-date, Delete) sebagai operasi yang jelas dipakai di pada proses peningkatan program situs, Oleh karena itu, operasi ini harus didalami dan dipahami secara baik. Apa lagi sebuah program situs tak pernah terlepas dari pemakaian database.

PHP dan MySQL sebagai gabungan yang kerap digunakan. Baik bahasa pemrograman PHP atau database server MySQL, ke-2 nya memiliki dokumentasi yang komplet dan tidak termasuk sulit hingga Anda secara mudah bisa pahami ke-2 nya secara cepat.

Anda mungkin memiliki beberapa pertanyaan, silahkan meninggalkan pertanyaan itu lewat kotak kometar berikut ini. Bila Anda menyenangi artikel dari kami atau ingin memperoleh info terkini dari kami, janganlah lupa subscribe. Mudah-mudahan artikel ini berguna.

Baca Juga