3

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

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

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

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

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

从页面调用它不起作用,所以我只是在浏览器中加载了 logout.php。输出是“完成”,但在 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。

4

1 回答 1

3

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

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

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

我的代码文件.php

<?php

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

  function ...(){ }

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

于 2012-04-17T16:07:02.263 回答