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


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

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

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

8 ответов:

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

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

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

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

если вы хотите получить доступ к значение cookie сразу после вызова setcookie() вы не можете использовать $_COOKIE. причина этого в природе протокола (см. https://tools.ietf.org/html/rfc6265). при использовании setcookie() он определяет Cookie, который будет отправлен вместе с остальными заголовками HTTP клиент (см. http://php.net/manual/en/function.setcookie.php). но $_COOKIE С другой стороны содержит переменные передается в текущий скрипт через HTTP Cookies от клиента (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).

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

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

С помощью ob_start () и помощью ob_flush() вы можете отправить файл cookie клиенту и получить его в то же время выполнения. Попробуйте это:

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

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

при следующем запросе браузер отправляет этот файл cookie на сервер и массив $_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)

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

Если мы хотим создать куки на кнопку нажмите так сначала создать AJAX вызов для создания куки то успех первого вызова AJAX мы можем вызвать другой AJAX для получения куки.

    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>