设置饼干不删除饼干


setcookie not removing cookie

我真的不知道这里有什么问题。

我有一个名为"login.php"的脚本,可以完美运行。 它是使用 AJAX 调用的,如果它成功返回,页面将刷新,用户将登录。 该 Cookie 在该页面上设置

setcookie("main", $row[0], time() + 3600, "/")

然后我有一个名为"logout.php"的脚本。 它的调用方式相同(AJAX,然后页面刷新)。 它只有两行:

<?php
    setcookie("main", "", time() - 3600, "/");
    echo "Done";
?>

从页面调用它不起作用,所以我只是在浏览器中加载注销.php。 输出是"完成",但在 Chrome 中检查我的 cookie 显示 cookie 仍设置为"1"(即 $row[0])并在登录.php中设置的时间过期。

登录.php和注销.php都位于同一个文件夹中,即根目录,它与其他所有内容是同一文件夹。

早些时候,这是有效的,但我所做的唯一更改是使网站上的标题栏成为自己的文件(仍在根目录中),并为注销按钮获取JavaScript功能,这只是一个AJAX调用和一些jQuery悬停效果,并使其成为自己的脚本文件,该文件位于_js文件夹中。 但是我根本没有更改注销.php所以当我直接导航到它时它应该仍然有效,对吧? 我的 setcookie 命令是否有问题,或者可能导致它的其他问题是什么?

编辑:我尝试将其设置为在100秒内过期而不是-3600,然后尝试更改其名称,以便我可以将其识别为完全独立的cookie。 他们都没有出现。 饼干根本没有设置。

编辑2:我恢复到上次提交,一切恢复正常。 我不知道为什么通过创建一些新文件(注销.php根本没有更改)来重组我的网站会使某个脚本无法创建cookie。

Cookie 必须在任何内容进入客户端之前进行设置。在调用 setcookie 之前,请确保您没有向客户端发送任何内容,因为它实际上是通过请求返回的Set-Cookie标头。

包含文件中的空格很小就可以破坏这一点。(您说您处理过其他文件,请检查所包含的任何内容是否包含任何内容,例如调试回显或<?php ... ?>括号之外的空格)

作为一般的经验法则,如果我有一个完全是PHP代码的文件,我只包含开始标签(<?php)并免除最后一个。PHP 仍然会解析和运行,但这避免了文件末尾的任何空格,这些空格可能会出现问题。例如

我的代码文件.php

<?php
  define('...', ...);
  function ...(){ }

另外,您提到了使用chrome。在 chrome 中打开调试器 (ctrl+shft+i),然后单击"网络"标签。然后找到您的注销呼叫并选择它,然后单击标头并验证您的 cookie 是否被清除。(同样,您可以单击"资源"并在"Cookie"下查看任何集合。