如何在PHP中取消设置cookie?

23

我需要弄清楚如何取消设置这个cookie,到目前为止我尝试的一切都失败了。

这是我当前取消设置它的方式,但似乎并不起作用。

setcookie("user_id", $user_id, time() - 7200);

这是我设置的方式:

setcookie("user_id", $user_id, time() + 7200);

我有一个名为set_session_from_cookie()的函数,它会检查 cookie 是否设置,如果设置了,就使用 cookie 开始一个新会话。

问题在于,当我在页面上使用此函数时,我无法注销。我猜测这是因为我无法取消会话。

我使用这个函数的原因是,如果用户希望在结束会话后记住他们的状态,他们可以调用 cookie 重启会话。

function set_session_from_cookie()
{
    if (isset($_SESSION['user_id'])) {
        echo '';
    } else {
        $_SESSION['user_id']=$_COOKIE['user_id'];
    }
}

注销:

<?php
require'core.php';
session_destroy();

setcookie("user_id", "", time() - 7200);
header('Location:/social_learning/site_pages/starter-template.php');

我使用以下代码设置我的cookie:

if ($rememberme == "on") {
    $user_id = mysql_result($query_run, 0, 'id');
    setcookie("user_id", $user_id, time() + 7200);
    $_SESSION['user_id'] = $user_id;
    redirect('home_page.php');
} else {
    if ($rememberme == "") {
        echo 'ok';
        $user_id = mysql_result($query_run, 0, 'id');
        echo $user_id;
        $_SESSION['user_id'] = $user_id;
        redirect('home_page.php');
    }
}

如何在不使用我创建的函数的情况下,使用保存的 cookie 重新启动会话?因为似乎使用该函数导致用户无法注销。

你的 cookie 是否应该是站点范围内的? - Ja͢ck
应该是什么?我怎样知道? - arboles
4
不要使用相对时间来取消 cookie。这会导致取消取决于用户时钟的准确性。使用时间“1”,这将适用于所有人,除了那些认为现在是1970年的时钟真正损坏的人。 - Marc B
我该如何将其设置为1的时间? - arboles
2
这不安全。Cookie 可以很容易地被编辑,而在这种情况下,通过编辑 cookie,某人可以登录为任何用户。你应该对 Cookie 使用某种加密方式。 - Paul
谢谢,我知道这是不安全的。一旦它正常工作,我会添加加密功能。 - arboles
6个回答

36
将cookie的过期日期设置为过去的时间(例如epoch后的一秒钟)。
使用setcookie("yourCookie", "yourValue", 1);
这将导致cookie过期。
使用1而不是0,因为0会将cookie设置为在会话结束时过期。

1被认为是过去的时间吗? - arboles
2
@arboles 时间以UNIX时间戳的形式给出,所以是的,1代表很久以前 :) - Maciej Swic
15
1是“1970年1月1日,上午00:00:01”。 - Vaibhav Gautam
3
更准确地说,它是1,表示“1970年1月1日上午12:00:01 UTC时间”。 :-) - mastazi
如果cookie的域不是默认域,则必须将域作为setcookie函数的第四个参数传递,通常最好始终设置第三个(路径)和第四个(域)参数。 - sepehr

14

解决此问题的方法是,我需要设置正确的路径来取消 cookie,因为我是从不同的文件中取消设置的 cookie。

我通过查找浏览器 cookie 找出了需要使用的取消设置路径,并且一旦在浏览器中找到了该 cookie,路径就会显示在该 cookie 附近。所以我设置了如下 cookie 路径:

setcookie("user_id", $user_id, time() - 1, "/social_learning/site_pages");
最后一个参数是路径。它有效了。
我的原始setcookie看起来像这样:
setcookie("user_id", $user_id, time() + 7200, "");

这就是答案。我喜欢这个更受欢迎的答案没有考虑到你将其设置为负时间并且它没有被取消设置。这个答案更适合这个问题。谢谢。 - Stephen Duffy

6

关于您的代码,目前没有太多安全问题。但是回答您的问题,在PHP中取消cookie的方法就是将过期时间设置为过去的某个时间:

setcookie("user_id", "", time()-10, "/");

"loginform.php" 不是一个有效的域名,这可能是问题所在。

我如何在本地主机上设置域名? - arboles
只需在此 cookie 中放置一个斜杠(如示例中所示),即表示此 cookie 可用于您的整个域。 - mohamed elbou

5

请查看php手册以获取有关setcookie的信息:

http://php.net/manual/zh/function.setcookie.php

以下是有关此过程的注释:

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )

与设置相同的参数必须用于删除Cookie。如果value参数是一个空字符串或FALSE,并且所有其他参数与之前调用setcookie的参数匹配,则具有指定名称的Cookie将从远程客户端中删除。这在内部通过将value设置为“deleted”和过期时间设置为一年前来实现。
因为使用值为FALSE的Cookie会尝试删除该Cookie,所以不应使用布尔值。而应该使用0表示FALSE,1表示TRUE。

我当前正在做这件事,使用与设置相同的参数进行删除,但并没有起作用。 - arboles

4
使用此代码。
  setcookie("CookieName", "", time()-(60*60*24), "/");

无论在哪个网站,这个方法都对我有效。


是的,这意味着将时间从当前时间设置为“昨天”。 - jaxarroyo

1
在 PHP 手册中,你可以通过将过期日期设置为过去来删除 cookie:
setcookie("key","",time()-3600);

在某些情况下,您应该为参数提供路径和域。
实际上,如果您将一个空字符串分配给cookie,它也会被取消设置:
setcookie("key","");

我知道,我目前正在使用这种方法,但它并没有起作用。 - arboles

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