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


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

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

setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
 61
Author: outis, 2010-07-12

8 answers

$_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);  
}
 35
Author: Jason McCreary, 2013-02-06 01:58:09

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

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

setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;
 115
Author: Mark Baker, 2010-07-12 16:18:10

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

Когда вы меняете $_COOKIE после вызова setcookie() - как рекомендуют некоторые ответы здесь - он больше не содержит только файлы cookie от клиента. Это может помешать предположениям, сделанным в стороннем коде, используемом в вашем приложении, и может привести к нежелательным последствиям для сайта. Так что в целом это не очень хорошая практика, и это только вариант, когда вызовы 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 (например, PHPUnit). В таком случае вы можете использовать сторонние расширения, такие как XDebug (см. http://xdebug.org/docs/all_functions#xdebug_get_headers).

 22
Author: witrin, 2015-12-26 11:12:43

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

setcookie('name', $value, time()+60*30);
$_COOKIE ['name'] = $value;
 2
Author: Joshua, 2017-06-01 19:37:07

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

ob_start();
setcookie('uname', $uname, time() + 60 * 30);
ob_flush();
echo "Cookie value: " . $_COOKIE['uname'];
 -1
Author: Will Soares, 2014-01-05 22:18:30

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

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

 -1
Author: Robert Rocha, 2015-02-20 00:51:46

Я установил константу в то же время, когда был создан файл 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)
 -2
Author: virtualLast, 2015-05-20 14:20:54

Мы можем сделать это с помощью вызова 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>
 -3
Author: Fakirchand Patidar, 2015-11-18 10:09:25