2010-11-14 48 views
0

我在下面写了一个小小的PHP脚本来演示我的问题。运行下面的代码,如下所示:http://localhost/test.php?test=10,然后运行http://localhost/test.php?test=11,然后运行http://localhost/test.php?test=12等等。您将看到显示在屏幕上的数字始终位于url编号后面一位数字?!也许是因为我不能cookie,并立即读取相同的cookie?PHP - Cookie变量和会话变量的有趣行为

 

//If query string has $test, store in session, and cookie for later. 
if($_GET[test]){ 
    $_SESSION['test'] = $_GET[test]; 
    setcookie("test", $_GET[test], time()+60*60*24*30*12*10); //10 years 
} 

//If user comes back later, then get $test from cookie 
if (isset($_COOKIE["test"])){ 
    $_SESSION['test'] = $_COOKIE["test"]; 
} 

echo "session test: " . $_SESSION['test']; 

后来,我用下面的代码解决了这个问题,但是解决它还不够好,我想知道为什么发生这种情况!

这解决了这个问题:

 

if($_GET[cid]){ 
    setcookie("campaignid", $_GET[cid], time()+60*60*24*30*12*10); //10 years 
    $_SESSION['campaignid'] = $_GET[cid]; 
}elseif (isset($_COOKIE["campaignid"])){ 
    $_SESSION['campaignid'] = $_COOKIE["campaignid"]; 
} 

回答

4

也许是因为我不能一个cookie立即读取相同的cookie?

没错。您发送的cookie只能在下一个请求中使用$ _COOKIE数组,因为$ _COOKIE超全局数组填充了客户请求中的数据。首先要求它不是什么。

+0

换句话说,'setcookie'不会将它添加到'$ _COOKIE'中。另外,像这样混合'$ _COOKIE'和'$ _SESSION'就好了,很奇怪。 – Ashe 2010-11-14 01:49:51

0
  1. 从技术上讲,你没有启动一个会话(session_start())和你使用未定义的常量test,但是PHP是“智能”,足以弄清楚你的意思是一个字符串"test"
  2. 究竟是什么问题?

    也许是因为我不能cookie并立即读取相同的cookie?

    是的,的确如此。你刚刚证明了它。

+0

喜欢“智能”的报价。不能同意更多。 – Ashe 2010-11-14 01:52:16

0

在你的第一个片段中,你叫setcookie()。这会向浏览器发送HTTP标头。当您调用setcookie()时,PHP不更新$_COOKIES变量。当cookie由浏览器返回时,$ _COOKIES变量会在下一次脚本调用时更新。