Ngu ngơ học làm web (88) - Bài tập về session

Tiếp theo của: Ngu ngơ học làm web (87) - Session
-----

Phần 88.       Bài tập về session


Đây là clip số 102:


Lưu lại thông tin đăng nhập của người dùng vào session trong một khoảng thời gian, ví dụ 20 giây. Trong khoảng thời gian 20 giây này, người dùng có thể thực hiện mọi thao tác. Khi hết thời gian 20 giây, thông tin đăng nhập của người dùng trong session sẽ bị xóa.

Tạo giao diện,

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container">
    <h3 class="text-center">Login</h3>
    <div class="row">
      <div class="col-md-4 col-md-offset-4">
       <form action="process.php" method="post">
        <div class="form-group">
          <label for="username">Username</label>
          <input type="text" id="username" name="username"class="form-control">
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input type="password" id="password" name="password" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary">Đăng nhập</button>
      </form>
    </div>
  </div>
</div>
</body>
</html>

Tập tin users.txt sẽ chứa tên đăng nhập, mật khẩu và tên đầy đủ của người dùng. Mã hóa mật khẩu bằng MD5, ví dụ vào trang http://www.md5.cz/, nhập mật khẩu để có được chuỗi mã hóa.

Sử dụng hàm header() để điều hướng trang web, ví dụ:

if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';

  } else {
    header('location:index.php');
  }

[users.txt]

teo|c4ca4238a0b923820dcc509a6f75849b|Nguyen Van Teo
ti|c81e728d9d4c2f636f067f89cc14862c|Tran Van Ti

Nếu đăng nhập đúng tên người dùng trong tập tin users.txt, thì xuất ra thông tin của người dùng đó ra màn hình.

[process.php]

<?php
  // kiểm tra dữ liệu khác rỗng
  function checkEmpty($value) {
    $flag = false;
    if (!isset($value) || trim($value) == '') {
      $flag = true;
    }
    return $flag;
  }

  if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $data = file('users.txt');
    foreach ($data as $value) {
      $user = explode('|', $value);
        if ($user[0] == $username) {
          echo '<pre>';
          print_r($user);
          echo '</pre>';
          break;
        }
    }
  } else {
    header('location:index.php');
  }
?>

Cách làm trên không tối ưu về tốc độ xử lý.

Viết lại bằng giải pháp khác.

Đổi tập tin users.txt thành users.ini.

[users.ini]

teo = "teo|c4ca4238a0b923820dcc509a6f75849b|Nguyen Van Teo"
ti = "ti|c81e728d9d4c2f636f067f89cc14862c|Tran Van Ti"

[process.php]

<?php
  // kiểm tra dữ liệu khác rỗng
  function checkEmpty($value) {
    $flag = false;
    if (!isset($value) || trim($value) == '') {
      $flag = true;
    }
    return $flag;
  }

  if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $data = parse_ini_file('users.ini');
    if (array_key_exists($username, $data)) {
      echo $userInfo = $data[$username];
    }
  } else {
    header('location:index.php');
  }
?>

Đây là clip số 103:


Kiểm tra thông tin đăng nhập của người dùng, nếu khớp với thông tin người dùng trong tập tin users.ini thì tạo session lưu lại thông tin đăng nhập.

Sau khi người dùng đăng nhập thành công, duy trì việc đăng nhập này trong 20 giây, quá thời gian này, tự động đăng xuất người dùng.

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container">
     <?php
     session_start();
     if (isset($_SESSION['flagPermission'])) {
      if (time() - 20 > $_SESSION['timeout']) {
        session_unset();
        header('location:index.php');
      } else {
        echo '<h3> Xin chào: ' . $_SESSION['fullname'] . '</h3>';
        echo '<a href="logout.php">Đăng xuất</a>';
      }
    } else {
      ?>
    <h3 class="text-center">Login</h3>
    <div class="row">
      <div class="col-md-4 col-md-offset-4">
       <form action="process.php" method="post">
        <div class="form-group">
          <label for="username">Username</label>
          <input type="text" id="username" name="username"class="form-control">
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input type="password" id="password" name="password" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary">Đăng nhập</button>
      </form>
    </div>
  </div>
  <?php
      }
  ?>
</div>
</body>
</html>

[process.php]

<h3 class="text-center">process</h3>
<?php
  // kiểm tra dữ liệu khác rỗng
  function checkEmpty($value) {
    $flag = false;
    if (!isset($value) || trim($value) == '') {
      $flag = true;
    }
    return $flag;
  }

  session_start();
  if (isset($_SESSION['flagPermission'])) {
    if (time() - 20 > $_SESSION['timeout']) {
      session_unset();
      header('location:index.php');
    } else {
      echo '<h3> Xin chào: ' . $_SESSION['fullname'] . '</h3>';
      echo '<a href="logout.php">Đăng xuất</a>';
    }
  } else {
    if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
      $username = $_POST['username'];
      $password = md5($_POST['password']);
      $data = parse_ini_file('users.ini');
      if (array_key_exists($username, $data)) {
        $userInfo = explode ('|', $data[$username]);
        if ($username == $userInfo[0] && $password == $userInfo[1]) {
          $_SESSION['fullname'] = $userInfo[2];
          $_SESSION['flagPermission'] = true;
          $_SESSION['timeout'] = time();
          echo '<h3> Xin chào: ' . $_SESSION['fullname'] . '</h3>';
          echo '<a href="logout.php">Đăng xuất</a>';
        } else {
          header('location:index.php');
        }
      }else {
        header('location:index.php');
      }
    } else {
    // die('test');
      header('location:index.php');
    }
  }
?>

[logout.php]

<?php
  session_start();
  session_unset();
  header('location:index.php');

?>
-----------
Cập nhật [8/1/2018]
-----------
Xem thêm: