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