01/10/2018, 08:20

Tại sao setcookie không lổi khi đặt nó phía sau 1 output?

Mình có thắc mắc là tại sao mình đặt setcookie dưới thẻ html head nhưn vẩn không lổi?
Theo như document thì nó bảo

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including and tags as well as any whitespace.

http://php.net/manual/en/function.setcookie.php
Ví dụ như:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Test cookie</title>
	<link rel="stylesheet" href="">
</head>
<body>
<?php //ở đây này
	echo 'Cookie test<br>';
	if(isset($_COOKIE['language'])){
		echo 'is seted<br>';
	}
	if(setcookie('language','vi'))
	{
		echo "true";
	}
?>
</body>
</html>

Thì không báo lổi? Tại sao?
(Tiếng anh mình hơi kém… Với lại mình chả biết làm sao để nó lênh màu code lung linh, thành thật xin lỗi).

Phan Hoàng viết 10:30 ngày 01/10/2018

Mình nghĩ bạn hiểu sai về cookie rồi. Cookie là 1 storage chứa các thông tin và ở phía browser, dùng để detect xem người dùng là ai (vì bản chất của http là stateless, do đó nó cần 1 info nào đó để làm việc này). Khi browser gửi request, nó sẽ send request với cái cookie (tại Header Cookies: xxx), lên server, nó parse cái Header này ra và biết bạn là ai. Thường có 2 cách:

  • Cookie chứa luôn thông tin người dùng, giống kiểu JWT ấy.
  • Cookie chứa 1 token (thường là session_id) và phía server check cái session_id mà biết bạn là ai.

Còn việc dùng server-side set-cookie là bạn viết vào Header của response trả về, Set-cookies. Browser nhận được lệnh này và set phía dưới của nó, chứ server side không control được cookie phía dưới client.

Còn tại sao không lỗi là bởi vì nó đã send đâu, chỉ mới đang ở giai đoạn render ra HTML mà thôi. Đoạn code PHP sẽ vứt cái đó lên Header: Set-Cookie. Còn ở 1 số fw thì nó chia thành 1 tier: View, ở đó nó render xong rồi gửi luôn, còn các business logic vẫn có thể thực hiện tiếp ở server-side, lúc đó thì bạn không thể vứt thông tin vào header được nữa.

$view->render();
setHeader('Set-cookies', "hoho=haha&hehe=hihi"); //lenh nay khong co tac dung nua
Bài liên quan
0