在setcookie()之后立即访问$ _COOKIE

hea*_*ero 69 php cookies

我试图在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)

  • 这就像一个魅力.非常感谢 (3认同)
  • 很简单的解决方案 谢谢! (2认同)
  • 好东西。我想知道第二行在没有传入的情况下如何设置过期时间? (2认同)
  • @martinedwards第二行没有设置任何到期时间....它是在请求的持续时间内设置的; 与请求持续时间内存在来自浏览器的请求传入的cookie值的方式完全相同 (2认同)

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)

  • 这不会使页面刷新之前访问cookie ...请参阅Mark Ba​​ker的答案:) (15认同)
  • 我不明白为什么这个答案被标记为“答案”。它没有解释如何直接使用 cookie,并且提供的代码就像发布的同一个 OP。在该代码中的 `setcookie()` 之后,无法访问 `$_COOKIE['uname']` (2认同)

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).

  • 这里只有一个真正的解决方 干净,无需修改可能包含setcookie的第三方代码. (6认同)

Jos*_*hua 5

如果您需要立即设置cookie变量,则必须自己设置。在加载另一个页面时,将通过setcookie方法设置实际的cookie。

setcookie('name', $value, time()+60*30);
$_COOKIE ['name'] = $value;
Run Code Online (Sandbox Code Playgroud)