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
idbiasanya otomatis berubah meningkat (AUTO_INCREMENT), sehingga setiap kali sebuah baris baru ditambahkan, nilaiidakan otomatis berubah meningkat.username:Kolom ini digunakan untuk menyimpan nama pengguna. Kolom ini diberi batasan
UNIQUEuntuk 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_hashsaat 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 tabelusersdi database di mana nilai kolomusernamesama 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:
$conn: Ini adalah variabel yang menyimpan koneksi ke database MySQL. Koneksi ini harus dibuat sebelumnya menggunakanmysqli_connectatau fungsi serupa.$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.mysqli_prepare($conn, $query): Fungsimysqli_preparedigunakan untuk mempersiapkan pernyataan SQL. Ini menciptakan objek pernyataan yang bisa digunakan untuk mengeksekusi pernyataan yang sama berulang kali dengan nilai yang berbeda.$stmt: Variabel$stmtmenyimpan objek pernyataan yang telah dipersiapkan. Nama variabel$stmtbiasa 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:
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.$stmt: Ini adalah objek pernyataan yang telah dipersiapkan sebelumnya menggunakanmysqli_prepare."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).$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:
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 menggunakanmysqli_prepare.$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 menggunakanmysqli_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 menggunakanmysqli_stmt_get_result, Anda dapat menggunakan variabel$resultuntuk mengambil baris-baris data dari hasil menggunakan fungsi-fungsi sepertimysqli_fetch_assoc,mysqli_fetch_array, ataumysqli_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 menggunakanmysqli_connectatau 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 fungsimysqli_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_DEFAULTmengacu 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 fungsipassword_hashdieksekusi, nilai hash yang dihasilkan disimpan dalam variabel$hashed_password. Nilai ini yang kemudian disimpan di dalam database untuk memverifikasi kata sandi pada proses login.





