Si desea acceder al valor de una cookie inmediatamente después de llamar al, setcookie()
no puede usar $_COOKIE
. La razón de esto está en la naturaleza del protocolo (consulte https://tools.ietf.org/html/rfc6265 ). Cuando lo usa setcookie()
, define una cookie que se enviará junto con el resto de los encabezados HTTP al cliente (consulte http://php.net/manual/en/function.setcookie.php ). Pero, $_COOKIE
por otro lado, contiene variables pasadas al script actual a través de cookies HTTP desde el cliente ( http://php.net/manual/en/reserved.variables.cookies.php ).
Cuando cambia $_COOKIE
después de llamar setcookie()
, como recomiendan algunas respuestas aquí, ya no contiene solo las Cookies del cliente. Esto podría interferir con las suposiciones hechas en el código de terceros utilizado en su aplicación y puede resultar en efectos no deseados en el sitio. Entonces, en general, no es una buena práctica y solo es una opción cuando las llamadas de setcookie()
son parte de su propio código.
Una forma limpia y transparente de obtener un valor establecido setcookie()
dentro de la misma solicitud es usar headers_list()
(consulte 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');
Pero tenga en cuenta que esto no funcionará en PHP CLI (por ejemplo, PHPUnit). En tal caso, podría utilizar extensiones de terceros como XDebug (consulte http://xdebug.org/docs/all_functions#xdebug_get_headers ).