Php 曲奇不会变软

Php 曲奇不会变软,php,cookies,unset,Php,Cookies,Unset,我无法将饼干取出 cookie集:(id,别名) 曲奇饼没洗?(id,别名) 我做错了什么?把时间设回一小时,而不是那个大数字,怎么样 setcookie("alias", "", time()-3600); 把时间设回一小时,而不是那么大的数字,怎么样 setcookie("alias", "", time()-3600); 使用您的示例,我创建了以下测试: <?php ob_start(); echo '<pre>'; setcookie("id","0001",

我无法将饼干取出

cookie集:(id,别名)

曲奇饼没洗?(id,别名)


我做错了什么?

把时间设回一小时,而不是那个大数字,怎么样

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

把时间设回一小时,而不是那么大的数字,怎么样

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

使用您的示例,我创建了以下测试:

<?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
(
)
Array
(
)
第二次重新加载时:

<?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();

?>
因此,您的代码似乎正在重置往返的cookie

编辑

以下是:

或将打印:

setcookie('my', 'cookie', time()+3600, '/my/path/');
(点击重新加载几次)

如果您需要告诉浏览器忘记cookie,请使用
setcookie()
,并将时间设置回原来的时间(我至少使用24小时)。如果需要
$\u COOKIES
数组来忘记该值,请使用
unset()

编辑

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

例如

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

setcookie('my', 'cookie', time()+3600, '/', '.example.com');
或者允许包含在子目录中的路径

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

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


使用您的示例,我创建了以下测试:

<?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
(
)
Array
(
)
第二次重新加载时:

<?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();

?>
因此,您的代码似乎正在重置往返的cookie

编辑

以下是:

或将打印:

setcookie('my', 'cookie', time()+3600, '/my/path/');
(点击重新加载几次)

如果您需要告诉浏览器忘记cookie,请使用
setcookie()
,并将时间设置回原来的时间(我至少使用24小时)。如果需要
$\u COOKIES
数组来忘记该值,请使用
unset()

编辑

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

例如

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

setcookie('my', 'cookie', time()+3600, '/', '.example.com');
或者允许包含在子目录中的路径

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

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



unset()
取消设置PHP变量
setcookie()
是用于向浏览器发送小文本包的头指令。它们是否从同一域和目录发送?您没有明确设置域和目录,因此这可能是问题的根源。就是这样,我们在第一个答案中进行了长时间的交谈,非常感谢
unset()
unsets PHP变量
setcookie()
是用于向浏览器发送小文本包的头指令。它们是否从同一域和目录发送?您没有明确设置域和目录,因此这可能是问题的根源。就是这样,我们在第一个答案中进行了长时间的交谈,非常感谢这是我一直以来的做法,我读过的所有内容都使用了一个小时作为结束时间,所有这些都是设置它的全部内容。我不认为这与
setcookie()有任何不同
OP在问题中使用了一个例子,时间被向后推了十年,一个小时有什么神奇的地方(特别是当时区改变可以避免这一点时)。这个“非常大的数字”没有错;这正好是十年,PHP应该能够处理得很好。我一直都是这样做的,我读过的每一篇文章都以一个小时作为结尾,所有的内容都是用什么来设置的。我不认为这与OP在问题中使用的
setcookie()
示例有什么不同,在这个示例中,时间被放回十年,一个小时有什么神奇的地方(特别是当时区改变可以避免的时候);这正好是十年,PHP应该能够处理得很好。如果您只发送了标题,它将不会出现在
$\u COOKIE
数组中,因为这是一个请求数组。只有在后续加载时才会设置
$\u COOKIE
数组。当然(请参见问题下方的注释)。我认为OP没有考虑往返,也不理解unset做什么。还是你在说别的?我想我理解你,但我不知道下一步该怎么办…:?如果您试图取消浏览器上的cookie,您的
setcookie()
将完成此操作。如果在同一请求期间需要取消设置cookie,请使用“取消设置”影响本地
$\u cookie
数组。此外,请记住,如果您向浏览器输出了任何内容(包括空格),则不能使用
setcookie()
。可能会有一个警告,你可能会