Подтвердить что ты не робот

Доступ к $_COOKIE сразу после setcookie()

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

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

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

Ответ 1

$_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);  
}

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Я установил константу в то же время, когда был создан файл 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)

Ответ 9

Мы можем сделать это с помощью вызова AJAX.

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