在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>