Nếu bạn muốn truy cập giá trị của cookie ngay sau khi gọi giá trị setcookie()
mà bạn không thể sử dụng $_COOKIE
. Lý do cho điều này là do bản chất của giao thức (xem https://tools.ietf.org/html/rfc6265 ). Khi bạn sử dụng, setcookie()
nó xác định một Cookie sẽ được gửi cùng với phần còn lại của tiêu đề HTTP tới máy khách (xem http://php.net/manual/en/ Chức năng.setcookie.php ). Nhưng $_COOKIE
mặt khác, chứa các biến được truyền đến tập lệnh hiện tại thông qua HTTP Cookies từ máy khách ( http://php.net/manual/en/reserved.variables.cookies.php ).
Khi bạn thay đổi $_COOKIE
sau khi gọi setcookie()
- giống như một số câu trả lời ở đây đề xuất - nó không chỉ chứa Cookie từ khách hàng nữa. Điều này có thể can thiệp vào các giả định được thực hiện bằng mã của bên thứ ba được sử dụng trong ứng dụng của bạn và có thể dẫn đến các hiệu ứng trang web không mong muốn. Vì vậy, nói chung, đó không phải là một phương pháp hay và nó chỉ là một lựa chọn khi các lệnh gọi setcookie()
là một phần của mã riêng của bạn.
Một cách rõ ràng và minh bạch để nhận giá trị được đặt setcookie()
trong cùng một yêu cầu là sử dụng headers_list()
(xem http://php.net/manual/en/ Chức năng.headers-list.php ) :
function getcookie($name) {
$cookies = [];
$headers = headers_list();
foreach($headers as $header) {
if (strpos($header, 'Set-Cookie: ') === 0) {
$value = str_replace('&', urlencode('&'), substr($header, 12));
parse_str(current(explode(';', $value, 1)), $pair);
$cookies = array_merge_recursive($cookies, $pair);
}
}
return $cookies[$name];
}
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . getcookie('uname');
Nhưng lưu ý rằng điều này sẽ không hoạt động trong PHP CLI (ví dụ: PHPUnit). Trong trường hợp này, bạn có thể sử dụng các tiện ích mở rộng của bên thứ ba như XDebug (xem http://xdebug.org/docs/all_functions#xdebug_get_headers ).