PHP - cookie变量和会话变量的有趣行为

时间:2010-11-14 01:43:13

标签: php cookies

我在下面写了一个小PHP脚本来演示我的问题。像下面这样运行以下代码:http://localhost/test.php?test=10,然后运行http://localhost/test.php?test=11,然后运行http://localhost/test.php?test=12等。您将看到回显到屏幕的数字始终位于网址号后面1位数?!也许是因为我不能吃饼干并立即阅读相同的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"];
}

3 个答案:

答案 0 :(得分:4)

  

也许是因为我不能吃饼干并立即阅读相同的cookie?

完全。您发送的cookie仅在下一个请求中以$ _COOKIE数组提供,因为$ _COOKIE超全局数组充满了客户端请求中的数据。并且首先要求它什么都不是。

答案 1 :(得分:0)

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

      

    也许是因为我不能吃饼干并立即阅读相同的cookie?

    是的,那是真的。你刚刚证明了这一点。

答案 2 :(得分:0)

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