PHP: Cookie & Session
Cookie là gì?
Cookie thường được sử dụng để nhận diện người dùng. Cookie là một tệp nhỏ mà máy chủ nhúng vào máy tính của người dùng. Mỗi khi cùng một máy tính yêu cầu một trang có trình duyệt, nó cũng sẽ gửi cookie. Với PHP, bạn có thể vừa tạo và lấy các giá trị cookie.
Tạo cookie trong PHP
Để tạo một cookie ta dùng hàm setcookie().
Cú pháp:
setcookie(name, value, expire, path, domain, secure, httponly);
Lưu ý là chỉ tham số name là bắt buộc. Tất cả các tham số khác đều là tùy chọn.
Tạo/Lấy Cookie
Ví dụ sau tạo một cookie có tên "user" với giá trị "Long". Cookie sẽ hết hạn sau 30 ngày (86400 * 30). "/" Có nghĩa là cookie có sẵn trong toàn bộ website (nếu không, hãy chọn thư mục bạn muốn thiết lập).
Sau đó, chúng ta truy xuất giá trị của cookie "user" (sử dụng biến global $ _COOKIE). Chúng ta cũng sử dụng hàm isset()
để kiểm ta xem cookie có được thiết lập hay không:
<!DOCTYPE html> <?php $cookie_name = "user"; $cookie_value = "Long"; setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day ?> <html> <body> <?php if(!isset($_COOKIE[$cookie_name])) { echo "Cookie tên '" . $cookie_name . "' không được thiết lập!"; } else { echo "Cookie tên'" . $cookie_name . "' đã được thiết lập!<br>"; echo "Value is: " . $_COOKIE[$cookie_name]; } ?> <p><strong>Lưu ý:</strong> Bạn có thể tải lại trang web để thấy giá trị của cookie.</p> </body> </html>
Lưu ý: Hàm
setcookie()
phải đặt TRƯỚ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 được (để ngăn chặn mã hóa URL, hãy sử dụng hàm setrawcookie()
).
Sửa đổi giá trị cookie
Để sửa đổi cookie, chỉ cần đặt (lại) cookie cũng bằng hàm setcookie()
:
<!DOCTYPE html> <?php $cookie_name = "user"; $cookie_value = "Minh"; setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); ?> <html> <body> <?php if(!isset($_COOKIE[$cookie_name])) { echo "Cookie tên '" . $cookie_name . "' không được thiết lập!"; } else { echo "Cookie tên '" . $cookie_name . "' đã được thiết lập!<br>"; echo "Giá trị là: " . $_COOKIE[$cookie_name]; } ?> <p><strong>Lưu ý:</strong> Bạn có thể rload lại trang web để thấy được giá trị cookie mới.</p> </body> </html>
Xóa cookie
Để xóa cookie, ta cũng sử dụng hàm setcookie()
có ngày hết hạn trong quá khứ:
<!DOCTYPE html> <?php // thiết lập ngày hết hạn là 1 tiếng trươc thời điểm hiện tại setcookie("user", "", time() - 3600); ?> <html> <body> <?php echo "Cookie 'user' đã được xóa."; ?> </body> </html>
Kiểm tra xem Cookie đã được bật chưa
Ví dụ sau tạo một tập lệnh nhỏ để kiểm tra xem cookie có được bật hay không. Trước tiên, hãy thử tạo cookie thử nghiệm với hàm setcookie()
, sau đó đếm biến mảng $ _COOKIE:
<!DOCTYPE html> <?php setcookie("test_cookie", "test", time() + 3600, '/'); ?> <html> <body> <?php if(count($_COOKIE) > 0) { echo "Các cookie đã được bật."; } else { echo "Các cokie chưa được bật."; } ?> </body> </html>
Session là một cách để lưu trữ thông tin (trong các biến) được sử dụng trên nhiều trang.
Không giống như cookie nơi thông tin không được lưu trữ trên máy tính của người dùng.
SESSION PHP là gì?
Khi bạn làm việc với một ứng dụng, bạn mở nó, thực hiện một số thay đổi và sau đó bạn đóng nó. Điều này giống như một phiên. 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 có một vấn đề: máy chủ web không biết bạn là ai hoặc bạn làm gì, vì địa chỉ HTTP không duy trì trạng thái.
Các biến session 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 (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.
Vì thế, các biến session giữ thông tin về một người dùng duy nhất và có sẵn cho tất cả các trang trong một ứng dụng.
Mẹo: Nếu bạn cần một bộ nhớ lâu dài, bạn có thể muốn lưu trữ dữ liệu trong cơ sở dữ liệu.
Bắt đầu một phiên PHP
Một phiên được bắt đầu với hàm session_start()
.
Các biến session được thiết lập bằng biến toàn cục PHP: $ _SESSION
.
Bây giờ, hãy tạo một trang mới có tên "demo_session1.php". Trong trang này, chúng ta bắt đầu một phiên PHP mới và đặt một số biến session:
<?php // Bắt đầu phiên session_start(); ?> <!DOCTYPE html> <html> <body> <?php // Thiết lập các biến session $_SESSION["favcolor"] = "green"; $_SESSION["favanimal"] = "cat"; echo "Các biến session đã được thiết lập."; ?> </body> </html>
Lưu ý: Hàm
session_start()
phải nằm ở dòng đầu tiên trong tài liệu của bạn và nằm trước bất kỳ thẻ HTML nào.
Nhận giá trị biến session PHP
Tiếp theo, chúng ta tạo một trang khác có tên "demo_session2.php". Từ trang này, chúng ta sẽ truy cập thông tin session mà chúng ta đã thiết lập ở trang đầu tiên ("demo_session1.php").
Lưu ý rằng các biến session không được chuyển riêng lẻ đến từng trang mới, thay vào đó chúng được truy xuất từ phiên mà chúng ta mở ở đầu mỗi trang ( session_start()
).
Cũng lưu ý rằng tất cả các giá trị của biến session được lưu trữ trong biến mảng global $ _SESSION:
<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // In ra các biến session đã được thiết lập ở trang trước: echo "Màu yêu thích là " . $_SESSION["favcolor"] . ".<br>"; echo "Con vật yêu thích là " . $_SESSION["favanimal"] . "."; ?> </body> </html>
Một cách khác để hiển thị tất cả các giá trị biến session cho phiên người dùng là chạy đoạn mã sau:
<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php print_r($_SESSION); ?> </body> </html>
Lưu ý cách thức hoạt động của phiên:
Hầu hết các phiên đặt khóa người dùng trên máy tính của người dùng trông giống như sau: 765487cf34ert8dede5a562e4f3a7e12. Sau đó, khi một phiên được mở 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 đó, nếu không, nó sẽ bắt đầu một phiên mới.
Sửa đổi một biến session PHP
Để thay đổi một biến session, chỉ cần ghi đè lên đó:
<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // để thay đổi giá trị biến session, đơn giản là gán cho nó một giá trị khác $_SESSION["favcolor"] = "yellow"; print_r($_SESSION); ?> </body> </html>
Hủy một phiên PHP
Để xóa tất cả các biến session global và hủy phiên, hãy sử dụng session_unset()
và session_destroy()
:
<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // Xóa tất cả các biến session session_unset(); // Hủy phiên session_destroy(); echo "Tất cả các biến session bây giờ đã bị xóa, và phiên cũng bị hủy." ?> </body> </html>