Web

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

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

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

setcookie('uname', $uname, time() + 60 * 30);

echo "Cookie value: " . $_COOKIE['uname'];

 

Ответ 1

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

Например:

if (isset($_COOKIE['uname'])) {

    // получение данных cookie для локального использования

    $uname = $_COOKIE['uname'];

else {

    // установка cookie из локальной переменной $uname

    setcookie('uname', $uname, time() + 1800);  

}

 

Ответ 2

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

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, с другой стороны, содержит переменные, переданные текущему скрипту через 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();

    // см. 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');

 

Ответ 4

Мы можем сделать это с помощью вызовов AJAX. Если мы хотим создавать cookies при нажатии на кнопку, то сначала создадим AJAX вызов для создания cookies, а затем, после успешного завершения первого AJAX вызова, мы можем вызвать другой AJAX для получения 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>

 

Ответ 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;

 

Схожие статьи

Web

Как усечь строку в PHP до слова, ближайшего к определенному количеству символов

Twitch: что это за сайт и почему он популярен среди стримеров?
Web

Twitch: что это за сайт и почему он популярен среди стримеров?

Программы для создания макета сайта и лучшие онлайн-сервисы
Web

Программы для создания макета сайта и лучшие онлайн-сервисы

Web

Как преобразовать серию «родитель-потомок» в иерархическое дерево