Jeśli chcesz uzyskać dostęp do wartości pliku cookie natychmiast po wywołaniu setcookie()
, nie możesz użyć $_COOKIE
. Przyczyną tego jest natura protokołu (patrz https://tools.ietf.org/html/rfc6265 ). Kiedy setcookie()
go używasz , definiuje plik cookie, który ma być wysłany wraz z resztą nagłówków HTTP do klienta (patrz http://php.net/manual/en/function.setcookie.php ). Ale $_COOKIE
z drugiej strony zawiera zmienne przekazywane do aktualnego skryptu przez pliki cookie HTTP od klienta ( http://php.net/manual/en/reserved.variables.cookies.php ).
Kiedy zmieniasz się $_COOKIE
po wywołaniu setcookie()
- jak zalecają niektóre odpowiedzi tutaj - nie zawiera już tylko plików cookie od klienta. Może to kolidować z założeniami przyjętymi w kodzie strony trzeciej używanym w Twojej aplikacji i może powodować niepożądane efekty na stronie. Więc ogólnie nie jest to dobra praktyka i jest to opcja tylko wtedy, gdy wywołania setcookie()
są częścią twojego własnego kodu.
Czystym i przejrzystym sposobem uzyskania wartości ustawionej w setcookie()
ramach tego samego żądania jest użycie headers_list()
(patrz http://php.net/manual/en/function.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');
Ale zauważ, że to nie zadziała w PHP CLI (np. PHPUnit). W takim przypadku możesz użyć rozszerzeń innych firm, takich jak XDebug (patrz http://xdebug.org/docs/all_functions#xdebug_get_headers ).