我真的不知道这里的问题是什么。
我有一个名为“login.php”的脚本,效果很好。使用AJAX调用它,如果它成功返回,页面将刷新并且用户已登录。使用
在该页面上设置cookiesetcookie("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都在同一个文件夹中,即根目录,与其他所有文件夹都是同一个文件夹。
早些时候,这是有效的,但我做的唯一更改是将网站上的标题栏设置为自己的文件(仍然在根目录中),并为Logout按钮采用JavaScript功能,这只是一个AJAX调用和一些jQuery悬停效果,并使其成为自己的脚本文件,它位于_js文件夹中。但是我根本没有改变logout.php,所以当我直接导航它时它应该仍然有效,对吧?我的setcookie命令有什么问题,或者其他问题可能导致它吗?
编辑:我尝试将其设置为在100秒内过期而不是-3600,然后尝试更改其名称,以便将其识别为完全独立的cookie。他们俩都没有出现。根本没有设置cookie。编辑2:我恢复到最后一次提交,一切都恢复正常。我不知道为什么通过创建一些新文件重新组织我的网站(logout.php根本没有改变)会使某个脚本无法创建cookie。
答案 0 :(得分:3)
必须在任何内容发送到客户端之前设置Cookie。在调用setcookie之前,请确保您没有向客户端发送任何内容,因为它实际上是通过请求返回的Set-Cookie
标头。
包含文件中的空格可能会破坏这一点。 (你说你曾经处理过其他文件,检查没有包含任何内容,例如调试回显或你的<?php ... ?>
括号外的空格)
作为一般的经验法则,如果我有一个专门用于PHP代码的文件,我只包含开始标记(<?php
)并免除最后一个。 PHP仍将解析并运行,但这可以避免文件末尾的任何空格可能会出现问题。 e.g。
<强> mycodefile.php 强>
<?php
define('...', ...);
function ...(){ }
另外,你提到过使用chrome。以chrome( ctrl + shft + i )打开调试器,然后单击网络选项卡。然后找到您的退出电话并选择它,然后点击标题并验证您的Cookie是否已被清除。 (同样,您可以点击资源,然后在 Cookie 下查看任何设置。