我试图在PHP中$_COOKIE调用setcookie()函数后立即访问cookie的值(使用).当我这样做时,$_COOKIE['uname']没有设定.为什么?
但是,请注意,$_COOKIE['uname']在下次执行脚本时(例如在页面刷新之后)按预期设置.
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
Run Code Online (Sandbox Code Playgroud)
Mar*_*ker 137
在将响应发送回客户端之前,不会设置cookie,并且在此之后,在客户端发出下一个请求之前,不会在PHP中提供该cookie.
但是,在脚本中设置cookie时,可以执行以下操作:
setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;
Run Code Online (Sandbox Code Playgroud)
Jas*_*ary 37
$_COOKIE由于Web的无状态特性,在页面加载时设置.如果要立即访问,可以设置$_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);
}
Run Code Online (Sandbox Code Playgroud)
wit*_*rin 25
如果您想在呼叫后立即访问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()- 就像这里推荐的一些答案 - 它不再包含来自客户端的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');
Run Code Online (Sandbox Code Playgroud)
但请注意,这不适用于PHP CLI(例如PHPUnit).在这种情况下,您可以使用XDebug等第三方扩展(请参阅http://xdebug.org/docs/all_functions#xdebug_get_headers).
如果您需要立即设置cookie变量,则必须自己设置。在加载另一个页面时,将通过setcookie方法设置实际的cookie。
setcookie('name', $value, time()+60*30);
$_COOKIE ['name'] = $value;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44031 次 |
| 最近记录: |