删除一个cookie

san*_*ers 243 php cookies

当我想删除Cookie时,我试试

unset($_COOKIE['hello']);
Run Code Online (Sandbox Code Playgroud)

我在firefox的cookie浏览器中看到cookie仍然存在.我怎样才能真正删除cookie?

Re0*_*ess 281

将值设置为"",将到期日期设置为昨天(或过去的任何日期)

setcookie("hello", "", time()-3600);
Run Code Online (Sandbox Code Playgroud)

然后cookie将在下次加载页面时到期.

  • @strager [manual](http://php.net/manual/en/function.setcookie.php)声明:_如果设置为0或省略,cookie将在会话结束时到期(当浏览器关闭时) )._这并没有真正删除cookie.我真的不知道IE会不会像Julien所说的那样,但是IE会做一些奇怪的事情. (51认同)
  • 另外,不要忘记实际取消设置($ _ COOKIE ["hello"]),因为如果页面的其余部分有代码查看$ _COOKIE ["hello"],它仍然会找到它设置.我刚刚得到了这个. (29认同)
  • 如果你把日期放得太远,那么IE就会吠叫并,但这个价值不会被删除. (12认同)
  • 另外,设置路径是个好主意,所以setcookie('hello','',time() - 3600,'/'); (12认同)
  • 把时间设置为0(纪元)怎么样?=] (10认同)

Nik*_* K. 264

你可以试试这个

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

  • 我知道这是一个例子,但请永远不要在cookie中存储用户名或密码. (136认同)
  • @machineaddict`unset($ _ COOKIE ['Hello']);`如果您可以稍后在代码中检查cookie,那么`实际上很重要. (27认同)
  • =======没有在CHROME工作=======我今天尝试了这个代码,当我使用谷歌浏览器访问网站,然后进入chrome的开发者工具,我可以看到过期时间在纪元之前设置为1秒(例如1969-12-31 23:59:59)但是当我接下来提交页面时,cookie被提交给服务器.当我将-1更改为1(例如1970-01-01 00:00:01)时,给出以下命令:setcookie('Hello',null,1,'/'); 然后chrome按预期行事,并且没有提交cookie (8认同)
  • 工作正常,但试图重新加载页面.它看到cookie设置旧数据为什么? (4认同)
  • "unset($ _ COOKIE ['Hello']);`是没有意义的.如果删除它,它什么都不会改变. (3认同)
  • 我绝对不会在时间戳上使用“ -1”。另外,由于时区的原因,我将使用至少为'86401'的值,这样无论您使用哪种语言环境,您都处于1970年1月。它应该不重要,但是可以肯定的是--1不是一个好主意。 (2认同)

Mou*_*oud 216

删除cookie的一种干净方法是清除$_COOKIE值和浏览器cookie文件:

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,如果你使用路径设置cookie,你还需要在这个`setcookie`调用中包含路径:`setcookie('key','',time() - 3600,'/');` (22认同)
  • 我一直走下页面,答案越来越好,很有趣.但这是最好的一个,不要再看这里了. (18认同)
  • 这是最好的方法,因为你不需要刷新页面! (3认同)
  • 对于任何检查 cookie 是否存在并关心以“null”值存在的 cookie 的人,您需要使用 [array_key_exists()](http://php.net/array_key_exists) 来代替,因为带有“null”值的 cookie `isset()` 检查不会找到 null` 值。 (2认同)

小智 26

为了可靠地删除cookie,根据PHP服务器的计算,将其设置为过去的任何时间都是不够的.这是因为客户端计算机可以并且通常确实具有与服务器不同的时间.

最佳做法是使用空白cookie覆盖当前cookie,该空白cookie将在epoch(1970年1月1日00:00:00 UTC)之后的某一秒到期,如下所示:

setcookie("hello", "", 1);
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了,请纠正我,但将其设置为"1"将在时间之后将其设置为秒,而不是将来的某一秒......?我相信你对时区差异是正确的,所以最好的解决方案是将它设置为过去的2天(所以即使是最远的时区仍然会取消cookie). (12认同)
  • +1为"1".我不明白为什么所有其他人都非常注重在过去一小时内设置一个已删除的cookie. (7认同)
  • @AlexR是的.虽然不能真正回答我的观点.根据我的理解,上面的代码确实*将cookie设置为过去(超过纪元一秒),除非我弄错了. (3认同)

Eri*_*lje 20

这将取消代码中的cookie,但由于每个请求都会刷新$ _COOKIE变量,因此它只会返回下一页请求.

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

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);
Run Code Online (Sandbox Code Playgroud)

  • @PratikCJoshi仅当您的代码稍后会查找它时。 (2认同)

小智 14

我的代码中遇到了同样的问题,发现它是一个cookie路径问题.看看这个堆栈溢出帖子:无法删除php set cookie

我使用路径值"/"设置了cookie,但是当我尝试清除它时没有任何路径值,所以它不清楚.所以这是一个有效的例子:

设置cookie:

$cookiePath = "/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);
Run Code Online (Sandbox Code Playgroud)

清除cookie:

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Ali*_*ock 8

如果您将Cookie设置为过去,则浏览器会将其删除.请参阅php.net上的setcookie()删除示例


Jar*_*die 7

请参阅PHP文档中标有" Example#2 setcookie()删除示例 "的示例.要从浏览器中清除cookie,您需要告诉浏览器cookie已过期...浏览器将删除它.unset正如您所使用它只是从COOKIE数组中删除'hello'cookie.


Nul*_*lik 7

当您执行以下操作时,这就是PHP v7 setcookie()代码的工作方式:

<?php
    setcookie('user_id','');
    setcookie('session','');
?>
Run Code Online (Sandbox Code Playgroud)

服务器在嗅探端口80时从tcpdump的输出将以下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
Run Code Online (Sandbox Code Playgroud)

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


小智 7

如果您想从当前的所有域中完全删除 cookie,那么以下代码肯定会对您有所帮助。

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");
Run Code Online (Sandbox Code Playgroud)

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

这样就完美删除了。


Ami*_*ant 7

只需将 cookie 的值设置false为以取消设置,

setcookie('cookiename', false);
Run Code Online (Sandbox Code Playgroud)

PS:-这是最简单的方法。

  • 如果定义了“declare(strict_types=1);”,这将抛出致命错误。 (2认同)

bok*_*ksa 5

要删除 cookie,您只需将该值设置为 NULL:

“如果您为 cookie 设置了过期时间、路径或域的非默认值,则在删除 cookie 时必须再次提供相同的值,以便正确删除 cookie。” 引用自《学习PHP5》一书。

所以这段代码应该有效(对我有效):

设置cookie: setcookie('foo', 'bar', time() + 60 * 5);

删除cookie: setcookie('foo', '', time() + 60 * 5);

但我注意到每个人都将到期日期设置为过去,这是必要的吗?为什么?

  • 空字符串“''”与“null”不同。 (2认同)