Jumat, 21 Juni 2024

Membuat Form Login dengan PHP dan MySQLi

Sebelum masuk ke pembuatan form login, terlebih dahulu kita buat database baru di phpMyAdmin. pastikan kalian sudah meng-instal aplikasi seperti XAMPP atau WAMPP. 
Jika sudah kita lanjut dengan mambuat nama database tes.db dan buat sebuah tabel users. Tabel user ini digunakan untuk menampung data pengguna yang akan login ke sistem, berikut struktur tabel database users.
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL
);

Penjelasan struktur dari tabel user:

  • id: 
    Kolom ini berfungsi sebagai primary key (kunci utama) yang bersifat unik untuk setiap baris di tabel. Nilai id biasanya otomatis berubah meningkat (AUTO_INCREMENT), sehingga setiap kali sebuah baris baru ditambahkan, nilai id akan otomatis berubah meningkat.
  • username:
    Kolom ini digunakan untuk menyimpan nama pengguna. Kolom ini diberi batasan UNIQUE untuk memastikan bahwa tidak ada dua pengguna dengan nama pengguna yang sama.
  • password:
    Kolom ini digunakan untuk menyimpan kata sandi pengguna. Penting untuk menyimpan kata sandi dalam bentuk terenkripsi, dan untuk itu, kita akan menggunakan fungsi password_hash saat menyimpan kata sandi ke dalam database.

Selanjutnya kita buka editor teks untuk membuat file koneksi ke database dengan form login dengan membuat file baru dan beri nama file koneksi.php. Berikut ini script programnya.

<?php$host = "localhost";$user = "root";$pass = "";$dbname = "users"; $conn = mysqli_connect($host, $user, $pass, $dbname); if (!$conn) { die("Koneksi Gagal: " . mysqli_connect_error());}?>

Buat file baru dengan nama file login.php untuk memproses data login dan melakukan verifikasi password:

<?php
include 'koneksi.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);

    // Ambil data user dari database
    $query = "SELECT * FROM users WHERE username = ?";
    $stmt = mysqli_prepare($conn, $query);
    mysqli_stmt_bind_param($stmt, "s", $username);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);

    if (mysqli_num_rows($result) == 1) {
        $row = mysqli_fetch_assoc($result);

        // Verifikasi password
        if (password_verify($password, $row['password'])) {
            // Password cocok, user berhasil login
            echo "Login berhasil!";
        } else {
            // Password tidak cocok
            echo "Login gagal. Cek kembali username dan password.";
        }
    } else {
        // User tidak ditemukan
        echo "Login gagal. Cek kembali username dan password.";
    }

    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}
?>

Penjelasan dari baris kode diatas:

Baris kode $query = "SELECT * FROM users WHERE username = ?";

adalah contoh pernyataan SQL yang digunakan untuk mengambil semua kolom dari tabel users di database di mana nilai kolom username sama dengan nilai yang diikat ke parameter placeholder (?). Ini adalah contoh penggunaan prepared statements untuk mencegah serangan SQL injection.

Baris kode $stmt = mysqli_prepare($conn, $query); 

digunakan untuk mempersiapkan (prepare) pernyataan SQL sebelum eksekusi. Ini adalah bagian dari penggunaan prepared statements untuk mencegah serangan SQL injection. Mari kita bahas lebih detail:

  1. $conn: Ini adalah variabel yang menyimpan koneksi ke database MySQL. Koneksi ini harus dibuat sebelumnya menggunakan mysqli_connect atau fungsi serupa.
  2. $query: Ini adalah variabel yang menyimpan pernyataan SQL yang ingin Anda eksekusi. Pada contoh ini, pernyataan SQL digunakan untuk mencari pengguna berdasarkan nama pengguna (username). Perhatikan bahwa tanda tanya (?) digunakan sebagai placeholder untuk nilai yang akan dimasukkan nanti.
  3. mysqli_prepare($conn, $query): Fungsi mysqli_prepare digunakan untuk mempersiapkan pernyataan SQL. Ini menciptakan objek pernyataan yang bisa digunakan untuk mengeksekusi pernyataan yang sama berulang kali dengan nilai yang berbeda.
  4. $stmt: Variabel $stmt menyimpan objek pernyataan yang telah dipersiapkan. Nama variabel $stmt biasa digunakan sebagai singkatan dari “statement.”

Setelah pernyataan disiapkan, langkah selanjutnya adalah mengikat parameter dan mengeksekusi pernyataan tersebut. Dalam contoh sebelumnya, kita menggunakan mysqli_stmt_bind_param untuk mengikat nilai parameter ke dalam pernyataan, dan kemudian mysqli_stmt_execute untuk mengeksekusi pernyataan tersebut.

Penggunaan prepared statements membantu mencegah serangan SQL injection dengan memisahkan data pengguna dari pernyataan SQL. Oleh karena itu, nilai dari variabel $username pada contoh ini tidak dimasukkan langsung ke dalam pernyataan SQL, melainkan diikat sebagai parameter. Ini meningkatkan keamanan karena nilai dari parameter tersebut tidak dapat memengaruhi struktur sintaks SQL.

Baris kode mysqli_stmt_bind_param($stmt, "s", $username); 

digunakan untuk mengikat (binding) parameter ke dalam pernyataan SQL yang telah dipersiapkan sebelumnya menggunakan prepared statements. Mari kita bahas secara rinci:

      1. mysqli_stmt_bind_param: Ini adalah fungsi yang digunakan untuk mengikat parameter ke dalam pernyataan SQL yang telah dipersiapkan. Fungsi ini membutuhkan tiga parameter: objek pernyataan ($stmt), string format, dan parameter yang akan diikat.
      2. $stmt: Ini adalah objek pernyataan yang telah dipersiapkan sebelumnya menggunakan mysqli_prepare.
      3. "s": Ini adalah string format yang menyatakan jenis data dari setiap parameter. Dalam contoh ini, “s” berarti bahwa parameter yang diikat adalah string. Jenis data lain yang mungkin digunakan termasuk “i” untuk integer, “d” untuk double (float), dan “b” untuk blob (binary data).
      4. $username: Ini adalah parameter yang akan diikat ke dalam pernyataan. Nilai dari parameter ini adalah nilai yang akan dimasukkan ke dalam tempat placeholder (?) pada pernyataan SQL.

Contoh penggunaan ini dalam konteks login adalah untuk mengikat nilai dari variabel $username ke dalam pernyataan SQL sehingga kita dapat mencari pengguna berdasarkan nama pengguna tertentu. Penggunaan placeholder (?) dan binding parameter seperti ini membantu melindungi dari serangan SQL injection, karena nilai pengguna tidak dimasukkan secara langsung ke dalam pernyataan SQL.

Baris kode mysqli_stmt_execute($stmt); 

digunakan untuk mengeksekusi pernyataan SQL yang telah dipersiapkan sebelumnya dengan menggunakan prepared statements. Mari kita jelaskan dengan lebih rinci:

      1. mysqli_stmt_execute: Ini adalah fungsi yang digunakan untuk mengeksekusi pernyataan SQL yang telah dipersiapkan sebelumnya. Fungsi ini membutuhkan satu parameter, yaitu objek pernyataan ($stmt) yang telah dibuat dan dipersiapkan sebelumnya menggunakan mysqli_prepare.
      2. $stmt: Ini adalah objek pernyataan yang berisi pernyataan SQL yang telah dipersiapkan sebelumnya. Perintah SQL akan dieksekusi sesuai dengan nilai yang telah diikat ke dalam pernyataan selama proses persiapan.

Pada contoh di atas, setelah kita mempersiapkan pernyataan SQL dan mengikat parameter ke dalamnya, kita menggunakan mysqli_stmt_execute($stmt); untuk menjalankan pernyataan SQL. Setelah eksekusi, kita dapat melanjutkan untuk mengambil hasilnya, misalnya, dengan menggunakan mysqli_stmt_get_result untuk mengambil hasil data dari sebuah SELECT statement.

Fungsi mysqli_stmt_execute berguna dalam eksekusi pernyataan SQL, terutama ketika menggunakan prepared statements untuk menghindari serangan SQL injection, karena parameter sudah diikat secara aman ke dalam pernyataan SQL.

Baris kode $result = mysqli_stmt_get_result($stmt); 

digunakan untuk mendapatkan hasil dari pernyataan SQL yang telah dijalankan menggunakan prepared statements. Mari kita bahas dengan lebih rinci:

      • mysqli_stmt_get_result: Ini adalah fungsi yang digunakan untuk mendapatkan hasil dari pernyataan SQL yang telah dijalankan menggunakan prepared statements. Fungsi ini membutuhkan satu parameter, yaitu objek pernyataan ($stmt) yang telah dijalankan.
      • $stmt: Ini adalah objek pernyataan yang telah dijalankan sebelumnya menggunakan mysqli_stmt_execute. Fungsi ini hanya dapat digunakan untuk pernyataan SELECT yang mengembalikan hasil (result set).
      • $result: Ini adalah variabel yang menyimpan hasil yang diambil dari pernyataan SQL. Setelah menggunakan mysqli_stmt_get_result, Anda dapat menggunakan variabel $result untuk mengambil baris-baris data dari hasil menggunakan fungsi-fungsi seperti mysqli_fetch_assocmysqli_fetch_array, atau mysqli_fetch_row.

Baris kode $username = mysqli_real_escape_string($conn, $_POST['username']); 

digunakan untuk membersihkan (escape) nilai yang diterima dari input pengguna sebelum digunakan dalam pernyataan SQL. Mari kita bahas lebih rinci:

      • mysqli_real_escape_string: Ini adalah fungsi yang disediakan oleh MySQLi untuk membersihkan nilai dari karakter khusus yang dapat menyebabkan masalah dalam pernyataan SQL, seperti tanda kutip tunggal (') atau tanda kutip ganda (").
      • $conn: Ini adalah koneksi ke database MySQL yang telah dibuat sebelumnya menggunakan mysqli_connect atau fungsi serupa.
      • $_POST['username']: Ini adalah nilai yang diterima dari input pengguna melalui metode POST. Nilai ini biasanya berasal dari formulir HTML.
      • $username: Setelah melalui fungsi mysqli_real_escape_string, nilai dari $_POST['username'] yang bersih dari karakter khusus disimpan dalam variabel $username.

Pentingnya menggunakan mysqli_real_escape_string adalah untuk mencegah serangan SQL injection. Serangan SQL injection dapat terjadi ketika nilai dari input pengguna tidak diolah dengan benar sebelum dimasukkan ke dalam pernyataan SQL. Dengan menggunakan mysqli_real_escape_string, karakter khusus yang dapat menyebabkan kerentanan terhadap serangan SQL injection dapat dihindari.

Baris kode $hashed_password = password_hash($password, PASSWORD_DEFAULT); 

digunakan untuk menghasilkan hash (enkripsi) dari sebuah kata sandi. Mari kita jelaskan setiap bagian dari baris kode tersebut:

      • password_hash: Ini adalah fungsi PHP yang digunakan untuk menghasilkan hash dari sebuah kata sandi. Fungsi ini menggunakan algoritma hashing yang aman dan memerlukan dua parameter: kata sandi yang akan di-hash dan opsi hash.
      • $password: Ini adalah kata sandi yang akan di-hash. Biasanya, nilai ini diterima dari input pengguna, misalnya, dari formulir login atau formulir registrasi.
      • PASSWORD_DEFAULT: Ini adalah konstanta yang menentukan algoritma hashing yang akan digunakan. Pada saat penulisan, PASSWORD_DEFAULT mengacu pada algoritma hashing yang paling disarankan oleh PHP, tetapi algoritma ini dapat berubah seiring waktu seiring diperkenalkannya versi PHP yang lebih baru.
      • $hashed_password: Setelah fungsi password_hash dieksekusi, nilai hash yang dihasilkan disimpan dalam variabel $hashed_password. Nilai ini yang kemudian disimpan di dalam database untuk memverifikasi kata sandi pada proses login.