cookie 不会取消设置

Posted

技术标签:

【中文标题】cookie 不会取消设置【英文标题】:cookie wont unset 【发布时间】:2011-07-25 17:45:37 【问题描述】:

我无法取消设置 cookie。

cookie 集:(id,别名)

setcookie("id",$data['id'], time()+3600*24*30);
setcookie("alias",$this->nombre, time()+3600*24*30);

cookies 未设置? (id, 别名)

setcookie("id","-1",time()-315360000);
setcookie("alias","",time()-315360000);
unset($_COOKIE['id']);       // additional, but still no..
unset($_COOKIE['alias']);    //    "            "

我做错了什么?

【问题讨论】:

unset() 取消设置 php 变量; setcookie() 是一个头指令,用于向浏览器发送一个小文本包。 它们是从同一个域和目录发送的吗?您没有明确设置域和目录,因此这可能是问题的根源。 就是这样,我们在第一个答案中聊了很长时间,非常感谢 【参考方案1】:

将时间设置为一个小时后,而不是那个大数字如何?

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

【讨论】:

这就是我一直这样做的方式,我所读过的所有内容都用了一个小时作为结束所有的一切都将它放回原处 我认为这与 OP 在问题中使用的 setcookie() 示例没有什么不同,其中时间倒退了十年,大约一小时有什么神奇之处(尤其是当时区变化可以避免这种情况)。 “非常大的数字”没有错;它恰逢十年,PHP 应该能够很好地处理。【参考方案2】:

使用您的示例,我创建了这个测试:

<?php

ob_start();

echo '<pre>';

setcookie("id","0001", time()+3600*24*30);
setcookie("alias","name", time()+3600*24*30);

print_r($_COOKIE);

if ($_COOKIE['id'] || $_COOKIE['alias']) 
    setcookie("id","-1",time()-315360000);
    setcookie("alias","",time()-315360000);


print_r($_COOKIE);

ob_end_flush();

?>

在第一次加载时,它会输出:

Array
(
)
Array
(
)

重新加载时:

Array
(
    [id] => 0001
    [alias] => name
)
Array
(
    [id] => 0001
    [alias] => name
)

第二次重新加载时:

Array
(
)
Array
(
)

看来您的代码正在重置往返的 cookie。

编辑

以下内容:

<?php

ob_start();

echo '<pre>';

setcookie("id","0001", time()+3600*24*30);
setcookie("alias","name", time()+3600*24*30);

print_r($_COOKIE);

if ($_COOKIE['id'] || $_COOKIE['alias']) 
    setcookie("id","-1",time()-315360000);
    setcookie("alias","",time()-315360000);
    unset($_COOKIE['id']);
    unset($_COOKIE['alias']);


print_r($_COOKIE);

ob_end_flush();

?>

要么打印:

Array
(
)
Array
(
)

或将打印:

Array
(
    [id] => 0001
    [alias] => name
)
Array
(
)

http://jfcoder.com/test/cookies.php(点击重新加载几次)

如果您需要告诉浏览器忘记 cookie,请使用 setcookie() 并及时设置时间(我使用至少 24 小时)。如果您需要 $_COOKIES 数组来忘记值,请使用 unset()

编辑

这里有两个可能的问题,一个是 cookie 上的子域不匹配,另一个是路径可访问性问题。

比如……

如果访问者访问的 url 与尝试重置 cookie 的 url 所在的目录不同,您需要使用允许其他路径访问(和重置)该 cookie 的路径设置 cookie。

setcookie('my', 'cookie', time()+3600, '/');

或者允许包含在子目录中的路径...

setcookie('my', 'cookie', time()+3600, '/my/path/');

如果访问者访问的 url 是子域(包括 www),但您希望 cookie 可被所有子域访问,则需要为 setcookie 提供通配符。

setcookie('my', 'cookie', time()+3600, '/', '.example.com');

将允许来自 www.example.com、my.example.com 和 sub.example.com 的 URL 访问和重置 cookie。显然,此时也需要考虑您的路径考虑,因为对于子域参数,您需要包含路径。 / 选择 url 上的所有子目录,. 在域选择子域之前(虽然 sub.sub.domains,我不确定)。

http://php.net/manual/en/function.setcookie.php

【讨论】:

如果您只是发送了标头,它不会出现在$_COOKIE 数组中,因为那是一个请求数组。只有在后续加载时才会设置 $_COOKIE 数组。 当然(请参阅我在问题下方的评论)。我认为 OP 没有考虑往返,也没有理解 unset 的作用。还是你有别的意思? 我想我理解你,但我不知道下一步该做什么...... :? 如果您尝试取消浏览器上的 cookie,您的 setcookie() 将完成此操作。如果在同一个请求过程中需要取消设置cookie,使用unset来影响本地的$_COOKIE数组。 另外,请记住,如果您向浏览器输出任何内容(包括空格),则不能使用 setcookie()。如果您关闭了error_reporting(),则可能会有一条您可能看不到的警告。

以上是关于cookie 不会取消设置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中取消设置 cookie?

无法在 Firefox 中设置和取消设置 Cookie

如何使用JavaScript设置/取消设置cookie

如何使用JavaScript设置/取消设置cookie

PHP无法取消设置cookie [重复]

取消设置cookie的匿名函数