setcookie无法删除cookie

3

我真的不知道问题出在哪里。

我有一个名为“login.php”的脚本,它运行得非常完美。它通过 AJAX 调用,如果成功返回,页面会刷新并且用户已经登录。在该页面上使用以下代码设置 cookie:

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

我有一个叫做“logout.php”的脚本。 它以相同的方式被调用(通过 AJAX 和页面刷新)。它只有两行代码:

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

从页面中调用它并没有起作用,所以我只是在浏览器中加载了logout.php。输出结果为“done”,但是在Chrome中检查我的cookie时,我发现cookie仍然设置为“1”(即$row [0]),并且在login.php中设置的时间到期。

login.php和logout.php都在同一个文件夹中,即根目录,这与其他所有内容都在同一个文件夹中。

早些时候,这是有效的,但我所做的唯一更改是使网站标题栏成为自己的文件(仍在根目录中)并将注销按钮的JavaScript功能(仅是AJAX调用和一些jQuery悬停效果)提取出来,形成自己的脚本文件,该文件位于_js文件夹中。但我没有改变logout.php,所以当我直接导航到它时,它应该仍然有效,对吗?我的setcookie命令有问题吗?还是其他问题导致它无法工作?

编辑:我尝试将其设置为在100秒后过期,而不是-3600,然后尝试更改其名称,以便我可以将其识别为完全独立的cookie。两者都没有使它显示出来。cookie根本没有被设置。

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


你确定你在调用同一个域名吗?也许你在www.domain.com上设置了cookie,而你想在domain.com上删除它? - Ata S.
我将它们都设置为“/”,所以应该是一样的,对吧?它们都在同一个文件夹中。 - Andrew Latham
我直接复制了setcookie,所以我认为域名是隐式的,这意味着它应该是相同的,除非我弄错了。 - Andrew Latham
你可以尝试使用-1和time()代替time()-3600吗?虽然这不合逻辑,但可能存在错误。另外,请检查Chrome开发者工具的网络部分,看看是否实际调用了logout.php。以下是Chrome开发者工具网络部分的示例截图:http://goo.gl/dxCCI - Ata S.
1个回答

3
在任何内容发送到客户端之前,必须先设置Cookies。请确保在调用setcookie之前没有向客户端发送任何内容,因为它实际上是通过请求返回的Set-Cookie头。
即使是包含文件中的一个空格也可能会破坏这个过程。(您说您正在处理其他文件,请检查是否包含的任何内容都没有类似于调试回显或在括号之外的空格)
作为一般准则,如果我有一个完全由PHP代码组成的文件,我只包含开头标签(
mycodefile.php
<?php

  define('...', ...);

  function ...(){ }

此外,您提到使用Chrome。在Chrome中打开调试器(ctrl+shft+i),然后单击网络选项卡。然后找到您的注销调用并选择它,然后单击头文件并验证是否清除了cookie。(同样,您可以单击资源,然后查看Cookie下的任何设置。)

是的,我同意,如果在<?php标记之前有空格或换行符,那就是原因。 - Ata S.
logout.php 只有这两行代码,所以如果我直接导航到该页面,在调用 setcookie 之前不认为已向客户端发送任何内容。没有空格,只有在 setcookie 前面有一个制表符。 - Andrew Latham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接