在PHP中$_COOKIE
调用setcookie()
函数后,我试图立即访问cookie的值(使用)。当我这样做时,$_COOKIE['uname']
没有设置。为什么?
但是请注意,$_COOKIE['uname']
在下次执行脚本时(例如在刷新页面后)将按预期进行设置。
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
在PHP中$_COOKIE
调用setcookie()
函数后,我试图立即访问cookie的值(使用)。当我这样做时,$_COOKIE['uname']
没有设置。为什么?
但是请注意,$_COOKIE['uname']
在下次执行脚本时(例如在刷新页面后)将按预期进行设置。
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
$_COOKIE
自己设置相应的条目或立即执行重定向(到同一页面)来“伪造”它。
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);
}
$uname
在脚本中使用的假设。而Mark Baker$_COOKIE['uname']
直接使用。
setcookie()
。该答案可能无法满足您的确切需求。但这并没有错。OP和SO已发现此答案很有用。
setcookie()
在该代码之后,将无法访问$_COOKIE['uname']
直到将响应发送回客户端之前,才会设置cookie,并且直到之后客户端的下一个请求才在您的PHP中使用该cookie。
但是,在脚本中设置Cookie时,您可以执行以下操作:
setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;
如果您要在调用cookie后立即访问cookie的值setcookie()
,则不能使用$_COOKIE
。原因在于协议的性质(请参阅https://tools.ietf.org/html/rfc6265)。当您使用setcookie()
它时,它定义了一个Cookie和其他HTTP标头一起发送到客户端(请参阅http://php.net/manual/en/function.setcookie.php)。但是$_COOKIE
另一方面,它包含从客户端(http://php.net/manual/en/reserved.variables.cookies.php)通过HTTP Cookies传递到当前脚本的变量。
$_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)。
explode()
我不起作用,仅返回一个数组元素,其中的整个字符串位于其中:ideone.com/7SnV9y
我们可以使用AJAX调用来做到这一点。
如果要在按钮上单击创建cookie,则首先创建一个用于创建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>
我有一个类似的问题,其中我使用了包含文件中的一个函数,并用一个既返回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'];