$ _COOKIE []在设置后似乎没有反映出变化

时间:2010-08-31 01:13:18

标签: php cookies

我不记得过去使用过Cookies有很多问题,但我一直在玩,并遇到了一些意想不到的结果。

(我在localhost上运行,因此我的域设置)

<?php
$sessionCookie = rand();
setcookie("crav_auto_login_cookie", $sessionCookie, false,"/crav/", false);
echo "Cookie Set<br/>";
echo "Cookie equals: ".$_COOKIE["crav_auto_login_cookie"]."<br/>";
echo "should equal: ". $sessionCookie;
?>

这将在以下输出中产生:

Cookie Set
Cookie equals: 457718770
should equal: 318511886

我显然遗漏了一些东西,但不确定为什么值不同。是因为cookie是在页面调用时加载的,$_COOKIE["crav_auto_login_cookie"]是从页面打开时调用的实例返回结果而不反映新设置的值?如果是这样的话,为什么呢?

3 个答案:

答案 0 :(得分:5)

setcookie设置标头以发送回客户端以设置Cookie。在下一个请求之前,$_COOKIE数组(其中包含从客户端发送的发送)中的新Cookie无法访问。

以下是用户访问您网页时事件的简化过程:

  1. 用户的浏览器向您的服务器发送请求。此请求包含标头,包括为您的域为该用户设置的Cookie。 PHP根据此请求中的数据填充$_COOKIE(以及$_GET$_POST等)数组。
  2. 服务器解析用户的请求,并设置响应。此响应以响应标头开头(包括您通过header自行设置的所有标头,以及通过setcookie设置的Cookie标头)。所有标题必须在任何页面输出之前(正如您可能遇到的那样,如果您在开始输出页面内容后尝试发送更多标题,PHP将给您一个错误。)
  3. 服务器发送页面内容(实际上,标题和内容是同一传输的一部分)。
  4. 服务器和客户端之间的连接关闭(为了讨论的目的,让我们忽略AJAX)。
  5. 客户端解析收到的标题和内容,根据需要设置Cookie,然后呈现页面(实际上,这可能会在接收页面时连续发生)。
  6. 因此,当客户端接收并处理set-cookie标头时,客户端已经完成了与服务器的通信,这就是为什么在下一次请求之前cookie不会出现在PHP中。

答案 1 :(得分:1)

来自“常见陷阱”下的PHP.net's setcookie documentation

  

直到明天才会看到Cookie   下一页加载的页面   cookie应该是可见的。去测试   如果成功设置了cookie,   在下次加载时检查cookie   Cookie过期前的页面。

答案 2 :(得分:1)

你可以直接覆盖超全球。

$ sessionCookie = rand();
setcookie(“crav_auto_login_cookie”,$ sessionCookie,false,“/ crav /”,false); $ _COOKIE [“crav_auto_login_cookie”] = $ sessionCookie;

echo“Cookie Set”;
echo“Cookie equals:”。$ _ COOKIE [“crav_auto_login_cookie”];
echo“应该相等:”。 $ sessionCookie;