我认为我的另一个问题有点模糊,所以...
就是这种情况。
我有一个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'];
当我第一次访问该网站时,它工作正常,脚本会吐出会话字符串,但是当我刷新时,它什么都不输出。
有什么想法吗?
答案 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'];