14

我正在重构一些代码,发现了一些我从未见过的东西。该函数用于用户登录时设置cookie:

  function setUserCookie($name, $value) {
     $date = date("D, d M Y H:i:s",strtotime('1 January 2015')) . 'GMT';
     header("Set-Cookie: {$name}={$value}; EXPIRES{$date};");
  }

现在我已经被分配到重构代码,我打算使用setcookie根据 php.net 基本上做同样事情的函数。

我的问题是:两者之间有什么区别,我应该使用哪一个?

注意:这段代码是很久以前写的,所以我假设当时setcookie不存在?

4

5 回答 5

8

没有充分的理由不使用 setcookie。上面的代码没有正确编码名称和值,因此这至少是重构的一大好处。

于 2013-06-06T21:09:45.740 回答
5

这两个函数之间的区别在于,它header()是设置 HTTP 标头的通用函数,而setcookie()专门用于设置Set-Cookie标头。

header()因此接受一个包含完整标题的字符串,同时setcookie()接受几个特定于 cookie 的参数,然后Set-Cookie从它们创建标题。

于 2017-02-24T11:35:55.437 回答
4

这是一个不能使用 setcookie 的用例

  • 你在 PHP<7.3 上运行一个网站
  • 您必须设置“SameSite”cookie 属性

您可以通过利用 setcookie 中的错误来实现这一点,但我不会依赖错误,因为它会随着时间的推移而得到修复:setcookie('samesite-test', '1', 0, '/; samesite=strict');

或者您可以使用 PHP标头函数:header("Set-Cookie: samesite-test=1; expires=0; path=/; samesite=Strict");

请注意,设置samesite属性时需要安全选项

于 2020-10-20T19:02:27.203 回答
2

一个很大的区别是,setcookie 总是设置 host_only=false 并且你无能为力。

因此,如果出于任何原因必须设置 host_only=true ,则必须使用标头方法。我所知道的。

于 2019-08-26T11:16:03.220 回答
1

setCookie我以编程方式复制了我认为的确切行为 。这是我的实现,如果它对其他人有用的话。

function setUserCookie($name, $value, $expires = 0, $path = "", $domain = "", $secure = false, $http_only = false) {
   $value = rawurlencode($value);
   date_default_timezone_set('UTC');
   $date = date("D, d-M-Y H:i:s",$expires) . ' GMT';
   $header = "Set-Cookie: {$name}={$value}";
   if($expires != 0) {
     $header .= "; expires={$date}; Max-Age=".($expires - time());
   }
   if($path != "") {
     $header .= "; path=".$path;
   }
   if($domain != "") {
     $header .= "; domain=".$domain;
   }
   if($secure) {
     $header .= "; secure";
   }
   if($http_only) {
     $header .= "; HttpOnly";
   }
   header($header, false);
}

与您的函数的区别正是与setCookie(更多参数,如自定义过期、路径、域、安全和 httpOnly)的区别。特别要注意“header”(false)的第二个参数,以便可以放置多个具有不同调用函数的cookie。

于 2021-09-12T21:57:37.920 回答