2010-07-12 16 views
51

Sto tentando di accedere al valore di un cookie (utilizzando $_COOKIE) immediatamente dopo aver chiamato la funzione setcookie() in PHP. Quando lo faccio, $_COOKIE['uname'] non è impostato. Perché?

Si noti, tuttavia, che $_COOKIE['uname'] è impostato come previsto alla successiva esecuzione dello script, ad esempio dopo un aggiornamento della pagina.

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

Purtroppo le risposte qui non offre una soluzione o suggerendo cattive soluzioni alternative anche il accettati, vedere http://stackoverflow.com/questions/3230133#34465594. – witrin

+0

@witrin il collegamento fornito sembra reindirizzare a questo stesso q/a. – trainoasis

+0

Questo non è possibile. Devi "fingere", sia impostando le voci corrispondenti in '$ _COOKIE' te stesso o eseguendo un reindirizzamento (alla stessa pagina) immediatamente. – caw

risposta

30

$_COOKIE è impostato al caricamento della pagina, a causa della natura stateless del web. Se si desidera l'accesso immediato, è possibile impostare $_COOKIE['uname'] o utilizzare una variabile intermedia.

Ad esempio:

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

questo non rende il cookie accessibile prima di un aggiornamento della pagina ... vedi la risposta di Mark Baker più avanti per quello :) – pathfinder

+0

Non è vero. Ho assunto l'ipotesi, basandomi sul codice dell'OP, che usassero '$ uname' nel loro script. Mentre Mark Baker usa '$ _COOKIE ['uname']' direttamente. –

+0

Mi dispiace di averlo detto un po 'male. Per i miei scopi, che sono per uno script asincrono, l'impostazione $ _COOKIE non ha effettivamente impostato il cookie e inviato al browser (anch'io avevo bisogno del cookie anche lì), lo ha reso disponibile solo nel mio script. Devi usare anche setcookie(), che la risposta di Mark Baker fa. Inoltre, il suo codice è molto più breve e più utile per le persone che vengono da una ricerca su google. – pathfinder

101

Il cookie non è impostata fino a quando la risposta viene inviata al client, e non è disponibile in PHP fino alla successiva richiesta da parte del client dopo che.

Tuttavia, quando si imposta il cookie nello script, si può fare:

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

Questo ha funzionato come un fascino. Grazie mille – Ahmad

+1

Soluzione molto semplice. Grazie! – dawoodman71

+0

Grandi cose. Mi chiedo come la seconda riga stabilisca il tempo di scadenza quando non viene trasmesso? – martinedwards

-1

Utilizzando ob_start() e ob_flush() è possibile inviare il cookie al cliente e recuperarlo nel stesso tempo di esecuzione. Prova questo:

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

Questo non sembra funzionare (PHP 5.4 w/nginx). Puoi espandere per favore? –

-1

funzione di Lo script viene eseguito setcookie() quando il browser Web richiede la pagina per la prima volta, nel tuo caso la ricarica. Questo cookie è memorizzato nel browser degli utenti e non è disponibile per il tuo script in esecuzione sul server fino alla successiva richiesta, o nel tuo caso la prossima ricarica.

Alla richiesta successiva il browser invia quel cookie al server e l'array $_COOKIE avrà il valore impostato inizialmente e il browser restituito alla seconda richiesta.

-2

Ho impostato un costante allo stesso tempo il cookie è stato creato

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

posso poi subito fare qualcosa per:

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

Possiamo farlo utilizzando AJAX chiamata.

Se vogliamo creare cookie sul clic del pulsante, quindi prima creare una chiamata AJAX per la creazione di cookie, quindi il successo della prima chiamata AJAX, possiamo chiamare un altro AJAX per ottenere i cookie.

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

Se si desidera accedere il valore di un cookie subito dopo aver chiamato il setcookie() non è possibile utilizzare $_COOKIE. Il motivo di ciò è nella natura del protocollo (vedere https://tools.ietf.org/html/rfc6265). Quando si utilizza setcookie(), viene definito un cookie da inviare insieme al resto delle intestazioni HTTP al client (vedere http://php.net/manual/en/function.setcookie.php). Ma $_COOKIE d'altra parte contiene le variabili passate allo script corrente tramite i cookie HTTP dal client (http://php.net/manual/en/reserved.variables.cookies.php).

Quando si modifica dopo aver chiamato setcookie() - come alcune risposte qui raccomandano - non contiene più solo i cookie dal client. Ciò potrebbe interferire con le ipotesi fatte nel codice di terze parti utilizzato nella tua applicazione e potrebbe causare effetti indesiderati sul sito. Quindi in generale non è una buona pratica ed è solo un'opzione quando le chiamate di setcookie() fanno parte del tuo codice.

Un modo pulito e trasparente per ottenere un valore impostato con setcookie() all'interno della stessa richiesta è quello di utilizzare headers_list() (vedi 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'); 

Ma notate questo non funzionerà in PHP CLI (es. PHPUnit). In tal caso è possibile utilizzare estensioni di terze parti come XDebug (vedere http://xdebug.org/docs/all_functions#xdebug_get_headers).

+4

Solo una soluzione reale qui. Pulisci, senza modifiche del codice di terze parti che potrebbe contenere setcookie. – Michael

2

Devi impostare la variabile del cookie da solo se ne hai bisogno immediatamente, nel momento in cui carichi un'altra pagina il vero cookie sarebbe stato impostato come risultato del metodo setcookie.

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