2010-07-12 16 views
51

Estoy tratando de acceder al valor de una cookie (usando $_COOKIE) inmediatamente después de llamar a la función setcookie() en PHP. Cuando lo hago, $_COOKIE['uname'] no está configurado. ¿Por qué?

Tenga en cuenta, sin embargo, que $_COOKIE['uname'] se configura como se espera 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']; 
+0

Lamentablemente las respuestas aquí no ofrecen una solución o sugieren soluciones incorrectas incluso las aceptadas, consulte http://stackoverflow.com/questions/3230133#34465594. – witrin

+0

@witrin su enlace provisto parece redirigir a este mismo q/a. – trainoasis

+0

Esto no es posible. Tienes que "falsificarlo", ya sea configurando las entradas correspondientes en '$ _COOKIE' o realizando una redirección (a la misma página) inmediatamente. – caw

Respuesta

30

$_COOKIE se establece cuando se carga la página, debido a la naturaleza sin estado de la web. Si desea acceso inmediato, puede configurar $_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); 
} 
+9

esto no hace que la cookie sea accesible antes de una actualización de página ... ver la respuesta de Mark Baker más abajo para eso :) – pathfinder

+0

Eso no es verdad. Hice la suposición, basada en el código del OP, de que usan '$ uname' en su script. Mientras que Mark Baker usa '$ _COOKIE ['uname']' directamente. –

+0

Lo siento, lo dije un poco mal. Para mis propósitos, que son para una secuencia de comandos asíncrona, la configuración de $ _COOKIE en realidad no configuraba la cookie y la enviaba de vuelta al navegador (también necesitaba la cookie), solo estaba disponible en mi script. También debe usar setcookie(), que es la respuesta de Mark Baker. Además, su código es mucho más corto y más útil para las personas que vienen desde una búsqueda en Google. – pathfinder

101

La cookie no se establece hasta que la respuesta se envía de vuelta al cliente, y no está disponible en tu PHP hasta la próxima petición del cliente después de eso.

Sin embargo, cuando se establece la cookie en su script, que puede hacer:

setcookie('uname', $uname, time()+60*30); 
$_COOKIE['uname'] = $uname; 
+1

Esto funcionó como un amuleto. Muchas gracias – Ahmad

+1

Solución muy simple. ¡Gracias! – dawoodman71

+0

cosas geniales. Me pregunto cómo la segunda línea establece el tiempo de caducidad cuando no se pasa? – martinedwards

-1

Usando ob_start() y ob_flush() puede enviar la cookie de cliente y recuperarlo en el el mismo tiempo de ejecución Prueba esto:

ob_start(); 
setcookie('uname', $uname, time() + 60 * 30); 
ob_flush(); 
echo "Cookie value: " . $_COOKIE['uname']; 
+0

Esto no parece funcionar (PHP 5.4 w/nginx). ¿Puedes expandir? –

-1

función de su secuencia de comandos se ejecuta setcookie() 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 la secuencia de comandos que se ejecuta en el servidor hasta la próxima solicitud, o en su caso la próxima recarga.

En la próxima solicitud, el navegador envía esa cookie al servidor y la matriz $_COOKIE tendrá el valor que estableció inicialmente y el navegador reenviado a la segunda solicitud.

-2

I de dicha constante al mismo tiempo, la cookie se creó

define('CONSTANT', true); 
return setcookie('cookiename', 'cookie value goes here', time() + 60 * 60 * 24 * 30, '/'); 

A continuación, puedo hacer algo de inmediato por:

if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT) 
-3

Podemos hacer esto usando AJAX llamada.

Si queremos crear cookies en el botón, haga clic, primero cree una llamada AJAX para crear cookies y luego el éxito de la primera llamada AJAX, podemos llamar a otra 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> 
18

Si desea acceder valor de una cookie inmediatamente después de llamar al setcookie() no se puede utilizar $_COOKIE. La razón para esto está en la naturaleza del protocolo (ver https://tools.ietf.org/html/rfc6265). Cuando 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 las cookies HTTP del cliente (http://php.net/manual/en/reserved.variables.cookies.php).

Cuando cambie $_COOKIE después de llamar al setcookie() - como algunas respuestas aquí lo recomiendan - ya no contiene más las cookies del cliente. Esto podría interferir con las suposiciones hechas en el código de un tercero utilizado en su aplicación y puede provocar efectos de sitio no deseados. Por lo tanto, en general no es una buena práctica y es solo una opción cuando las llamadas de setcookie() son parte de su propio código.

una manera limpia y transparente para obtener un valor ajustado con setcookie() dentro de la misma petición es utilizar headers_list() (ver 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 nótese que esto no funcionará en PHP CLI (por ejemplo, PHPUnit). En tal caso, podría usar extensiones de terceros como XDebug (consulte http://xdebug.org/docs/all_functions#xdebug_get_headers).

+4

Solo hay una solución real aquí. Limpio, sin modificaciones del código de terceros que podría contener setcookie. – Michael

2

Debe configurar la variable de cookie usted mismo si la necesita inmediatamente, cuando cargue otra página, la cookie real se habrá establecido como resultado del método setcookie.

setcookie('name', $value, time()+60*30); 
$_COOKIE ['name'] = $value; 
Cuestiones relacionadas