Доступ к $_COOKIE сразу после setcookie()
Я пытаюсь получить доступ к значению cookie (используя $_COOKIE
) сразу после вызова функции setcookie()
в PHP. Когда я это сделаю, $_COOKIE['uname']
не установлен. Зачем?
Обратите внимание, однако, что $_COOKIE['uname']
устанавливается как ожидалось при следующем выполнении script, например, после обновления страницы.
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
Ответы
Ответ 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>