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, $_COOKIEpor 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 $_COOKIEdespué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 ).