Estoy tratando de acceder al valor de una cookie (usando $_COOKIE
) inmediatamente después de llamar a la setcookie()
función en PHP. Cuando lo hago, $_COOKIE['uname']
no está configurado. ¿Por qué?
Sin embargo, $_COOKIE['uname']
tenga en cuenta que se establece como se esperaba en la próxima ejecución del script, como después de una actualización de página.
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
$_COOKIE
ti mismo o realizando una redirección (a la misma página) inmediatamente.Respuestas:
$_COOKIE
se establece cuando se carga la página, debido a la naturaleza sin estado de la web. Si desea acceso inmediato, puede configurarlo$_COOKIE['uname']
usted mismo o usar una variable intermedia.Por ejemplo:
if (isset($_COOKIE['uname'])) { // get data from cookie for local use $uname = $_COOKIE['uname']; } else { // set cookie, local $uname already set setcookie('uname', $uname, time() + 1800); }
fuente
$uname
en su script. Mientras que Mark Baker usa$_COOKIE['uname']
directamente.setcookie()
. Es posible que esta respuesta no satisfaga sus necesidades exactas. Pero eso no lo hace mal . El OP y el SO han encontrado que esta respuesta es útil.setcookie()
en ese código no es posible acceder$_COOKIE['uname']
La cookie no se configura hasta que la respuesta se envía al cliente y no está disponible en su PHP hasta la próxima solicitud del cliente después de eso.
Sin embargo, cuando configura la cookie en su secuencia de comandos, puede hacer lo siguiente:
setcookie('uname', $uname, time()+60*30); $_COOKIE['uname'] = $uname;
fuente
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 usasetcookie()
, 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 llamarsetcookie()
, 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 desetcookie()
son parte de su propio código.Una forma limpia y transparente de obtener un valor establecido
setcookie()
dentro de la misma solicitud es usarheaders_list()
(consulte http://php.net/manual/en/function.headers-list.php ) :function getcookie($name) { $cookies = []; $headers = headers_list(); // see http://tools.ietf.org/html/rfc6265#section-4.1.1 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 ).
fuente
explode()
funciona para mí, solo devuelve un elemento de matriz con toda la cadena dentro: ideone.com/7SnV9yDebe configurar la variable de la cookie usted mismo si la necesita de inmediato; para cuando cargue otra página, la cookie real se habrá configurado como resultado del método setcookie.
setcookie('name', $value, time()+60*30); $_COOKIE ['name'] = $value;
fuente
Podemos hacer esto usando llamadas AJAX.
Si queremos crear cookies al hacer clic en el botón, primero cree una llamada AJAX para crear cookies y luego, con el éxito de la primera llamada AJAX, podemos llamar a otro AJAX para obtener las cookies.
function saveCookie() { var base_url = $('#base_url').val(); var url = base_url + '/index/cookie'; $.ajax({ 'url': url, 'type': 'POST', 'success': function (data) { if (data) { var url = base_url + '/index/get_cookie'; $.ajax({ 'url': url, 'type': 'POST', 'success': function (response) { var container = $('#show'); if (response) { container.html(response); } } }); } } }); } <button type="button" onclick="saveCookie()">Save Cookie</button> <div id="show"></div>
fuente
Tuve un problema similar en el que usé una función de un archivo incluido y lo resolví con una función que devuelve el valor de la cookie y configura la cookie.
function setCookie($input) { setcookie('uname', $input, time() + 60 * 30); return $input; } if(!isset($_COOKIE['uname'])) { $uname = setCookie($whatever); } else { $uname = $_COOKIE['uname']; } echo "Cookie value: " . $uname;
fuente
Usando ob_start () y ob_flush () puede enviar la cookie al cliente y recuperarla en el mismo tiempo de ejecución. Prueba esto:
ob_start(); setcookie('uname', $uname, time() + 60 * 30); ob_flush(); echo "Cookie value: " . $_COOKIE['uname'];
fuente
Tu guión
setcookie()
función de ejecuta cuando el navegador web solicita la página por primera vez, en su caso, la recarga. Esta cookie se almacena en el navegador de los usuarios y no está disponible para su secuencia de comandos que se ejecuta en el servidor hasta la próxima solicitud, o en su caso, la próxima recarga.En la siguiente solicitud, el navegador envía esa cookie al servidor y la matriz
$_COOKIE
tendrá el valor que configuró inicialmente y el navegador lo devolverá en la segunda solicitud.fuente
Configuré una constante al mismo tiempo que se creó la cookie
define('CONSTANT', true); return setcookie('cookiename', 'cookie value goes here', time() + 60 * 60 * 24 * 30, '/');
Entonces puedo hacer algo de inmediato:
if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT)
fuente