Ngu ngơ học làm web (89) - Cookie

Tiếp theo của: Ngu ngơ học làm web (88) - Bài tập về session
-----

Phần 89.       Cookie


Đây là clip số 104:


- Cookie được sử dụng để lưu trữ dữ liệu người dùng trên máy client.

- Mỗi trình duyệt trên máy client có một vùng nhớ cookie riêng, vì vậy nếu dùng hai trình duyệt truy cập vào cùng một website thì sẽ có hai cookie khác nhau.

Để tạo cookie, sử dụng hàm:

setcookie($name, $value, $time)

- $name: tên cookie

- $value: giá trị gán cho $name

- $time: thời gian tồn tại của cookie $name

Ví dụ,

<?php
  setcookie('myCookie','my test', time() + 60); //thời gian tồn tại là 1 phút
?>

Sau khi chạy đoạn mã trên, vào xem giá trị của cookie vừa lưu, trong trình duyệt chrome:

- Mở menu ở góc trên, bên phải của trình duyệt

- Vào mục Settings, bấm tiếp vào mục Advanced ở cuối màn hình

- Trong mục Privacy and security, chọn mục Content settings, chọn tiếp mục Cookies

- Chọn mục See all cookies and site data, các cookie sẽ được sắp xếp tăng theo tên của trang web. Có thể xóa tất cả cookie bằng nút REMOVE ALL, sau đó chạy lại đoạn mã PHP, để tìm cookie dễ hơn.

Để truy cập cookie, sử dụng biến $_COOKIE

Ví dụ,

setcookie('myCookie','my test', time() + 60); //thời gian tồn tại là 1 phút
  echo '<pre>';
  print_r($_COOKIE);
  echo '</pre>';

Hoặc,

  setcookie('myCookie','my test', time() + 60); //thời gian tồn tại là 1 phút
  echo '<pre>';
  print_r($_COOKIE['myCookie']);
  echo '</pre>';

Để xóa cookie, sử dụng một trong hai hàm sau:

- setcookie($name), với $name là tên cookie muốn xóa

- setcookie($name, $value, $time), với $time thuộc về quá khứ

Ví dụ,

setcookie('myCookie','my test', time() + 20);
  setcookie('myCookie');
  echo '<pre>';
  print_r($_COOKIE);
  echo '</pre>';

Ví dụ,

setcookie('myCookie','my test', time() + 20);
  setcookie('myCookie', 'abc', time() - 1);
  echo '<pre>';
  print_r($_COOKIE);
  echo '</pre>';

Bài tập: khi truy cập vào trang web, hãy xuất thời gian đăng nhập của lần gần đây nhất. Đây là đoạn mã,

  echo 'Xin chào!' . '<br>';
 
  if (isset($_COOKIE['lastLogin'])) {
    $time = $_COOKIE['lastLogin'];
    echo 'last login: ' . date('d/m/Y H:i:s', $time);
    setcookie('lastLogin',time());
  } else {
    setcookie('lastLogin',time(), time() + 3600);
  }

Bài tập:

- 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 cookie 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
    if (isset($_COOKIE['fullname'])) {
      echo '<h3> Xin chào: ' . $_COOKIE['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;
  }

  if (isset($_COOKIE['fullname'])) {
    echo '<h3> Xin chào: ' . $_COOKIE['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]) {
          setcookie('fullname', $userInfo[2], time() + 200);
          echo '<h3> Xin chào: ' . $userInfo[2] . '</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
  setcookie('fullname');
  header('location:index.php');
?>

[users.ini]

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

So sánh session và cookie:


Session
Cookie
Lưu dữ liệu tại server
Lưu dữ liệu tại client
Bị xóa khi người dùng đóng trình duyệt
Bị xóa khi hết thời gian tồn tại
Bảo mật hơn do lưu trên server
Dễ bị chỉnh sửa, do tồn tại trên máy của người dùng

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