Я пытаюсь получить доступ к значению файла 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