删除一个cookie


260

当我想删除Cookie时,我尝试

unset($_COOKIE['hello']);

我从firefox的cookie浏览器中看到该cookie仍然存在。我如何才能真正删除Cookie?


您可能会$cookie->delete()github.com/delight-im/PHP-Cookie中找到帮助。问题中的代码仅删除服务器端已解析的属性。Cookie仍将驻留在客户端上。
caw

Answers:


280

你可以试试这个

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

141
我了解这是一个示例,但是请永远不要将用户名或密码存储在Cookie中。
tamasd 2014年

3
毫无意义unset($_COOKIE['Hello']);。如果将其删除,它什么也不会改变。
machineaddict 2014年

30
unset($_COOKIE['Hello']);如果您可能稍后在代码中的某个地方检查Cookie,则@machineaddict 实际上很重要。
Andreas Hultgren 2014年

4
工作正常,但尝试重新加载页面时。它看到cookie设置了旧数据的原因是什么?
Nilesh patel

9
=======不能在Chrome中工作========我今天尝试了这段代码,当我使用google chrome访问该网站,然后进入chrome开发人员工具时,可以看到到期时间设置为时代之前的1秒钟(例如1969-12-31 23:59:59),但是当我下一次提交该页面时,cookie会提交给服务器。当我将-1更改为1(例如1970-01-01 00:00:01)以给出以下命令时:setcookie('Hello',null,1,'/'); 然后chrome达到了预期的效果,没有提交Cookie
Peter Hinds

284

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

setcookie("hello", "", time()-3600);

然后,cookie将在页面下次加载时过期。


10
将时间设置为0(纪元)怎么样?=]
斯特拉格2009年

12
如果您将日期过长,则IE会对其进行吠叫操作,即不会删除该值。
朱利安

52
@strager 手册指出:如果设置为0或省略,则cookie将在会话结束时(浏览器关闭时)过期。 那并不是真的删除cookie。我真的不知道IE是否会执行Julien所说的,但是IE可能会做一些奇怪的事情。
扬尼斯2011年

31
另外,也不要忘记实际取消设置($ _COOKIE [“ hello”]),因为如果页面的其余部分上有代码查看$ _COOKIE [“ hello”],它仍然会设置它。我只是被这一点。
Magmatic

12
再加上设置路径是一个好主意,所以setcookie('hello','',time()-3600,'/');
Stephan Weinhold

226

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

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

3
这是最好的方法,因为您无需刷新页面!
MaxV

19
我一直翻页,答案越来越好笑。但这是最好的,不要在这里看看。
2014年

23
仅供参考,如果您使用路径设置Cookie,则还需要在此setcookie调用中包括该路径:setcookie('key', '', time() - 3600, '/');
Gavin

1
@Gavin感谢您的提示。我想知道为什么它没有删除,但是unsetting成功了。
stinkysGTI 2014年

1
对于正在检查cookie是否存在并关心带有null值的cookie的任何人,您都需要改用array_key_exists(),因为null不会通过isset()检查找到带有值的cookie 。
利斯,16th

27

要可靠地删除cookie,不足以将其设置为过去的任何时间(由您的PHP服务器计算)过期。这是因为客户端计算机可以并且经常确实具有与服务器不同的时间。

最好的做法是一个空白的cookie,其到期一秒到覆盖当前饼干在未来历元之后(1970年1月1日00:00:00 UTC),像这样:

setcookie("hello", "", 1);

13
如果我错了,请更正我,但是将其设置为“ 1”会将其设置为在纪元之后的一秒,而不是将来的一秒。我相信您对时区差异的看法是正确的,因此最好的解决方案是将其设置为过去2天(因此,即使是最远的时区也仍会取消设置Cookie)。
PaulSkinner 2013年

@PaulSkinner纪元日期与时区无关,计算机会为您执行该计算。
AlexR

3
@AlexR是的。虽然并不能真正回答我的观点。据我了解,除非我弄错了,否则上面的代码确实将cookie设置为在过去(历时一秒)后过期。
PaulSkinner 2014年

@PaulSkinner当然,您的其余评论都很好。
AlexR 2014年

9
为“ 1” +1。我不明白为什么其他所有人都只在过去一个小时内设置已删除的Cookie的原因。
Meisner

20

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

要实际删除Cookie,请设置过去的过期日期:

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

1
unset()Cookie 不需要了吗?
Pratik

2
@PratikCJoshi仅当您的代码稍后会查找它时。
AlphaMycelium

14

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

我使用路径值“ /”设置了cookie,但是在尝试清除它时没有任何路径值,因此无法清除。因此,这是一个有效的示例:

设置cookie:

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

清除Cookie:

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);

希望能有所帮助。




7

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

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

服务器在嗅探端口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

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


4

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

“如果将过期时间,路径或域的cookie设置为非默认值,则在删除该cookie时必须再次提供这些相同的值,才能正确删除该cookie。” 引用“学习PHP5”一书。

所以这段代码应该工作(对我有用):

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

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

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


1
这是可靠的,这就是为什么。将值设置为无和过去的某个时间(但距离IE有时不喜欢它离我阅读的内容不太远)的组合可以全面使用。
PaulSkinner 2013年

空字符串与''是不同的东西null
orev

3

要删除所有cookie,您可以编写:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}

3
除非它们具有与setcookie默认设置相同的路径和域设置,否则实际上不会删除这些cookie。
Noishe 2014年

2

如果您要“删除” cookie,只需将过期日期设置为一小时前,如下所示:

setcookie ("TestCookie", "", time() - 3600);

要么

setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);

资源: http //www.php.net/manual/en/function.setcookie.php

您应该filter_input()对访问者可以输入/操作的所有全局函数使用该函数,如下所示:

$visitors_ip = filter_input(INPUT_COOKIE, 'id');

您可以在这里了解更多有关此的信息:http : //www.php.net/manual/en/function.filter-input.php和此处:http : //www.w3schools.com/php/func_filter_input.asp


2

我知道自创建该主题以来已经有很长时间了,但是在该解决方案中我看到了一个小错误(我可以这样称呼它,因为它是一个细节)。我同意更好的解决方案可能是以下解决方案:

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

但是,在当前情况下,在未设置功能起作用的每种情况下,您都删除cookie,并在未设置功能不起作用的情况下立即创建新的过期的cookie。

这意味着即使取消设置功能起作用,它在计算机上仍将具有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;
        }

感谢,并有一个愉快的一天 :)


函数未设置是为PHP的逻辑设计的(如果您想使用变量$ _COOKIE ['Hello'],则不能设置它,因为它未设置)。函数setcookie是供导航器使用的。2个不同的用途,功能的顺序对实际代码没有影响。
Kalzem 2014年

实际上,我知道它是的,但是如果您绝对要确保已取消设置/删除cookie,因此您可以正确使用这两种解决方案,那么在取消这些设置然后取消设置这些设置之前,取消设置这些设置会比较干净。然后重新创建一个过期的cookie ...如果您明白我的意思?
格雷格

是的,很抱歉,现在才回复:)我已经发送了它,因为我看到人们以另一种方式来做..但是我认为它看起来更聪明。
格雷格

2
$cookie_name = "my cookie";
$cookie_value = "my value";
$cookie_new_value = "my new value";

// Create a cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds

// Get value in a cookie,
$cookie_value = $_COOKIE[$cookie_name];

// Update a cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");

// Delete a cookie,
setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.

2

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

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

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

那就是它完美删除的方式。


1

您可以根据Cookie值设置会话变量

session_start();

if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
$_SESSION['loggedin'] = "true";
}

echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");

1

您可以简单地使用以下定制功能:

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');


1

输入0时间时,对于浏览器来说是“现在”(实际上从现在开始是+0),它会删除Cookie。

setcookie("key", NULL, 0, "/");

我在chrome浏览器中检查了它,它给了我:

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM

否。只需阅读文档即可。“如果设置为0或省略,则cookie将在会话结束时(浏览器关闭时)过期。”
DrLightman

@DrLightman谢谢您的出席,能否请您引用文档?
阿米尔·佛

function.setcookie.phpexpires参数。“如果设置为0或省略,则cookie将在会话结束时(浏览器关闭时)过期。”
DrLightman

1

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

setcookie('cookiename', false);

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


-1

您必须使用服务器中的php以及浏览器的js删除cookie。(它们是使用php制作的,但cookie文件也位于浏览器客户端中):

一个例子:

if ($_GET['action'] == 'exit'){
            // delete cookies with js and then in server with php:
            echo '
            <script type="text/javascript">
                var delete_cookie = function(name) {
                     document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                };
                delete_cookie("madw");
                delete_cookie("usdw");
            </script>
            ';
unset($_COOKIE['cookie_name']);
unset($_COOKIE['cookie_time']);

您不需要JavaScript即可设置/删除Cookie值。php函数setcookie将为您做到这一点php.net/manual/en/function.setcookie.php
Michael Khalili

-5

你们中的大多数人都忘记了这仅适用于本地计算机。在域上,您将需要类似此示例的模式。

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);

1
如果省略了domain参数,则表示当前域。
尘狼

我的意思是说您的答案不正确。它将适用于任何域,而不仅仅是本地计算机,因为它将自动使用当前域。您的评论意味着您得罪了什么?
尘狼

您是否还在阅读代码上方的文字?别烦我了,我在工作。我已经和你说话了。
Peter Gruppelaar '16

我不明白,如果其他用户指出您的答案有误,您为什么会因此而烦恼。setcookie适用于任何域,无论是否为localhost。
xorinzor '16

因此,如果每个人都说是这种情况……那么我的答案肯定有问题……在这篇文章中指出的fct帽子没关系吗?……你只想要某种方向的答案,并忽略所有在类似情况下工作的全球用户……我明白了……别再烦我了,我的回答是没有错的。
Peter Gruppelaar'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.