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.

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:

  1. Kita buat variable $database, $host, $user dan $password. Sesuaikan dengan konfigurasi lokal database server kamu ya.
  2. Kita akan membuat instance $mysqli yang merupakan instance dari mysqli
  3. 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:

  1. 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.
  2. $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.
  3. 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:

  1. $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.
  2. 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:

Demo Terakhir Login
Update Terakhir Login di Table User

Penutup

Itulah cara membuat login dan logout dengan PHP dan MySQL. Semoga artikel ini bermanfaat ya. Jika ada pertanyaan dan kesulitan bisa tinggalkan komentar. Saya akan pastikan secepatnya membantu teman-teman.

Source code tutorial ini bisa didownload disini: https://github.com/yusidabcs/login-php-mysql

Next tutorialnya adalah kita akan membuat halaman register. Untuk tutorial selanjutnya bisa dicek disini:Membuat Halaman register dengan PHP dan MySQl. Jadi user bisa register dan menambah data user di database. Kemudian bisa login kedalam sistem dengan user yang baru tersebut.