2010-08-31 34 views
4

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

(我在本地主机上运行,​​因此我的域设置)

<?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,并且​​返回打开页面时调用的实例的结果,而不是反映新设置的值?如果是这样的话,那为什么?

回答

5

setcookie设置标题发送回客户端以设置cookie。 $_COOKIE阵列(其中包含从客户端发送的发送的的cookie)将无法访问新的cookie,直到下一个请求。

这里是事件的简化进程,当用户访问你的页面:

  1. 用户浏览器发送一个请求您的服务器。此请求包含标题,包括为您的域为该用户设置的Cookie。 PHP根据此请求中的数据填充$_COOKIE(以及$_GET,$_POST等)数组。
  2. 服务器解析用户的请求,并设置响应。此响应以响应标题(包括您通过header设置的任何标题以及通过setcookie设置的标题为开头)开始。所有标题必须位于任何页面输出之前(正如您可能遇到的那样,如果您在开始输出页面内容之后尝试发送更多标题,PHP会给您一个错误)。
  3. 服务器发送页面内容(实际上,标题和内容是同一传输的一部分)。
  4. 服务器和客户端之间的连接关闭(为讨论目的,我们忽略AJAX)。
  5. 客户端解析收到的标题和内容,根据需要设置cookie并呈现页面(实际上,这可能会在接收页面的情况下顺序发生)。

因此,当客户端收到并处理set-cookie头时,客户端已经完成了与服务器的通信,这就是为什么在下一个请求之前cookie不会显示给PHP。

+0

谢谢,我只是在玩了一会之后才注意到它。 – 2010-08-31 01:19:18

+0

不错的解释! – 2010-08-31 02:07:12

1

PHP.net's setcookie documentation下的“常见错误”:

饼干不会成为可见,直到 到的网页上 饼干应该是可见的未来负载。要测试 ,如果cookie已成功设置,则在cookie过期之前, 将在下一个加载 页面上检查cookie。

+0

是。我只是注意到,新设置的一个可以在下一页加载..我想我从来没有尝试设置和获取一个这样的脚本中的cookie,所以我什至没有想到它:P – 2010-08-31 01:18:39

1

你可以直接覆盖超全球。

$ sessionCookie = rand(); (“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”];
回声“应该等于:”。 $ sessionCookie;