[PHP] System logowania

Dzisiaj napiszemy sobie skrypt logowania do wcze艣niejszej stworzonego skryptu rejestracji u偶ytkownik贸w. Skrypt b臋dzie sk艂ada艂 si臋 z trzech plik贸w login.php, logged.php oraz logout.php. Rozbudujemy tak偶e wcze艣niej napisan膮 klas臋 User o nowe metody.

Formularz logowania

Standardowo na pocz膮tku tworzymy formularz. Wystarczy tylko skopiowa膰 go z artyku艂u o systemie rejestracji i usun膮膰 pola 'Powt贸rz has艂o' i 'E-mail' .

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" type="text/css" media="screen" />
  
  <title>Logowanie</title>
 </head>
 <body>
  <div class="container">
   <h1>Zaloguj si臋</h1>
   <form action="" method="post">
    <div class="form-group">
     <p><label for="username">Nazwa u偶ytkownika</label><input type="text" name="username" id="username" class="form-control" placeholder="Nazwa u偶ytkownika" required /></p>
    </div>
    <div class="form-group">
     <p><label for="password">Has艂o</label><input type="password" name="password" id="password" class="form-control" placeholder="Has艂o" required /></p>
    </div>
    <p><input type="submit" class="btn btn-primary" value="Zaloguj" /></p>
   </form>
  </div>
 </body>
</html>

Skrypt logowania

Teraz stworzymy skrypt login.php odpowiadaj膮cy za zalogowanie u偶ytkownika:

<?php

 ini_set('display_errors', '1');
 
 error_reporting(E_ALL);
 
 if(!isset($_POST['username'])):
 
?>

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" type="text/css" media="screen" />
  
  <title>Logowanie</title>
 </head>
 <body>
  <div class="container">
   <h1>Zaloguj si臋</h1>
   <form action="" method="post">
    <div class="form-group">
     <p><label for="username">Nazwa u偶ytkownika</label><input type="text" name="username" id="username" class="form-control" placeholder="Nazwa u偶ytkownika" required /></p>
    </div>
    <div class="form-group">
     <p><label for="password">Has艂o</label><input type="password" name="password" id="password" class="form-control" placeholder="Has艂o" required /></p>
    </div>
    <p><input type="submit" class="btn btn-primary" value="Zaloguj" /></p>
   </form>
  </div>
 </body>
</html>

<?php else: ?>

<?php

 if(!empty($_POST['username']) && !empty($_POST['password'])) {
 
  if(strlen($_POST['username']) >= 3) {
  
   if(strlen($_POST['username']) <= 30) {
   
    if(strlen($_POST['password']) >= 6) {
    
     if(strlen($_POST['password']) <= 16) {
     
      require 'set-db-connection.php';
      require 'class.user.php';
      
      $username = preg_replace('/[^\p{L}\p{N}]/iu', '', $_POST['username']);
      
      $user = new User($dbh);
      
      if($user->login($username, $_POST['password'])) {
      
       session_start();
       
       $_SESSION['logged'] = 1;
       $_SESSION['username'] = $username;
       
       header('Location: logged.php');
       
       exit;
       
      }
      
      else {
      
       echo '<p>B艂臋dne dane logowania.</p>';
       
      }
      
     }
     
     else {
     
      echo '<p>Has艂o jest zbyt d艂ugie.</p>';
      
     }
     
    }
    
    else {
    
     echo '<p>Has艂o jest zbyt kr贸tkie.</p>';
     
    }
    
   }
   
   else {
   
    echo '<p>Nazwa u偶ytkownika jest zbyt d艂uga.</p>';
    
   }
   
  }
  
  else {
  
   echo '<p>Nazwa u偶ytkownika jest zbyt kr贸tka.</p>';
   
  }
  
 }
 
 else {
 
  echo '<p>Wype艂nij wszystkie pola, aby si臋 zalogowa膰.</p>';
  
 }
 
?>

<?php endif; ?>

Klasa User

Dodamy teraz do utworzonej w poprzednim artykule klasy User now膮 metod臋 - login.

<?php

 class User {
 
  function __construct($dbh) {
  
   $this->dbh = $dbh;
   
  }
  
  public function login($username, $password) {
  
   $sth = $this->dbh->prepare('SELECT password FROM users WHERE username = :username LIMIT 1');
   
   $sth->bindParam(':username', $username, PDO::PARAM_STR);
   
   $sth->execute();
   
   $row = $sth->fetch(PDO::FETCH_ASSOC);
   
   if($row && password_verify($password, $row['password']) === true) {
   
    return true;
    
   }
   
   else return false;
   
  }
  
  public function user_exist($username, $email) {
  
   $sth = $this->dbh->prepare('SELECT id FROM users WHERE username = :username OR email = :email LIMIT 1');
   
   $sth->bindParam(':username', $username, PDO::PARAM_STR);
   $sth->bindParam(':email', $email, PDO::PARAM_STR);
   
   $sth->execute();
   
   return $sth->fetch(PDO::FETCH_ASSOC);
   
  }
  
  public function insert_user($username, $email, $password, $ip) {
  
   $sth = $this->dbh->prepare("INSERT INTO users (id, registered_timestamp, username, email, password, ip) VALUES('', CURRENT_TIMESTAMP(), :username, :email, :password, :ip)");
   
   $sth->bindParam(':username', $username, PDO::PARAM_STR);
   $sth->bindParam(':email', $email, PDO::PARAM_STR);
   $sth->bindParam(':password', $password, PDO::PARAM_STR);
   $sth->bindParam(':ip', $ip, PDO::PARAM_STR);
   
   return $sth->execute();
   
  }
  
 }

Plik logged.php

Plik logged.php to strona, na kt贸r膮 u偶ytkownik zostanie przekierowany po poprawnym zalogowaniu. Na stronie tej b臋dzie informacja o zalogowaniu oraz link do strony logout.php

<?php

 session_start();
 
 if(!isset($_SESSION['logged'])) {
 
  header('Location: login.php');
  
  exit;
  
 }
 
?>

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  
  <title>Zalogowany</title>
  
 </head>
 <body>
  <div>
  <?php
  
  if(isset($_SESSION['logged'])):
  
  ?>
  
  <p>Jeste艣 zalogowany jako <strong><?= $_SESSION['username']; ?></strong>.</p>
  <p><a href="logout.php">Wyloguj si臋</a></p>
  
  <?php endif; ?>
  </div>
 </body>
</html>

Plik logout.php

Jeszcze tylko plik wylogowywuj膮cy i to wszystko. W pliku tym usuwamy zmienne sesyjne, kt贸re utworzyli艣my podczas zalogowania oraz niszczymy aktualn膮 sesje funkcj膮 session_destroy.

<?php

 session_start();
 
 unset($_SESSION['logged']);
 unset($_SESSION['username']);
 
 session_destroy();
 
 header('Location: login.php');
 
 exit;

Aktualna wersja skryptu dost臋pna jest tak偶e na GitHub.

Komentarze

Prze艣lij komentarz

Dzi臋ki za komentarz!

Popular

[C++] Jak obliczy膰 pole i obw贸d trapezu?

[HTML] Jak wy艣rodkowa膰 tekst?

[PHP|HTML] Od艣wie偶enie strony