web-dev-qa-db-fra.com

Accès à $ _COOKIE immédiatement après setcookie ()

J'essaie d'accéder à la valeur d'un cookie (en utilisant $_COOKIE) Immédiatement après avoir appelé la fonction setcookie() en PHP. Lorsque je le fais, $_COOKIE['uname'] N'est pas défini. Pourquoi?

Notez cependant que $_COOKIE['uname'] Est défini comme prévu lors de la prochaine exécution du script, comme après une actualisation de page.

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

$_COOKIE est défini lors du chargement de la page, en raison de la nature sans état du Web. Si vous souhaitez un accès immédiat, vous pouvez définir $_COOKIE['uname'] vous-même ou utilisez une variable intermédiaire.

Par exemple:

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);  
}
36
Jason McCreary

Le cookie n'est pas défini tant que la réponse n'est pas renvoyée au client et n'est pas disponible dans votre PHP jusqu'à la prochaine demande du client après cela.

Cependant, lorsque vous définissez le cookie dans votre script, vous pouvez faire:

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

Si vous souhaitez accéder à la valeur d'un cookie immédiatement après avoir appelé la setcookie(), vous ne pouvez pas utiliser $_COOKIE. Le la raison en est dans la nature du protocole (voir https://tools.ietf.org/html/rfc6265 ). Lorsque vous utilisez setcookie(), il définit un cookie à envoyer avec le reste des en-têtes HTTP au client (voir - http://php.net/manual/en/function.setcookie.php ). Mais $_COOKIE Contient en revanche des variables transmises au script actuel via des cookies HTTP à partir du client ( http://php.net/manual/en/reserved.variables.cookies.php ).

Lorsque vous modifiez $_COOKIE Après avoir appelé setcookie() - comme certaines réponses recommandent ici - il ne contient plus uniquement les cookies du client. Cela pourrait interférer avec les hypothèses formulées dans le code tiers utilisé dans votre application et entraîner des effets de site indésirables. Donc, en général, ce n'est pas une bonne pratique et ce n'est qu'une option lorsque les appels de setcookie() font partie de votre propre code.

Une manière propre et transparente d'obtenir une valeur définie avec setcookie() dans la même requête consiste à utiliser headers_list() (voir 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');

Mais notez que cela ne fonctionnera pas dans PHP CLI (par exemple PHPUnit). Dans un tel cas, vous pouvez utiliser des extensions tierces comme XDebug (voir http : //xdebug.org/docs/all_functions#xdebug_get_headers ).

24
witrin

Vous devez définir la variable cookie par vous-même si vous en avez besoin immédiatement, au moment où vous chargez une autre page, le véritable cookie aurait été défini à la suite de la méthode setcookie.

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

J'ai eu un problème similaire où j'ai utilisé une fonction à partir d'un fichier inclus et l'ai résolu avec une fonction qui à la fois renvoie la valeur du cookie et définit le 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;
1