Wenn Sie unmittelbar nach dem Aufruf von auf den Wert eines Cookies zugreifen möchten, setcookie()
können Sie diesen nicht verwenden $_COOKIE
. Der Grund dafür liegt in der Art des Protokolls (siehe https://tools.ietf.org/html/rfc6265 ). Wenn Sie es verwenden setcookie()
, wird ein Cookie definiert, das zusammen mit den restlichen HTTP-Headern an den Client gesendet werden soll (siehe http://php.net/manual/en/function.setcookie.php ). Aber $_COOKIE
auf der anderen Seite enthält Variablen, die das aktuelle Skript übergaben über HTTP Plätzchen vom Client ( http://php.net/manual/en/reserved.variables.cookies.php ).
Wenn Sie $_COOKIE
nach dem Anruf wechseln setcookie()
- wie einige Antworten hier empfehlen - enthält es nicht mehr nur die Cookies des Kunden. Dies kann die Annahmen in dem in Ihrer Anwendung verwendeten Code von Drittanbietern beeinträchtigen und zu unerwünschten Site-Effekten führen. Im Allgemeinen ist dies keine gute Vorgehensweise und nur dann eine Option, wenn die Aufrufe von setcookie()
Teil Ihres eigenen Codes sind.
Eine saubere und transparente Möglichkeit, einen Wert setcookie()
innerhalb derselben Anforderung festzulegen, ist die Verwendung headers_list()
(siehe 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');
Beachten Sie jedoch, dass dies in PHP CLI (z. B. PHPUnit) nicht funktioniert. In einem solchen Fall können Sie Erweiterungen von Drittanbietern wie XDebug verwenden (siehe http://xdebug.org/docs/all_functions#xdebug_get_headers ).