我正在尝试在PHP中调用$_COOKIE
函数后立即访问cookie的值(使用setcookie()
)。当我这样做时,$_COOKIE['uname']
未设置。为什么?
但请注意,$_COOKIE['uname']
在下次执行脚本时按预期设置,例如在页面刷新后。
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
答案 0 :(得分:126)
在将响应发送回客户端之前,不会设置cookie,并且在此之后,在客户端发出下一个请求之前,不会在PHP中使用该cookie。
但是,在脚本中设置cookie时,可以执行以下操作:
setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;
答案 1 :(得分:36)
$_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 :(得分:23)
如果您想在调用setcookie()
后立即访问Cookie的值,则无法使用$_COOKIE
。原因在于协议的性质(见https://tools.ietf.org/html/rfc6265)。当您使用setcookie()
时,它会定义要与其他HTTP标头一起发送到客户端的Cookie(请参阅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)。
答案 3 :(得分:5)
如果你需要它,你必须自己设置cookie变量,当你加载另一个页面时,实际的cookie会因为setcookie方法而被设置。
setcookie('name', $value, time()+60*30);
$_COOKIE ['name'] = $value;
答案 4 :(得分:1)
我有一个类似的问题,我使用了包含文件中的一个函数,并用一个既返回cookie值又设置cookie的函数解决了这个问题。
library(data.table)
setDT(df1)[, n := .N, level][, .(count = .N, new_count = first(n)), .(group, level)]
# group level count new_count
#1: before up 4 10
#2: before down 8 11
#3: after up 6 10
#4: after down 3 11
答案 5 :(得分:-1)
使用 ob_start()和 ob_flush(),您可以将Cookie发送到客户端并在相同的运行时间内检索它。试试这个:
ob_start();
setcookie('uname', $uname, time() + 60 * 30);
ob_flush();
echo "Cookie value: " . $_COOKIE['uname'];
答案 6 :(得分:-1)
您的脚本的setcookie()
函数在Web浏览器首次请求页面时运行,在您的情况下是重新加载。此cookie存储在用户浏览器中,在下一次请求之前,或者在您的情况下下次重新加载时,您的服务器上运行的脚本无法使用此cookie。
在下一个请求时,浏览器会将该cookie发送到服务器,并且数组$_COOKIE
将具有您最初设置的值,并在第二次请求时将浏览器发回。
答案 7 :(得分:-2)
我在创建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)
答案 8 :(得分:-2)
我们可以使用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>