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

时间:2010-07-12 16:13:51

标签: php cookies

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

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

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

9 个答案:

答案 0 :(得分:126)

在将响应发送回客户端之前,不会设置cookie,并且在此之后,在客户端发出下一个请求之前,不会在PHP中使用该cookie。

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

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

答案 1 :(得分:36)

由于Web的无状态特性,在页面加载时设置了

$_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>