帮助设置会话

时间:2009-10-03 17:09:54

标签: php session

我认为我的另一个问题有点模糊,所以...

就是这种情况。

我有一个xml feed,它会在每次刷新页面时生成一个随机的24个字符串。

因此,当用户访问我的网站并登陆名为“how-to-make-blue-widgets.php”的页面时,他们的唯一字符串会生成为 38jsue710ppahchd67ywha94

现在,当该用户点击另一个页面时,让我们说'how-to-make-red-widgets.php' - 该Feed会创建一个全新的字符串: 836aeq88udh761aso09kjs21

我想要做的是在访问每个页面的整个用户访问期间存储Feed创建的第一个值。

我正在使用会话,这是我的代码:

  // Start Session
  session_start();

  ...

  // Don't worry about this bit - $sessionId is the random string
  if($xmlobj = simplexml_load_string(file_get_contents($xml_feed)))
  {
        $result = $xmlobj->xpath("TrafficMeta");
        $sessionId = $result[0]->sessionId;
  }


  // Main Part
  if(isset($_SESSION['sessionString'])): // if 'random' session is set
        $string = $_SESSION['sessionString'];
  else: 
        $string = $sessionId; 
        $_SESSION['sessionString'] = $string;
  endif;

  echo $_SESSION['sessionString'];

当我第一次访问该网站时,它工作正常,脚本会吐出会话字符串,但是当我刷新时,它什么都不输出。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

尝试

$sessionId = (string)$result[0]->sessionId;

全新的会议。

当您使用simplexml_load_string()libxml(在场景后面驱动php-dom和php-simplexml的库)读取xml文档时,将在内存中创建文档的dom表示。 “属于”xml文档的所有SimpleXMLElement对象引用相同的表示。没有这个dom表示,SimpleXMLElements或多或少都没有价值 如果没有显式转换为字符串,则在_SESSION中存储SimplXMLElement。在php实例结束时或者调用session_write_close()时,_SESSION会被序列化并与之一起使用SimpleXMLElement。但SimpleXMLElements在序列化时不会保留它们所属的libxml dom表示。然后,当它们再次被反序列化时,它们不再引用有效的dom,并且PHP会发出警告

Warning: unserialize(): Node no longer exists in ....

由于您对SimpleXMLElement不感兴趣,但它的文本内容只是将其转换为(字符串),而dom表示(仍然)有效。您将获得内容作为“正常”字符串,可以(当然)序列化。

答案 1 :(得分:2)

试试这个:

if (!isset($_SESSION['sessionString'])) {
    if ($xmlobj = simplexml_load_string(file_get_contents($xml_feed))) {
        $result = $xmlobj->xpath("TrafficMeta");
        $_SESSION['sessionString'] = $result[0]->sessionId;
    } else {
        // Error: no session ID available
    }
}

echo $_SESSION['sessionString'];