2024-02-28 09:00:02

移除一块饼干

当我想要删除Cookie时,我会尝试

unset($_COOKIE['hello']);

我在firefox的cookie浏览器中看到cookie仍然存在。我怎么才能真正去掉饼干呢?


当前回答

如果你想从你当前的所有域中完全删除cookie,那么下面的代码一定会帮助你。

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");

这段代码将删除cookie变量完全从所有的域,即;" / " -它表示cookie变量的值为所有域设置,而不仅仅是当前域或路径。Time() - 300表示它设置为以前的时间,因此它将过期。

这就是它被完美删除的方式。

其他回答

我知道这个主题已经创建了很长时间,但我在这个解决方案中发现了一个小错误(我可以这样称呼它,因为它是一个细节)。 我认为更好的解决方案可能是这样的:

if (isset($_COOKIE['remember_user'])) {
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            return true;
        } else {
            return false;
        }

但是,在目前的情况下,您删除了所有unset函数工作的情况下的cookie,并立即创建新的过期cookie,以防unset函数不起作用。

这意味着即使unset函数工作,它仍然会在计算机上有2个cookie。 从逻辑的角度来看,所要求的目标是删除cookie,如果可能的话,如果确实不可能,则使其过期;为了得到“最干净”的结果。

所以,我认为我们最好做的是:

if (isset($_COOKIE['remember_user'])) {
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            return true;
        } else {
            return false;
        }

谢谢,祝您有愉快的一天。

这将在代码中取消设置cookie,但由于$_COOKIE变量在每个请求中都被刷新,因此它只会在下一次页面请求中返回。

要真正摆脱cookie,请将过期日期设置为过去:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);

你可以简单地使用这个自定义函数:

function unset_cookie($cookie_name) {
    if (isset($_COOKIE[$cookie_name])) {
        unset($_COOKIE[$cookie_name]);
        setcookie($cookie_name, null, -1);
    } else { return false; }
}

如果您想删除$_COOKIE['user_account']。 只使用:

unset_cookie('user_account');

如果您将cookie设置为过去过期时间,浏览器将删除它。参见setcookie() delete example at php.net

这是如何PHP v7 setcookie()代码工作时,你这样做:

<?php
    setcookie('user_id','');
    setcookie('session','');
?>

从tcpdump在端口80上嗅探时的输出,服务器向客户端(浏览器)发送以下HTTP报头:

Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

观察以下请求中的数据包,浏览器不再在报头中发送这些cookie