【问题标题】:PHP setcookie() does not work after unsetting $_COOKIE取消设置 $_COOKIE 后 PHP setcookie() 不起作用
【发布时间】:2011-01-03 22:20:42
【问题描述】:

我刚刚为 Cookies 编写了非常简单的包装类,如下所示:

<?php
class Cookie {  

    // expire time of the cookie 31 days
    private static $_expire = '2678400';

    public static function set($name = null, $value = null, $expire = null) {
        if (!empty($name)) {
            $expire = !empty($expire) ? $expire : time() + self::$_expire;
            if (setcookie($name, $value, $expire)) {
                return true;
            }
            return false;
        }
        return false;
    }

    public static function get($name = null) {
        if (!empty($name)) {
            return !empty($_COOKIE[$name]) ? $_COOKIE[$name] : false;
        }
        return false;
    }      

    public static function remove($name = null) {
        if (!empty($name)) {
            if (!empty($_COOKIE[$name])) {
                if (setcookie($name, false, time() - self::$_expire)) {
                    unset($_COOKIE[$name]);
                    return true;
                }
                return false;
            }
            return true;
        }
        return false;
    }

}
?>

但是我在最初设置 cookie 时遇到问题,然后我想通过首先调用来更改值:

Cookie::remove('session_name');

然后

Cookie::set('session_name');

第二个(set)没有设置cookie。

知道是什么原因造成的吗?

【问题讨论】:

  • 另外 - 值得一提 - Cookie::set() 返回 true - 所以不太确定出了什么问题。我正在使用 print_r($_COOKIE) 找出设置了哪些 cookie,并在设置了所有设置的 cookie 后发送测试电子邮件 - 它不会创建它。
  • 嗯,有两件事。你打电话给Session::foo,而不是Cookie::foo(这可能是一个疏忽,但值得一试)。其次,$_COOKIE 仅在下一个请求时填充。 setcookie 永远不会对同一个请求产生影响。如果您想跟踪设置的 cookie,请跟踪每次调用 ::set...
  • 是的 - 当然不是 Session(我正在输入它) - 不是很讨厌你的意思是 $_COOKIE 仅在下一个请求时填充 - 你的意思是下一次调用服务器 - 重新加载后?如果是这样 - 那么它就是 - 请阅读下面的评论。

标签: php cookies session-cookies


【解决方案1】:

我认为您误解了 cookie 的工作原理。

$_COOKIE 的内容被设置一次,在 HTTP 请求到达时并且在您的脚本开始执行之前。

如果您使用setcookie 添加或修改 cookie,则此添加或修改将在 下一个 对您的服务器的 HTTP 请求之前可见。这就是您在 Cookie::set 方法中所做的。

如果您通过查看$_COOKIE 的内容(或使用Cookie::get,执行相同的操作)“测试”Cookie::set,那么您将看不到cookie 的更改即使他们已经制作好了

要查看您的预期,您应该将值添加到 $_COOKIE 内的 Cookie::set。但是,我建议以不同的方式编写程序。您正在尝试像普通变量一样使用 cookie,但事实并非如此。

【讨论】:

  • 是的 - 调用 Cookie::set 后会重新加载 - 因为我正在使用 Ajax 来设置它 - 并在使用 location.reload() 成功响应后重新加载页面;
【解决方案2】:

如果你想改变一个cookie的值,不需要先删除它,你可以直接调用Session::set('session_name');,cookie会被覆盖。仅当您不再需要 cookie 时才调用 Session::remove('session_name');

【讨论】:

    【解决方案3】:

    如果我正确理解你,你需要这样的东西

    public static function set($name, $value,$expire) 
    {
        setcookie($name, $value, $expire);
    
       $_COOKIE[$name] = $value;    
    
    }
    

    【讨论】:

    • hmm - 抱歉 - 不太确定 - 如果已经使用 setcookie() 设置了 cookie 索引,为什么还需要将该值分配给它?
    • 取决于您的需要,在此示例中 $_COOKIE 在当前请求中填充,否则 - 将在下一个请求中填充
    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2013-11-23
    • 2011-03-14
    相关资源
    最近更新 更多