Membuat sistem registrasi dan login dengan PHP dan MySQL

4
Membuat sistem registrasi dan login dengan PHP dan MySQL

Sistem login adalah fitur penting untuk setiap situs yang memiliki keanggotaan. ImplementasiĀ sistem registrasi dan login sangat mudah dengan PHP. Dalam tutorial ini, saya akan menunjukkan cara untuk membuat sistem login sederhana dengan PHP dan MySQL.

Script PHP ini akan memperlihatkan sistem registrasi user/pengguna dan login dengan MySQL dan PHP Session. PHP server side validation juga digunakan pada login dan registrasi untuk memvalidasi data pengguna.

Sebelumnya lihat dulu file apa saja yang digunakan dan menggunakannya dalam Sistem Login PHP.

  • user.php – menangani database
  • akunuser.php – menangani permintaan pendaftaran, login, dan logout dengan Class User
  • index.php – menampilkan form login dan atau rincian pengguna
  • daftar.php – menampilkan form registrasi
  • style.css – mengatur tampilan form

Membuat table pada database

Sebuah tabel diperlukan untuk menyimpan rincian pengguna dalam database. Script SQL berikut ini untuk membuat tabel user dengan beberapa kolom yang diperlukan.

CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nama_awal` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 `nama_akhir` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
 `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `telp` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
 `dibuat` datetime NOT NULL,
 `diubah` datetime NOT NULL,
 `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Class User (user.php)

Class User ini untuk menangani dabase yang berkaitan, berisi 3 metode: __construct(), getRows(), dan insert(). __construct() adalah fungsi yang digunakan untuk menghubungkan database, GetRows() adalah fungsi yang digunakan untuk mengambil data pengguna dari database, dan insert() adalah fungsi untuk memasukkan rincian pengguna ke database. Dalam file ini, kamu perlu mengubah nilai variabel $dbHost, $dbUsername, $dbPassword, $dbname dengan kredensial database MySQL kamu.

<?php
/*
 * Class User
 * Class ini digunakan untuk database yang terkait dengan operation (fetch, dan insert)
 */
class User{
    private $dbHost     = 'localhost';
    private $dbUsername = 'root';
    private $dbPassword = '';
    private $dbName     = 'codingan';
    private $userTbl    = 'user';
    
    public function __construct(){
        if(!isset($this->db)){
            // menghubungkan ke databse
            $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
            if($conn->connect_error){
                die("Gagal terhubung dengan MySQL: " . $conn->connect_error);
            }else{
                $this->db = $conn;
            }
        }
    }
    
    //Mengembalikan row dari database berdasarkan Kondisi
    public function getRows($kondisi = array()){
        $sql = 'SELECT ';
        $sql .= array_key_exists("select",$kondisi)?$kondisi['select']:'*';
        $sql .= ' FROM '.$this->userTbl;
        if(array_key_exists("where",$kondisi)){
            $sql .= ' WHERE ';
            $i = 0;
            foreach($kondisi['where'] as $key => $value){
                $pre = ($i > 0)?' AND ':'';
                $sql .= $pre.$key." = '".$value."'";
                $i++;
            }
        }
        
        if(array_key_exists("order_by",$kondisi)){
            $sql .= ' ORDER BY '.$kondisi['order_by']; 
        }
        
        if(array_key_exists("start",$kondisi) && array_key_exists("limit",$kondisi)){
            $sql .= ' LIMIT '.$kondisi['start'].','.$kondisi['limit']; 
        }elseif(!array_key_exists("start",$kondisi) && array_key_exists("limit",$kondisi)){
            $sql .= ' LIMIT '.$kondisi['limit']; 
        }
        
        $hasil = $this->db->query($sql);
        
        if(array_key_exists("return_type",$kondisi) && $kondisi['return_type'] != 'all'){
            switch($kondisi['return_type']){
                case 'count':
                    $data = $hasil->num_rows;
                    break;
                case 'single':
                    $data = $hasil->fetch_assoc();
                    break;
                default:
                    $data = '';
            }
        }else{
            if($hasil->num_rows > 0){
                while($row = $hasil->fetch_assoc()){
                    $data[] = $row;
                }
            }
        }
        return !empty($data)?$data:false;
    }
    
    //Memasukan data ke dalamn database
    public function insert($data){
        if(!empty($data) && is_array($data)){
            $kolom = '';
            $Value  = '';
            $i = 0;
            if(!array_key_exists('dibuat',$data)){
                $data['dibuat'] = date("Y-m-d H:i:s");
            }
            if(!array_key_exists('diubah',$data)){
                $data['diubah'] = date("Y-m-d H:i:s");
            }
            foreach($data as $key=>$val){
                $pre = ($i > 0)?', ':'';
                $kolom .= $pre.$key;
                $Value  .= $pre."'".$val."'";
                $i++;
            }
            $kueri = "INSERT INTO ".$this->userTbl." (".$kolom.") VALUES (".$Value.")";
            $insert = $this->db->query($kueri);
            return $insert?$this->db->insert_id:false;
        }else{
            return false;
        }
    }

}

akunuser.php

File ini mengontrol permintaan pendaftaran, login, dan logout yang berasal dari index.php dan daftar.php. Class User digunakan untuk mendapatkan dan memasukkan rincian pengguna ke table user. Juga, PHP Session digunakan untuk mempertahankan status login pengguna.

<?php
//memulai Session
session_start();
//memuat dan menginisialisasi class User
include 'user.php';
$user = new User();
if(isset($_POST['daftarSubmit'])){
 //memeriksa apakah rincian user kosong
    if(!empty($_POST['nama_awal']) && !empty($_POST['nama_akhir']) && !empty($_POST['email']) && !empty($_POST['telp']) && !empty($_POST['password']) && !empty($_POST['confirm_password'])){
  //membandingkan password and konfirmasi password
        if($_POST['password'] !== $_POST['confirm_password']){
            $sesiData['status']['type'] = 'error';
            $sesiData['status']['msg'] = 'Konfirmasi password harus sama dengan password.'; 
        }else{
   //memeriksa apakah user sudah ada di dalam database
            $kondSblmnya['where'] = array('email'=>$_POST['email']);
            $kondSblmnya['return_type'] = 'count';
            $userSblmnya = $user->getRows($kondSblmnya);
            if($userSblmnya > 0){
                $sesiData['status']['type'] = 'error';
                $sesiData['status']['msg'] = 'Email sudah ada, silakan gunakan email yang lain.';
            }else{
    //memasukkan data user dalam database
                $userData = array(
                    'nama_awal' => $_POST['nama_awal'],
                    'nama_akhir' => $_POST['nama_akhir'],
                    'email' => $_POST['email'],
                    'password' => md5($_POST['password']),
                    'telp' => $_POST['telp']
                );
                $insert = $user->insert($userData);
    //Status ditetapkan berdasarkan data yang dimasukkan
                if($insert){
                    $sesiData['status']['type'] = 'sukses';
                    $sesiData['status']['msg'] = 'Anda telah berhasil didaftarkan.';
                }else{
                    $sesiData['status']['type'] = 'error';
                    $sesiData['status']['msg'] = 'Terjadi masalah, silahkan coba lagi.';
                }
            }
        }
    }else{
        $sesiData['status']['type'] = 'error';
        $sesiData['status']['msg'] = 'Isi semua bidang.'; 
    }
 //menyimpan status pendaftaran ke dalam Session
    $_SESSION['sesiData'] = $sesiData;
    $redirectURL = ($sesiData['status']['type'] == 'sukses')?'index.php':'daftar.php';
 //mengalihkan ke halaman index/pendaftaran
    header("Location:".$redirectURL);
}elseif(isset($_POST['loginSubmit'])){
    //memeriksa apakah login yang diinput kosong
    if(!empty($_POST['email']) && !empty($_POST['password'])){
  //mendapatkan data user dari class user
        $kondisi['where'] = array(
            'email' => $_POST['email'],
            'password' => md5($_POST['password']),
            'status' => '1'
        );
        $kondisi['return_type'] = 'single';
        $userData = $user->getRows($kondisi);
  //Menetapkan data dan status user berdasarkan login
        if($userData){
            $sesiData['userLoggedIn'] = TRUE;
            $sesiData['userID'] = $userData['id'];
            $sesiData['status']['type'] = 'sukses';
            $sesiData['status']['msg'] = 'Selamat Datang '.$userData['nama_awal'].'!';
        }else{
            $sesiData['status']['type'] = 'error';
            $sesiData['status']['msg'] = 'Email atau password salah, silahkan coba lagi.'; 
        }
    }else{
        $sesiData['status']['type'] = 'error';
        $sesiData['status']['msg'] = 'Masukkan email and password.'; 
    }
 //menyimpan status login ke dalam Session
    $_SESSION['sesiData'] = $sesiData;
 //mengalihkan ke halaman home
    header("Location:index.php");
}elseif(!empty($_REQUEST['logoutSubmit'])){
 //menghapus data Session
    unset($_SESSION['sesiData']);
    session_destroy();
 //menyimpan Status logout ke dalam Session
    $sesiData['status']['type'] = 'sukses';
    $sesiData['status']['msg'] = 'Anda telah berhasil logout dari akun Anda.';
    $_SESSION['sesiData'] = $sesiData;
 //mengalihkan ke halaman home
    header("Location:index.php");
}else{
 //mengalihkan ke halaman home
    header("Location:index.php");
}

Form Login dan rincian akun pengguna (index.php)

Pertama file index.php ini berisi form login dan link halaman pendaftaran. Setelah login, user ID tersedia dalam session dan rincian masing-masing pengguna akan ditampilkan menggunakan Class User. Dan, link logout akan muncul jika pengguna sudah login.

<?php
session_start();
$sesiData = !empty($_SESSION['sesiData'])?$_SESSION['sesiData']:'';
if(!empty($sesiData['status']['msg'])){
    $statusPsn = $sesiData['status']['msg'];
    $jenisStatusPsn = $sesiData['status']['type'];
    unset($_SESSION['sesiData']['status']);
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>Sistem registrasi dan login dengan PHP dan MySQL</title>
    <link rel="stylesheet" href="style.css" type="text/css" media="all" />
</head>
<body>
    <h1>Sistem registrasi dan login dengan PHP dan MySQL - Codingan.com</h1>
 <div class="container">
        <?php
   if(!empty($sesiData['userLoggedIn']) && !empty($sesiData['userID'])){
    include 'user.php';
    $user = new User();
    $kondisi['where'] = array(
     'id' => $sesiData['userID'],
    );
    $kondisi['return_type'] = 'single';
    $userData = $user->getRows($kondisi);
  ?>
        <h2>Selamat Datang <?php echo $userData['nama_awal']; ?>!</h2>
        <a href="akunuser.php?logoutSubmit=1" class="logout">Logout</a>
  <div class="regisForm">
   <p><b>Nama: </b><?php echo $userData['nama_awal'].' '.$userData['nama_akhir']; ?></p>
            <p><b>Email: </b><?php echo $userData['email']; ?></p>
            <p><b>Telp: </b><?php echo $userData['telp']; ?></p>
  </div>
        <?php }else{ ?>
  <h3>Login ke akun Anda</h3>
        <?php echo !empty($statusPsn)?'<p class="'.$jenisStatusPsn.'">'.$statusPsn.'</p>':''; ?>
  <div class="regisForm">
   <form action="akunuser.php" method="post">
    <input type="email" name="email" placeholder="Email" required="">
    <input type="password" name="password" placeholder="Pssword" required="">
    <div class="tbl-kirim">
     <input type="submit" name="loginSubmit" value="Login">
    </div>
   </form>
  </div>
        
 </div>
 <p><a href="daftar.php">Buat Akun</a></p>
 <?php } ?>
</body>
</html>

Form Pendaftaran (daftar.php)

File ini berisi form pendaftaran HTML dan form dikirimkan ke file akunuser.php dengan permintaan pendaftaran.

<?php
session_start();
$sesiData = !empty($_SESSION['sesiData'])?$_SESSION['sesiData']:'';
if(!empty($sesiData['status']['msg'])){
    $statusPsn = $sesiData['status']['msg'];
    $jenisStatusPsn = $sesiData['status']['type'];
    unset($_SESSION['sesiData']['status']);
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>Sistem registrasi dan login dengan PHP dan MySQL</title>
    <link rel="stylesheet" href="style.css" type="text/css" media="all" />
</head>
<body>
    <h1>Sistem registrasi dan login dengan PHP dan MySQL - Codingan.com</h1>
    <h3>Buat akun baru</h3>
 <div class="container">
  <?php echo !empty($statusPsn)?'<p class="'.$jenisStatusPsn.'">'.$statusPsn.'</p>':''; ?>
  <div class="regisForm">
   <form action="akunuser.php" method="post">
    <input type="text" name="nama_awal" placeholder="Nama Awal" required="">
    <input type="text" name="nama_akhir" placeholder="Nama Akhir" required="">
    <input type="email" name="email" placeholder="Email" required="">
    <input type="text" name="telp" placeholder="Nomor Telp" required="">
    <input type="password" name="password" placeholder="Password" required="">
    <input type="password" name="confirm_password" placeholder="Konfirmasi Password" required="">
    <div class="tbl-kirim">
     <input type="submit" name="daftarSubmit" value="Buat Akun">
    </div>
   </form>
  </div>
 </div>
</body>
</html>

Kode CSS

CSS berikut ini digunakan untuk memperindah tampilan form.

.container {
    width: 40%;
    margin: 0 auto;
    background-color: #f7f7f7;
    color: #757575;
    font-family: 'Open Sans', sans-serif;
    text-align: left;
    padding: 30px;
    border-radius: 3px;
    -moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
    -webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
    box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
    margin-bottom: 50px;
}
h3 {
    font-weight: 400;
    margin-bottom: 10px;
}
.container p {
    font-size: 14px;
    font-weight: 300;
    margin-bottom: 20px;
}
.regisForm input[type="text"], .regisForm input[type="email"], .regisForm input[type="password"] {
    width: 100%;
    padding: 10px;
    margin: 10px 0;
    border: 1px solid #d9d9d9;
    border-top: 1px solid #c0c0c0;
    font-weight: 400;
    font-family: 'Open Sans', sans-serif;
    display: block;
    margin-bottom: 10px;
    z-index: 1;
    position: relative;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}
.tbl-kirim {
    text-align: center;
    margin-top: 20px;
}
.tbl-kirim input[type="submit"] {
    padding: 10px 0;
    width: 60%;
    font-family: 'Open Sans', sans-serif;
    font-size: 15px;
    font-weight: 600;
    border: none;
    outline: none;
    color: #FFF;
    background-color: #2196F3;
    cursor: pointer;
    border-radius: 3px;
}
.tbl-kirim input[type="submit"]:hover {
    background-color: #1769aa;
}
a.logout{float: right;}
p.sukses{color: #34A853;}
p.error{color: #EA4335;}

Kesimpulan

Saya harap tutorial langkah demi langkah dan contoh script tersebut berguna. Menggunakan script tersebut, kamuĀ  akan dapat mengintegrasikan sistem login dengan PHP dan MySQL dalam waktu yang singkat. Dan juga, kamu dapat mengembangkan Class User tsb untuk membangun sebuah sistem otentikasi pengguna danĀ sistem manajemen pengguna yang canggih.

BAGIKAN
Subscribe
Beritahu
guest

4 Comments
terlama
terbaru vote teratas
Inline Feedbacks
View all comments
Tompul
Tompul
Februari 6, 2018 13:34

terimaksih mas,sangat memmbantu, ditunggu tutorial selanjutnya. tetap berkarya

eko randa
Juni 30, 2018 14:59

thanks gan, sangat membantu…

Fransiskus
Fransiskus
Oktober 25, 2018 23:06

Tutor kasih crud gan

Dani
Dani
Juni 29, 2019 06:45

Mas punyaku terjadi masalah error, silahkan coba lagi saat melakukan registrasi, itu kenapa ya?