Я пытаюсь получить доступ к значению cookie (используя $_COOKIE
) сразу после вызова функции setcookie()
в PHP. Когда я это сделаю, $_COOKIE['uname']
не установлен. Зачем?
Обратите внимание, однако, что $_COOKIE['uname']
устанавливается как ожидалось при следующем выполнении скрипта, например, после обновления страницы.
setcookie('uname', $uname, time() + 60 * 30); echo "Cookie value: " . $_COOKIE['uname'];
$_COOKIE
устанавливается, когда страница загружается из-за отсутствия состояния в Интернете. Если вам нужен немедленный доступ, вы можете $_COOKIE['uname']
установить $_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 Cookies от клиента ( http://php.net/manual/en/reserved.variables.cookies.php ).
Когда вы меняете $_COOKIE
после вызова setcookie()
– как некоторые рекомендации здесь рекомендуют – он больше не содержит только Cookies от клиента. Это может помешать допущениям, сделанным в стороннем коде, используемом в вашем приложении, и может привести к нежелательным эффектам сайта. Так что в целом это не хорошая практика, и это только вариант, когда вызовы setcookie()
являются частью вашего собственного кода.
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 ).
Вы должны установить переменную 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-вызов.
Если мы хотим создать куки-файлы при нажатии кнопки, сначала создайте 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>