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

我试图在PHP中调用setcookie()函数后立即访问cookie的值(使用$_COOKIE )。 当我这样做, $_COOKIE['uname']没有设置。 为什么?

但请注意, $_COOKIE['uname']在脚本的下一次执行时(如在页面刷新之后)按预期设置。

 setcookie('uname', $uname, time() + 60 * 30); echo "Cookie value: " . $_COOKIE['uname']; 

由于网络的无状态特性, $_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); } 

在响应被发送回客户端之前,cookie不会被设置,并且直到客户端的下一个请求之后才能在您的PHP中使用。

但是,当您在脚本中设置Cookie时,您可以执行以下操作:

 setcookie('uname', $uname, time()+60*30); $_COOKIE['uname'] = $uname; 

如果您想在调用setcookie()后立即访问cookie的值,则不能使用$_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 )。

在调用setcookie()之后更改$_COOKIE – 就像这里推荐的一些答案一样 – 它不再仅包含来自客户端的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 )。

如果您立即需要,您必须自行设置cookie变量,在载入另一个页面时,真正的cookie将作为setcookie方法的结果设置。

 setcookie('name', $value, time()+60*30); $_COOKIE ['name'] = $value; 

使用ob_start()ob_flush(),你可以发送cookie到客户端,并在相同的运行时间检索它。 尝试这个:

 ob_start(); setcookie('uname', $uname, time() + 60 * 30); ob_flush(); echo "Cookie value: " . $_COOKIE['uname']; 

您的脚本的setcookie()函数在Web浏览器第一次请求页面时运行,在您的情况下重新加载。 这个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) 

我们可以使用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>