Я пытаюсь получить доступ к значению cookie (используя $_COOKIE
) сразу после вызова setcookie()
функции в PHP. Когда я так делаю, $_COOKIE['uname']
не устанавливается. Почему?
Обратите внимание, однако, что $_COOKIE['uname']
это устанавливается должным образом при следующем выполнении сценария, например, после обновления страницы.
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
$_COOKIE
себе, либо выполнив перенаправление (на ту же страницу) немедленно.Ответы:
$_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); }
источник
$uname
в своем скрипте. Тогда как Марк Бейкер использует$_COOKIE['uname']
напрямую.setcookie()
. Этот ответ может не соответствовать вашим потребностям. Но это не значит, что это неправильно . OP и SO сочли этот ответ полезным.setcookie()
этого кода невозможно получить доступ$_COOKIE['uname']
Файл 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 CLI (например, PHPUnit). В таком случае вы можете использовать сторонние расширения, такие как XDebug (см. Http://xdebug.org/docs/all_functions#xdebug_get_headers ).
источник
explode()
для меня не работает, просто возвращает один элемент массива со всей строкой внутри: ideone.com/7SnV9yВы должны сами установить переменную cookie, если она вам нужна немедленно, к тому времени, когда вы загрузите другую страницу, настоящий cookie будет установлен в результате метода setcookie.
setcookie('name', $value, time()+60*30); $_COOKIE ['name'] = $value;
источник
Мы можем сделать это с помощью вызова 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>
источник
У меня была аналогичная проблема, когда я использовал функцию из включенного файла и решил ее с помощью функции, которая возвращает значение файла 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;
источник
Используя 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)
источник