93 votes

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é le setcookie() en PHP. Lorsque je le fais, $_COOKIE['uname'] n'est pas réglé. Pourquoi ?

Il convient toutefois de noter que $_COOKIE['uname'] est défini comme prévu lors de la prochaine exécution du script, par exemple après un rafraîchissement de la page.

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

0 votes

Malheureusement, les réponses ici n'offrent pas de solution ou suggèrent de mauvaises solutions de contournement, même si elles sont acceptées. stackoverflow.com/questions/3230133#34465594 .

0 votes

@witrin votre lien semble rediriger vers cette même q/a.

2 votes

Ce n'est pas possible. Vous devez "faire semblant", soit en définissant les entrées correspondantes dans le fichier $_COOKIE ou en effectuant immédiatement une redirection (vers la même page).

165voto

Mark Baker Points 90240

Le cookie n'est pas défini avant que la réponse ne soit renvoyée au client et n'est pas disponible dans votre PHP avant la prochaine requête du client.

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

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

3 votes

Une solution très simple. Merci de votre attention.

2 votes

De bonnes choses. Je me demande comment la deuxième ligne fixe le délai d'expiration lorsqu'il n'est pas transmis ?

3 votes

@martinedwards La deuxième ligne ne fixe pas de délai d'expiration.... elle est fixée pour la durée de la demande ; exactement de la même manière qu'un cookie transmis avec une demande d'un navigateur existe pour la durée de la demande.

40voto

Jason McCreary Points 35919

$_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'] ou utiliser 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);  
}

24 votes

Cela ne rend pas le cookie accessible avant un rafraîchissement de la page... voir la réponse de Mark Baker plus bas pour cela :)

0 votes

Ce n'est pas vrai. J'ai supposé, en me basant sur le code de l'OP, qu'il utilisait $uname dans leur script. Alors que Mark Baker utilise $_COOKIE['uname'] directement.

1 votes

Je suis désolé de m'être mal exprimé. Pour mes besoins, qui sont ceux d'un script asynchrone, la définition de $_COOKIE n'a pas réellement défini le cookie et ne l'a pas renvoyé au navigateur (j'avais besoin du cookie là aussi), elle l'a seulement rendu disponible dans mon script. Vous devez également utiliser setcookie(), ce que fait la réponse de Mark Baker. De plus, son code est beaucoup plus court et plus utile pour les personnes qui viennent ici à partir d'une recherche sur Google.

38voto

witrin Points 2189

Si vous souhaitez accéder à la valeur d'un cookie immédiatement après avoir appelé la fonction setcookie() vous ne pouvez pas utiliser $_COOKIE . La raison en est la nature du protocole (voir https://www.rfc-editor.org/rfc/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 d'autre part, contient des variables transmises au script actuel via des cookies HTTP. du client ( http://php.net/manual/en/reserved.variables.cookies.php ).

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

Une manière propre et transparente d'obtenir un ensemble de valeurs avec setcookie() dans la même demande est d'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 remarquez que cela ne fonctionnera pas avec l'interface de programmation de PHP (par exemple PHPUnit). Dans ce cas, vous pouvez utiliser des extensions tierces comme XDebug (voir http://xdebug.org/docs/all_functions#xdebug_get_headers )._

8voto

Joshua Points 494

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

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

4voto

Nous pouvons le faire en utilisant les appels AJAX.

Si nous voulons créer des cookies en cliquant sur un bouton, nous devons d'abord créer un appel AJAX pour créer des cookies, puis si le premier appel AJAX réussit, nous pouvons appeler un autre appel AJAX pour obtenir les 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>

0 votes

Sachez que même lorsque les intentions sont bonnes, l'OP exige une réponse en PHP uniquement :) C'est peut-être pour cela que tu as des downvotes, je ne t'ai pas downvoté.

0 votes

Upvoted parce que c'est aussi une approche qui devrait être considérée !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X