cookie và session trong php

Cookie là gì?


Cookie là một công nghệ máy tính thường được sử dụng để xác định người dùng. Cookie là một file nhỏ mà máy chủ (server) tạo ra để nhận dạng và lưu đoạn cookie vào máy tính của người dùng (máy client) thông qua việc người dùng truy cập vào một website có sử dụng cookie. Và khi người dùng truy cập trở lại một website đó thông qua trình duyệt web, thì máy tính người dùng đó cũng sẽ gửi lại cookie nhận dạng đó tới máy chủ server. Với PHP, chúng ta có thể vừa tạo và lấy các giá trị cookie dễ dàng.

Khởi tạo Cookie bằng PHP


Để khởi tạo cookie bằng PHP, chúng ta sử dụng hàm setcookie()

Cú pháp

setcookie(name, value, expire, path, domain, secure, httponly);

Trong đó, tham số name là bắt buột, các tham số còn lại là tùy chọn (không bắt buột)

Ví dụ:

<?php
$cookie_name = "bookcode";
$cookie_value = "website học lập trình web";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
?>
<html>
<body>

<?php
if(!isset($_COOKIE[$cookie_name])) {
  echo "Cookie name '".$cookie_name."' chưa được thiết lập!";
} else {
  echo "Cookie name: '".$cookie_name."' đã được tạo!<br>";
  echo "Cookie value: ".$_COOKIE[$cookie_name];
}
?>

</body>
</html>

Xem kết quả

Trong lần chạy đầu tiên, do cookie chưa được khởi tạo từ trước, nên bạn sẽ thấy thông báo như sau:

Cookie name: bookcode chưa được thiết lập!

Đừng lo lắngsmiley, bây giờ chúng ta reload lại trang thì sẽ thấy kết quả như sau:

Cookie name: 'bookcode' đã được tạo!
Cookie value: website học lập trình web

Ví dụ trên tạo một cookie có tên "bookcode" với giá trị "website học lập trình web". Cookie sẽ hết hạn sau 30 ngày (86400 * 30) kể từ thời điểm thiết lập.

Tham số path "/" Có nghĩa là cookie có giá trị trong toàn bộ trang web (nếu không thiết lập tham số này, thì cookie chỉ có giá trị tại trang khởi tạo bằng hàm setcookie()).

Để truy xuất giá trị cookie của người dùng, chúng ta sử dụng biến siêu toàn cục $_COOKIE. Trước khi gọi tới biến siêu toàn cục để truy suất giá trị của cookie, chúng ta phải kiểm tra sự tồn tại của cookie bằng hàm isset(). Nếu chúng ta bỏ qua bước kiểm tra này, code sẽ bị lỗi và không thể truy xuất được.

Hàm setcookie() phải được gọi trước khi trình duyệt tải các thẻ <html>

Giá trị của cookie được tự động mã hóa URL khi gửi cookie và tự động được giải mã khi nhận. (nếu không muốn mã hóa URL, hãy sử dụng hàm setrawcookie() thay thế).

Nếu bạn muốn kiểm tra xem trình duyệt lưu cookie ở đâu, bạn làm theo các bước sau:

Bạn click chuột phải vào màn hình trình duyệt web, chọn Inpect, sau đó chọn mục Application/ Cookies. Tất cả các cookie của các website tạo ra đều được trình duyệt lưu tại đây.

cookie

Thay đổi giá trị cookie


Để thay đổi giá trị cookie ban đầu, chúng ta chỉ cần thiết lập lại cookie bằng hàm setcookie()

Ví dụ

<?php
$cookie_name = "bookcode";
$cookie_value = "website học php, mysql";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
?>
<html>
<body>

<?php
if(!isset($_COOKIE[$cookie_name])) {
  echo "Cookie name '".$cookie_name."' chưa được thiết lập!";
} else {
  echo "Cookie name: '".$cookie_name."' đã được tạo!<br>";
  echo "Cookie value: ".$_COOKIE[$cookie_name];
}
?>

</body>
</html>

Xem kết quả

Cookie name: 'bookcode' đã được tạo!
Cookie value: website học php, mysql

Xóa cookie


Để xóa cookie, chúng ta vẫn sẽ sử dụng hàm setcookie(), với tham số thời gian expire được thiết lập một thời điểm trong quá khứ

Ví dụ

<?php
// set thời gian hết hạn là 1 giờ trước đó
setcookie("bookcode", "", time() -3600);
?>
<html>
<body>

<?php
echo "Cookie 'bookcode' đã được xóa.";
?>

</body>
</html>

Xem kết quả

Cookie 'bookcode' đã được xóa.

Session là gì?


Tương tự như cookie, session cũng thường được sử dụng để lưu trữ thông tin người dùng, tuy nhiên session chỉ có tác dụng trong một phiên làm việc, nghĩa là khi người dùng tắt trình duyệt, thì thông tin lưu trữ người dùng trong phiên làm việc đó cũng sẽ tự động được xóa.

Session không lưu trữ thông tin trên máy tính người dùng.

Khi chúng ta truy cập vào một ứng dụng trên máy tính, chúng ta mở nó, thực hiện một số thao tác và sau đó chúng ta đóng ứng dụng đó. Đây gọi là một phiên làm việc. Máy tính biết bạn là ai. Nó biết khi nào bạn bắt đầu ứng dụng và khi nào bạn kết thúc. Nhưng trên internet thì khác: máy chủ website không biết bạn là ai hoặc bạn làm gì.

Các biến session sẽ giải quyết vấn đề này bằng cách lưu trữ thông tin người dùng để sử dụng trên nhiều trang liên kết trong website (ví dụ: tên người dùng, màu yêu thích, v.v.). Theo mặc định, các biến session kéo dài cho đến khi người dùng đóng trình duyệt web.

Chính vì thế, các biến session lưu giữ thông tin về một người dùng duy nhất và sử dụng cho tất cả các trang liên kết khác trong một ứng dụng website.

Khởi tạo session trong PHP


Để khởi tạo session, chúng ta sử dụng hàm session_start().

Thông tin về các biến session được tạo ra sẽ được lưu trữ trong biến siêu toàn cục $_SESSION

Bây giờ, chúng ta tạo một trang  "demo_session1.php". Trong trang này, chúng ta khởi tạo một phiên làm việc session mới và gán giá trị cho biến.

Ví dụ

<?php
// Start the session
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// Thiết lập giá trị biến session
$_SESSION["color"] = "green";
$_SESSION["animal"] = "cat";
echo "Biến session đã được khởi tạo.";
?>

</body>
</html>

Xem kết quả

Biến session đã được khởi tạo.

Hàm session_start() phải được gọi trước khi trình duyệt tải các thẻ <html>

Truy xuất giá trị biến session


Tiếp theo, chúng ta tạo một trang khác "demo_session2.php". Từ trang này, chúng ta sẽ truy xuất thông tin session mà chúng ta đã thiết lập ở trên trang trước ("demo_session1.php").

Lưu ý rằng các biến session không được tự động gọi từ trang này tới trang khác, mà thay vào đó chúng được truy xuất từ ​​phiên mà chúng ta khởi tạo ở đầu mỗi trang bằng hàm session_start().

Cũng lưu ý rằng tất cả các giá trị của biến session đều được lưu trữ trong biến siêu toàn cục là $_SESSION.

Ví dụ

<?php
// Start new session
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
// Truy xuất giá trị biến session đã thiết lập ở trang trước
echo "Màu sắc của tôi là: ".$_SESSION["color"].".<br>";
echo "Thú cưng của tôi là: ".$_SESSION["animal"].".";
?>

</body>
</html>

Xem kết quả

Màu sắc của tôi là: green.
Thú cưng của tôi là: cat.

Để hiển thị tất cả các giá trị được lưu trong biến siêu toàn cục $_SESSION, chúng ta sử dụng hàm print_r()

Ví dụ

<?php
// Start new session
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
print_r($_SESSION);
?>

</body>
</html>

Xem kết quả

Array ( [color] => green [animal] => cat )

Session hoạt động như thế nào? làm sao session biết tôi là ai?

Hầu hết các session đặt khóa người dùng trên máy tính của người dùng dạng như: 765487cf34ert8dede5a562e4f3a7e12. Sau đó, khi một session được tạo trên một trang khác, nó sẽ quét máy tính để tìm khóa người dùng. Nếu có một kết quả phù hợp, nó sẽ truy cập vào phiên session đó, nếu không, nó sẽ bắt đầu một phiên mới.

Thay đổi giá trị một biến session


Để thay đổi giá trị một biến session, chúng ta chỉ cần ghi đè lên nó

Ví dụ

<?php
// Start new session
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
$_SESSION['color'] = 'yellow';
print_r($_SESSION);
?>

</body>
</html>

Xem kết quả

Array ([color] => yellow [animal] => cat)

Xóa session


Để xóa tất cả các giá trị các biến session được lưu trữ trong biên siêu toàn cục $_SESSION, chúng ta dùng hàm session_unset().

Để hủy một phiên session đang làm việc, chúng ta sử dụng hàm session_destroy().

Ví dụ

<?php
// Start new session
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
// Xóa tất cả các biến và giá trị biến session
session_unset();

// Hủy phiên làm việc session
session_destroy();
echo "Tất cả các biến session hiện đã bị xóa và phiên session bị hủy.";
?>

</body>
</html>

Xem kết quả