Jika sebelumnya kita sudah membuat tutorial login dan logout sederhana dengan PHP, kita akan melanjutkan tutorial tersebut tapi dengan implementasi MySQL.
Kode yang akan kita pakai adalah lanjutan dari tutorial sebelumnya, jadi ada baiknya kalian cek dulu artikel sebelumnya ya.
Daftar Isi
Tutorial login dengan PHP dan MySQL kali ini rencananya adalah kita akan menyimpan data user di database. Ketika login, sistem akan mengecek apakah username dan password sesuai dengan data yang dimasukkan user.
Update Kita akan menambahkan cara bagaimana mengetahui kapan user tersebut terakhir login ke dalam database.
1. Siapkan Database User
Pertama kita buat sebuah database dengan nama login
atau sesuai dengan keinginan kalian.
Buat table users
.
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`nama` varchar(255) DEFAULT NULL,
`terakhir_login` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Copy kode diatas dan running untuk membuat table users
.
Jadi user akan login dengan menggunakan username
dan password
yang ada di dalam table users
.
Jika sudah membuat table users
, tambahkan beberapa dummy data untuk kita testing nanti.
INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
VALUES
(1, 'admin', 'admin', 'Super Admin', NULL);
Oke kita sudah punya username admin
dan password admin
untuk kita gunakan nanti.
Buat File koneksi.php
File koneksi.php
akan berfungsi untuk menyiapkan semua config yang berhubungan dengan koneksi ke database.
Isinya:
<?php
$database = "login";
$host = "localhost";
$user = "root"; // ganti dengan username database km
$password = "root"; // ganti dengan password database km
$mysqli = new mysqli($host,$user,$password,$database);
// Check connection
if ($mysqli -> connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
exit();
}
Penjelasan:
- Kita buat variable
$database
,$host
,$user
dan$password
. Sesuaikan dengan konfigurasi lokal database server kamu ya. - Kita akan membuat instance
$mysqli
yang merupakan instance darimysqli
- Jika tidak berhasil terhubung dengan database, maka akan muncul pesan errror.
Update File Process.php
Jika pada artikel cara membuat login dan logout sederhana dengan php, kita membuat list user dalam bentuk array secara manual. Sekarang kita akan mengecek apakah user tersebut ada di dalam table users
di dalam database login
.
Bagaimana caranya? Buka file process.php
.
Pertama, include file koneksi.php
setelah session_start();
. Selanjutnya cek kode dibawah ini.
<?php
session_start();
include "koneksi.php";
//dapatkan data user dari form
$user = [
'username' => $_POST['username'],
'password' => $_POST['password'],
];
//check apakah user tersebut ada di table users
$query = "select * from users where username = ? and password = ? limit 1";
$stmt = $mysqli->stmt_init();
$stmt->prepare($query);
$stmt->bind_param('ss', $user['username'], $user['password']);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_array(MYSQLI_NUM);
if($row != null){
$_SESSION['login'] = true;
$_SESSION['username'] = $user['username'];
$_SESSION['message'] = 'Berhasil login ke dalam sistem.';
header("Location: index.php");
}else{
$_SESSION['error'] = 'Username dan password anda tidak ditemukan.';
header("Location: login.php");
}
?>
Kita akan belajar memakai prepared statement di MySQL ya. Jadi ini adalah salah satu best practice untuk mencegah sql injection. Mungkin nanti kita akan bahas 1 artikel tentang sql injection ini ya.
Penjelasan:
- Kita siapkan dulu querynya ya
"select * from users where username = ? and password = ? limit 1"
. Artinya kita akan select 1 user dari table users dengan username dan password dari request form sebelumnya. $row = $result->fetch_array(MYSQLI_NUM);
Kita akan cek, jika row nilainya null maka username dan password tidak ditemukan. Jika tidak null maka username dan password ditemukan.- Jika berhasil login, maka kita set session login nilainya true.Kemudian redirect ke halaman index.
Mengamankan Password Dengan Hash
Sebelumnya password yang disimpan di database berupa plain text. Jadi password itu sangat mudah untuk dibaca.
Salah satu cara meningkatkan keamanan adalah dengan menyimpan password dalam bentuk hash jadi tidak mudah untuk dibaca.
Ada beberapa cara untuk melakukan hash password. Cara yang paling simple adalah dengan menggunakan md5. Tapi md5 tidak direkomendasikan untuk hash password karena dapat dengan mudah untuk dipecahkan lagi.
Oleh karena itu, kita akan menggunakan fungsi crypt()
. PHP sudah menyediakan fungsi password_hash()
yang merupakan wrapper dari fungsi crypt()
untuk meng-enkripsi password kamu dan juga fungsi password_verify()
untuk mengecek apakah plain password cocok dengan hasil enkripsi.
Update Password
Kita generate dulu hash dari password admin.
echo password_hash('admin',PASSWORD_DEFAULT);
//return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
Setelah kita mendapatkan hasil hashnya, kita update dahulu user admin di database ya.
Kamu bisa hapus user admin dari database, dan insert data baru berikut ini.
INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
VALUES
(1, 'admin', '$2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem', 'Super Admin', NULL);
Jika data sudah terupdate, jika kita login lagi sekarang dengan username dan password admin
, maka tidak bisa berhasil login karena password sudah dihash.
Selanjutnya kita perlu mengubah file process.php
.
Implementasi Password Hash
Buka kembali file process.php
.
Kita akan menyesuaikan beberapa kode baru agar password bisa dicek sesuai dengan hasil hash.
Update file process.php
dengan kode dibawah ini.
<?php
session_start();
include "koneksi.php";
//dapatkan data user dari form
$user = [
'username' => $_POST['username'],
'password' => $_POST['password'],
];
//check apakah user dengan username tersebut ada di table users
$query = "select * from users where username = ? limit 1";
$stmt = $mysqli->stmt_init();
$stmt->prepare($query);
$stmt->bind_param('s', $user['username']);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_array(MYSQLI_ASSOC);
if($row != null){
//username ditemukan
//kita cek apakah password dengan hash password sesuai.
if(password_verify($user['password'], $row['password'])){
$_SESSION['login'] = true;
$_SESSION['username'] = $user['username'];
$_SESSION['nama'] = $user['nama'];
$_SESSION['message'] = 'Berhasil login ke dalam sistem.';
header("Location: index.php");
}else{
$_SESSION['error'] = 'Password anda salah.';
header("Location: login.php");
}
}else{
$_SESSION['error'] = 'Username dan password anda tidak ditemukan.';
header("Location: login.php");
}
?>
Penjelasan:
$query = "select * from users where username = ? limit 1";
Kita hanya cek apakah ada data dengan username yang diinput di database. Jika ya maka akan direturn saat query di execute.- Jika data ditemukan, kita akan cek apakah password dari database sesuai dengan password yang di input dengan fungsi
password_verify()
.
Flow seperti ini cukup bagus karena kita bisa mengecek apakah usernamenya yang salah atau usernamenya sudah benar tapi passwordnya yang masih salah.
Jadi bisa memberikan informasi yang lebih detail kepada user.
Membuat Logout
Untuk proses logout, masih sama seperti sebelumnya. Kita hanya perlu menghapus session login, sehingga user ter-logout dari sistem.
<?php
session_start();
//logout
//hapus semua session
session_unset();
//tampilkan sukses logout
$_SESSION['logout'] = 'Berhasil logout.';
header("Location: login.php");
?>
Mengupdate Kapan Terakhir Login
Di table users
kita memiliki field terakhir_login
yang berfungsi untuk mengetahui kapan terakhir user tersebut login.
Untuk mengupdate terakhir_login
kita perlu mengupdate kodenya sedikit.
Buka lagi file proses.php
dan update di bagian setelah berhasil login.
if(password_verify($user['password'], $row['password'])){
$_SESSION['login'] = true;
$_SESSION['username'] = $row['username'];
$_SESSION['nama'] = $row['nama'];
$_SESSION['terakhir_login'] = date('Y-m-d H:i:s');
$_SESSION['message'] = 'Berhasil login ke dalam sistem.';
//update last login di database
//check apakah user dengan username tersebut ada di table users
$query = "update users set terakhir_login = now() where username = ?";
$stmt->prepare($query);
$stmt->bind_param('s', $user['username']);
$stmt->execute();
$stmt->close();
header("Location: index.php");
}else{
$_SESSION['error'] = 'Password anda salah.';
header("Location: login.php");
}
Jika user berhasil login maka field terakhir_login
akan terupdate valuenya sesuai dengan date dan time saat user login.
Selanjutnya kita hanya perlu menampilan kapan terakhir login di file index.php
dengan variable $_SESSION['terakhir_login']
.
Demonya: