Cara membuat form daftar login dan logout dengan php mysql

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

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
0.

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

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
0.

Jadi user akan login dengan menggunakan

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
2 dan
INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
3 yang ada di dalam table
INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
0.

Jika sudah membuat table

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
0, 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

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
6 dan password
INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
6 untuk kita gunakan nanti.

Buat File koneksi.php

File

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
8 akan berfungsi untuk menyiapkan semua config yang berhubungan dengan koneksi ke database.

Isinya:

 connect_errno) {
              echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
              exit();
            }
            

Penjelasan:

  1. Kita buat variable
    INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
                VALUES
                	(1, 'admin', 'admin', 'Super Admin', NULL);
                
    9,
     connect_errno) {
                  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
                  exit();
                }
                
    0,
     connect_errno) {
                  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
                  exit();
                }
                
    1 dan
     connect_errno) {
                  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
                  exit();
                }
                
    2. Sesuaikan dengan konfigurasi lokal database server kamu ya.
  2. Kita akan membuat instance
     connect_errno) {
                  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
                  exit();
                }
                
    3 yang merupakan instance dari
     connect_errno) {
                  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
                  exit();
                }
                
    4
  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

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
0 di dalam database login.

Bagaimana caranya? Buka file

 connect_errno) {
              echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
              exit();
            }
            
7.

Pertama, include file

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
8 setelah
 connect_errno) {
              echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
              exit();
            }
            
9. Selanjutnya cek kode dibawah ini.

 $_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
     $_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");
                }
                ?>
                
    0. Artinya kita akan select 1 user dari table users dengan username dan password dari request form sebelumnya.
  2.  $_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");
                }
                ?>
                
    1 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

 $_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");
            }
            ?>
            
2. PHP sudah menyediakan fungsi
 $_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");
            }
            ?>
            
3 yang merupakan wrapper dari fungsi
 $_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");
            }
            ?>
            
2 untuk meng-enkripsi password kamu dan juga fungsi
 $_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");
            }
            ?>
            
5 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

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
6, maka tidak bisa berhasil login karena password sudah dihash.

Selanjutnya kita perlu mengubah file

 connect_errno) {
              echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
              exit();
            }
            
7.

Implementasi Password Hash

Buka kembali file

 connect_errno) {
              echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
              exit();
            }
            
7.

Kita akan menyesuaikan beberapa kode baru agar password bisa dicek sesuai dengan hasil hash.

Update file

 connect_errno) {
              echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
              exit();
            }
            
7 dengan kode dibawah ini.

 $_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. 
                echo password_hash('admin',PASSWORD_DEFAULT);
                //return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
                
    0 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
     $_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");
                }
                ?>
                
    5.

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.


            

Mengupdate Kapan Terakhir Login

Di table

INSERT INTO `users` (`id`, `username`, `password`, `nama`, `terakhir_login`)
            VALUES
            	(1, 'admin', 'admin', 'Super Admin', NULL);
            
0 kita memiliki field

            echo password_hash('admin',PASSWORD_DEFAULT);
            //return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
            
3 yang berfungsi untuk mengetahui kapan terakhir user tersebut login.

Untuk mengupdate


            echo password_hash('admin',PASSWORD_DEFAULT);
            //return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
            
3 kita perlu mengupdate kodenya sedikit.

Buka lagi file


            echo password_hash('admin',PASSWORD_DEFAULT);
            //return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
            
5 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


            echo password_hash('admin',PASSWORD_DEFAULT);
            //return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
            
3 akan terupdate valuenya sesuai dengan date dan time saat user login.

Selanjutnya kita hanya perlu menampilan kapan terakhir login di file


            echo password_hash('admin',PASSWORD_DEFAULT);
            //return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
            
7 dengan variable

            echo password_hash('admin',PASSWORD_DEFAULT);
            //return $2y$10$Xo6Wcl9yb5g/HfW4S0uMde.CpntrnIYQeuUcMDU.cvWDH46cseMem
            
8.