Доступ к $ _COOKIE сразу после setcookie () - PullRequest
68 голосов
/ 12 июля 2010

Я пытаюсь получить доступ к значению куки (используя $_COOKIE) сразу после вызова функции setcookie() в PHP. Когда я так делаю, $_COOKIE['uname'] не устанавливается. Зачем?

Обратите внимание, однако, что $_COOKIE['uname'] устанавливается, как ожидается, при следующем выполнении сценария, например, после обновления страницы.

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

Ответы [ 9 ]

128 голосов
/ 12 июля 2010

Файл cookie не устанавливается до тех пор, пока ответ не будет отправлен обратно клиенту, и недоступен в вашем PHP до следующего запроса от клиента после этого.

Однако, когда вы устанавливаете файл cookieв вашем скрипте вы можете сделать:

setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;
36 голосов
/ 12 июля 2010

$_COOKIE устанавливается при загрузке страницы из-за отсутствия информации в Интернете. Если вы хотите немедленного доступа, вы можете установить $_COOKIE['uname'] самостоятельно или использовать промежуточную переменную.

Например:

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);  
}
23 голосов
/ 25 декабря 2015

Если вы хотите получить доступ к значению cookie сразу после вызова setcookie(), вы не можете использовать $_COOKIE. Причина этого заключается в природе протокола (см. https://tools.ietf.org/html/rfc6265). Когда вы используете setcookie(), он определяет Cookie для отправки вместе с остальными заголовками HTTP клиенту (см. http://php.net/manual/en/function.setcookie.php). Но $_COOKIE с другой стороны содержит переменные передается в текущий скрипт через HTTP-куки от клиента (http://php.net/manual/en/reserved.variables.cookies.php).

Когда вы изменяете $_COOKIE после вызова setcookie() - как рекомендуют некоторые ответы здесь - он больше не содержит только куки-файлы от клиента. Это может помешать предположениям, сделанным в стороннем коде, используемом в вашем приложении, и может привести к нежелательным эффектам сайта. Так что в целом это не очень хорошая практика, и это вариант, когда вызовы setcookie() являются частью вашего собственного кода.

Чистый и прозрачный способ получить значение, установленное с помощью setcookie() в рамках одного и того же запроса, - это использовать headers_list() (см. 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');

Но обратите внимание, это не сработает в PHP CLI (например, PHPUnit). В таком случае вы можете использовать сторонние расширения, такие как XDebug (см. http://xdebug.org/docs/all_functions#xdebug_get_headers).

5 голосов
/ 01 июня 2017

Вы должны установить переменную cookie самостоятельно, если вам это нужно немедленно, к тому времени, когда вы загрузите другую страницу, в результате метода setcookie будет установлен настоящий cookie.

1 голос
/ 04 июня 2019

У меня была похожая проблема, когда я использовал функцию из включенного файла и решил ее с помощью функции, которая одновременно возвращает значение cookie и устанавливает 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;
0 голосов
/ 18 ноября 2015

Мы можем сделать это, используя вызов AJAX.

Если мы хотим создать cookie-файлы одним нажатием кнопки, поэтому сначала создайте вызов AJAX для создания cookie-файлов, а затем, при первом вызове AJAX, мы можем вызвать другой AJAX для получения 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>
0 голосов
/ 20 мая 2015

Я установил константу в то же время, когда был создан файл cookie

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

Затем я могу немедленно что-то сделать:

if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT)
0 голосов
/ 20 февраля 2015

Функция вашего скрипта setcookie() запускается, когда веб-браузер запрашивает страницу в первый раз, в вашем случае перезагрузите.Этот файл cookie сохраняется в браузере пользователя и недоступен для вашего сценария, выполняющегося на сервере, до следующего запроса или, в вашем случае, до следующей перезагрузки.

При следующем запросе браузер отправляет этот файл cookie вserver и массив $_COOKIE будут иметь значение, которое вы изначально установили, а браузер отправил обратно после второго запроса.

0 голосов
/ 06 января 2014

Используя ob_start () и ob_flush () , вы можете отправить cookie клиенту и получить его в то же время выполнения.Попробуйте это:

ob_start();
setcookie('uname', $uname, time() + 60 * 30);
ob_flush();
echo "Cookie value: " . $_COOKIE['uname'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...