tek4

Session và Cookie trong PHP

by - September. 21, 2021
Kiến thức
Học
<p>Session v&agrave; Cookie trong PHP l&agrave; hai kh&aacute;i niệm quan trọng trong lập tr&igrave;nh. Trong b&agrave;i viết n&agrave;y, ta sẽ c&ugrave;ng t&igrave;m hiểu về kh&aacute;i niệm n&agrave;y c&ugrave;ng với v&iacute; dụ dẫn chứng.</p> <h1>Session trong PHP</h1> <p>Session hay phi&ecirc;n l&agrave; một c&aacute;ch để lưu trữ th&ocirc;ng tin (trong c&aacute;c biến) được sử dụng cho nhiều trang web. Kh&ocirc;ng giống như cookie, th&ocirc;ng tin kh&ocirc;ng được lưu trữ tr&ecirc;n m&aacute;y t&iacute;nh của người d&ugrave;ng.</p> <p>Khi l&agrave;m việc với một ứng dụng, ta sẽ thực hiện mở n&oacute;, thực hiện một số thay đổi v&agrave; sau đ&oacute; đ&oacute;ng ứng dụng. Qua tr&igrave;nh thực hiện n&agrave;y giống như một phi&ecirc;n. M&aacute;y t&iacute;nh biết ta l&agrave; ai. N&oacute; biết khi n&agrave;o ta bắt đầu thao t&aacute;c với ứng dụng v&agrave; khi n&agrave;o kết th&uacute;c. Nhưng tr&ecirc;n Internet c&oacute; một vấn đề, m&aacute;y chủ web kh&ocirc;ng biết ta l&agrave; ai hoặc l&agrave;m g&igrave;, v&igrave; địa chỉ HTTP kh&ocirc;ng duy tr&igrave; trạng th&aacute;i. C&aacute;c biến trong phi&ecirc;n giải quyết cho vấn đề n&agrave;y bằng c&aacute;ch lưu trữ th&ocirc;ng tin của người d&ugrave;ng để sử dụng cho nhiều trang (v&iacute; dụ: t&ecirc;n người d&ugrave;ng, thời gian truy cập). Theo mặc định, c&aacute;c biến của phi&ecirc;n k&eacute;o d&agrave;i cho đến khi người d&ugrave;ng đ&oacute;ng tr&igrave;nh duyệt. V&igrave; thế, c&aacute;c biến của phi&ecirc;n chứa th&ocirc;ng tin về một người d&ugrave;ng v&agrave; c&oacute; sẵn cho tất cả c&aacute;c trang trong một ứng dụng đ&oacute;.</p> <h2>Bắt đầu một phi&ecirc;n trong PHP</h2> <p>Một phi&ecirc;n được bắt đầu bằng h&agrave;m session_start(). C&aacute;c biến phi&ecirc;n được đặt bằng biến to&agrave;n cục PHP: $ _SESSION. B&acirc;y giờ, ta sẽ tạo một trang mới c&oacute; t&ecirc;n "test.php". Trong trang n&agrave;y, ch&uacute;ng ta sẽ bắt đầu một phi&ecirc;n mới v&agrave; đặt gi&aacute; trị cho một số biến trong phi&ecirc;n.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php session_start(); ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;?php $_SESSION["Ten_nguoi_dung"] = "Nguyen A"; echo "Session start"; ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p><strong><span style="background-color: #ffff00;">Ch&uacute; &yacute;: H&agrave;m session_start() phải l&agrave; h&agrave;m đầu ti&ecirc;n trong file. Trước bất kỳ thẻ HTML n&agrave;o.</span></strong></p> <h2>Lấy c&aacute;c gi&aacute; trị của biến trong phi&ecirc;n</h2> <p>Tiếp theo, ch&uacute;ng ta tạo một trang kh&aacute;c c&oacute; t&ecirc;n test2.php. Từ trang n&agrave;y, ch&uacute;ng ta sẽ truy cập th&ocirc;ng tin của phi&ecirc;n m&agrave; ch&uacute;ng ta đ&atilde; thiết lập trong trang đầu ti&ecirc;n l&agrave; test.php. Lưu &yacute; rằng c&aacute;c biến của phi&ecirc;n kh&ocirc;ng được chuyển ri&ecirc;ng lẻ đến từng trang mới, thay v&agrave;o đ&oacute; ch&uacute;ng được truy xuất từ phi&ecirc;n ch&uacute;ng ta bắt đầu ở mỗi trang bằng c&acirc;u lệnh</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic">session_start();</pre> <p>Cũng lưu &yacute; rằng tất cả c&aacute;c gi&aacute; trị của biến trong phi&ecirc;n được lưu trữ trong biến $ _SESSION.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php session_start(); ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;?php echo "Ten nguoi dung la " . $_SESSION["Ten_nguoi_dung"] . ".&lt;br&gt;"; ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Một c&aacute;ch kh&aacute;c để hiển thị tất cả c&aacute;c gi&aacute; trị của biến trong phi&ecirc;n cho người d&ugrave;ng bằng đoạn m&atilde; sau:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php session_start(); ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;?php print_r($_SESSION); ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Phi&ecirc;n hoạt động như n&agrave;o? Hầu hết c&aacute;c phi&ecirc;n sẽ đặt một kh&oacute;a định danh ri&ecirc;ng cho mỗi người d&ugrave;ng, v&agrave; gi&aacute; trị của kh&oacute;a định danh n&agrave;y tr&ecirc;n m&aacute;y t&iacute;nh của người d&ugrave;ng c&oacute; gi&aacute; trị tr&ocirc;ng giống như sau: 765487cf34ert8dede5a562e4f3a7e12. Sau đ&oacute;, khi một phi&ecirc;n được mở tr&ecirc;n một trang kh&aacute;c, n&oacute; sẽ qu&eacute;t m&aacute;y t&iacute;nh để t&igrave;m kh&oacute;a m&agrave; n&oacute; đ&atilde; đặt. Nếu tr&ugrave;ng khớp, n&oacute; sẽ truy cập v&agrave;o phi&ecirc;n đ&oacute;, nếu kh&ocirc;ng khớp, n&oacute; bắt đầu một phi&ecirc;n mới.</p> <h2>Sửa đổi gi&aacute; trị của một biến trong phi&ecirc;n</h2> <p>Để thay đổi gi&aacute; trị của một biến trong phi&ecirc;n, ta chỉ cần ghi đ&egrave; n&oacute; như sau.</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php session_start(); ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;?php $_SESSION["Ten_nguoi_dung"] = "Nguyen B"; print_r($_SESSION); ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <h2>Hủy một phi&ecirc;n</h2> <p>Để x&oacute;a tất cả c&aacute;c biến trong phi&ecirc;n to&agrave;n cục v&agrave; hủy phi&ecirc;n, ta sẽ sử dụng c&aacute;c h&agrave;m bao gồm session_unset() v&agrave; session_destroy().</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php session_start(); ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;?php session_unset(); session_destroy(); ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <h1>Cookie trong PHP</h1> <p>Cookie thường được sử dụng để x&aacute;c định người d&ugrave;ng. Cookie l&agrave; một tệp nhỏ m&agrave; m&aacute;y chủ th&ecirc;m v&agrave;o m&aacute;y t&iacute;nh của người d&ugrave;ng. Cookie được tạo ở ph&iacute;a m&aacute;y chủ v&agrave; được lưu v&agrave;o tr&igrave;nh duyệt ph&iacute;a m&aacute;y kh&aacute;ch. Mỗi khi c&ugrave;ng một m&aacute;y t&iacute;nh đ&oacute; truyền đến những y&ecirc;u cầu cho một trang bằng một tr&igrave;nh duyệt n&agrave;o đ&oacute;, n&oacute; cũng sẽ gửi cookie đ&atilde; được lưu. Với PHP, ta c&oacute; thể vừa tạo v&agrave; lấy c&aacute;c gi&aacute; trị cookie.</p> <h2>Tạo cookie</h2> <p>Một cookie được tạo bằng h&agrave;m setcookie().</p> <p><em>C&uacute; ph&aacute;p:</em></p> <pre class="EnlighterJSRAW" data-enlighter-language="generic">setcookie(t&ecirc;n, gi&aacute; trị, thời gian hết hạn, đường dẫn, miền, đảm bảo an to&agrave;n, sử dụng phương thức http);</pre> <p>Chỉ c&oacute; tham số đầu ti&ecirc;n l&agrave; t&ecirc;n l&agrave; bắt buộc, c&aacute;c tham số c&ograve;n lại l&agrave; t&ugrave;y chọn.</p> <h2>Tạo v&agrave; lấy Cookie</h2> <p>V&iacute; dụ, tạo một cookie c&oacute; t&ecirc;n "nguoi_dung" với gi&aacute; trị "Nguyen A". Cookie sẽ hết hạn sau 1 ng&agrave;y (86400 gi&acirc;y). K&yacute; hiệu (/) c&oacute; nghĩa l&agrave; cookie c&oacute; sẵn trong to&agrave;n bộ trang web (hoặc ta c&oacute; thể chọn thư mục t&ugrave;y th&iacute;ch). Sau đ&oacute;, ch&uacute;ng ta truy xuất gi&aacute; trị của cookie "nguoi_dung" (sử dụng biến to&agrave;n cục $ _COOKIE). Ch&uacute;ng ta cũng sử dụng h&agrave;m isset() để kiểm tra xem cookie c&oacute; được đặt hay kh&ocirc;ng:</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php $cookie_name = "nguoi_dung"; $cookie_value = "Nguyen A"; setcookie($cookie_name, $cookie_value, time() + 86400, "/"); ?&gt; &lt;html&gt; &lt;body&gt; &lt;?php if(!isset($_COOKIE[$cookie_name])) { echo "Cookie chua duoc cai dat!"; } else { echo "Cookie co ten la " . $cookie_name . "!&lt;br&gt;"; echo "Gia tri la: " . $_COOKIE[$cookie_name]; } ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Kết quả:</p> <pre>Cookie co ten la nguoi_dung! Gia tri la: Nguyen A</pre> <p><strong><span style="background-color: #ffff00;">Ch&uacute; &yacute;: H&agrave;m setcookie() phải xuất hiện trước thẻ &lt;html&gt;.</span></strong></p> <p><strong><span style="background-color: #ffff00;">Ch&uacute; &yacute;: Gi&aacute; trị của cookie tự động được m&atilde; h&oacute;a URL khi gửi cookie v&agrave; tự động được giải m&atilde; khi nhận được (để ngăn m&atilde; h&oacute;a URL, ta c&oacute; thể sử dụng h&agrave;m setrawcookie).</span></strong></p> <h2>Sửa đổi gi&aacute; trị cookie</h2> <p>Để sửa đổi cookie, ta c&oacute; thể đặt lại cookie bằng h&agrave;m setcookie().</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php $cookie_name = "nguoi_dung"; $cookie_value = "Nguyen B"; setcookie($cookie_name, $cookie_value, time() + 86400, "/"); ?&gt; &lt;html&gt; &lt;body&gt; &lt;?php if(!isset($_COOKIE[$cookie_name])) { echo "Cookie chua duoc cai dat!"; } else { echo "Cookie co ten la " . $cookie_name . "!&lt;br&gt;"; echo "Gia tri la: " . $_COOKIE[$cookie_name]; } ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <h2>X&oacute;a cookie</h2> <p>Để x&oacute;a cookie, ta sẽ sử dụng h&agrave;m setcookie() với một khoảng thời gian trong qu&aacute; khứ như trong v&iacute; dụ b&ecirc;n dưới, ta sẽ đặt thời gian hết hạn l&agrave; từ 1 tiếng trước.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php setcookie("nguoi_dung", "", time() - 3600); ?&gt; &lt;html&gt; &lt;body&gt; &lt;?php echo "Cookie da duoc xoa."; ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Kết quả:</p> <pre>Cookie da duoc xoa.</pre> <h2>Kiểm tra Cookie</h2> <p>Ta sẽ kiểm tra xem cookie đ&atilde; được bật hay chưa bằng c&aacute;ch thử tạo cookie bằng h&agrave;m setcookie(), sau đ&oacute; đếm số lượng phần tử của mảng $ _COOKIE.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php setcookie("nguoi_dung", "Nguyen A"); ?&gt; &lt;html&gt; &lt;body&gt; &lt;?php if(count($_COOKIE) &gt; 0) { echo "Cookies duoc bat."; } else { echo "Cookies chua duoc bat."; } ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Kết quả:</p> <pre>Cookies duoc bat.</pre> <p>Như vậy, Session v&agrave; Cookie trong PHP được sử dụng để gi&uacute;p dễ d&agrave;ng thao t&aacute;c với người d&ugrave;ng hơn cho một trang Web. V&agrave; tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về Session v&agrave; Cookie trong PHP. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i mới nhất tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p> <p>P/s: Cảm ơn mọi người!</p>