所以我尝试了其他多种解决方案"我的问题(在这个网站和其他网站上)并没有找到适合我的解决方案。
我试图设置一个cookie来登录我的用户,然后在注销时删除该cookie。这是我的代码。
list ($check, $data) = check_login($dbc, $_POST['Username'], $_POST['Password']);
if ($check) {
setcookie('Username', $data['Username'], time() + 60*60*24*90);
header('Location: RedirectPage.php');
其中,检查已在登录表单上输入的用户名和密码(并已接受),如果是,则使用cookie"用户名"使用从数据库中提取的用户名设置,并且时间等于90天,然后重定向用户。
这部分工作正常,它会按预期记录用户。
但是在删除部分中,
header('Refresh: 0;');
setcookie('Username', '', time() - 60*60*24*90);
unset($_COOKIE['Username']);
require ('RedirectPage.php');
redirect_user();
我按照设置的方式删除cookie,正如预期的那样,删除任何数据并将时间设置为负值,然后为了更好的衡量,我运行未设置的cookie以确保它已经消失。
除此之外,这不起作用。 setcookie(删除)没有做任何事情,并且unset cookie仅在页面运行后运行(在本例中为index.php),并且一旦我点击到另一个页面,或者刷新页面它就会#34 ;忘记" cookie已被删除。
现在进入Chrome检查元素以检查我得到的cookie
Username, "Value" (the withdrawn username), r3gamers.com (domain), / (path), 2015-02-03T13:45:00 (Expires/MaxAge), 19 (Size) and HTTP and Secure are both set as empty.
点击退出按钮后查看该进程,永远不会删除此cookie。唯一可以实际删除cookie的是用新cookie覆盖它(再次登录)或通过inspect元素删除它。
有什么想法吗?据我所知,我正在做一切应该做的事情。
编辑: 我还想提一下,在localhost上测试时,通过netbeans离线这个功能确实有效。然而,当我将页面上传到godaddy为我的网站时,他们停止正常工作。
答案 0 :(得分:3)
我找到了答案。这也是一个愚蠢的答案。这是我用于注销的完整代码文件。
<?php
require_once ('Connection.php');
header('Refresh: 0;');
if (!isset($_COOKIE['Username'])){
header('Location: LoginFunctions.php');
} else {
setcookie('Username', '', time()-60*60*24*90, '/', '', 0, 0);
unset($_COOKIE['Username']);
header('Location: index.php');
}
?>
我无法在这里显示的问题是,开放的php标签上有一个换行符,这意味着它从第2行开始。为什么它最初是这样的我不喜欢知道,但是这个小错误意味着它在localhost上运行并且没有在godaddy上工作。多么令人沮丧。至少我现在已经解决了这个问题。
为了将来使用,对于那些遇到同样问题的人来说,显然godaddy(或大多数托管网站)要求从第1行开始添加,编辑或删除任何cookie,因此包含cookie的php标签必须在线1,没有HTML代码可以在此php标记之前,或任何换行符,php标记必须从第1行开始。
答案 1 :(得分:0)
您没有设置Cookie的路径,我假设您希望它在网站范围内,因此您应该将路径设置为“/”:
setcookie('Username', $data['Username'], time() + 60*60*24*90, '/');
然后,在取消设置时,尝试使用1而不是time() - 60*60*24*90
(还指定路径),否则cookie的过期时间可能会因用户的计算机时钟而异:
setcookie('Username', '', 1, '/');
我认为您的问题确实是未设置的路径:http://php.net/manual/en/function.setcookie.php
如果设置为“/”,则Cookie将在整个域中可用。如果设置为'/ foo /',则cookie仅在/ foo /目录和所有子目录中可用,例如/ foo / bar / of domain。默认值是设置cookie的当前目录。
问题是,如果你在/logout/doit.php中,并且你试图将cookie的到期时间设置为负值,它将创建一个带有路径'/ logout /'的新cookie并设置其到期时间时间。 (而不是在站点范围的cookie上设置过期时间)