Помогите с настройкой сеанса - PullRequest
0 голосов
/ 03 октября 2009

Мой другой вопрос был немного расплывчатым, поэтому ...

Это ситуация.

У меня есть xml-лента, которая генерирует случайную строку из 24 символов при каждом обновлении страницы.

Итак, когда пользователь посещает мой сайт и попадает на страницу с названием 'how-to-make-blue-widgets.php' - его уникальная строка генерируется, например, как 38jsue710ppahchd67ywha94 .

Теперь, когда этот пользователь нажимает на другую страницу, скажем «how-to-make-red-widgets.php» - лента создает новую строку: 836aeq88udh761aso09kjs21 .

Я хочу сохранить первое значение, созданное фидом во время посещения пользователя на каждой посещенной странице.

Я использую сеансы, и вот мой код:

  // 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 ]

4 голосов
/ 03 октября 2009

Попробуйте

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

с новым сеансом.

Когда вы читаете XML-документ с помощью simplexml_load_string () libxml (библиотека, управляющая php-dom и php-simplexml за сценой), создаст представление dom документа в памяти. Все объекты SimpleXMLElement, которые «принадлежат» документу XML, ссылаются на одно и то же представление. Без этого представления о домене элементы SimpleXMLE более или менее бесполезны.
Без явного приведения к строке вы сохраняете SimplXMLElement в _SESSION. В конце экземпляра php или при вызове session_write_close () _SESSION сериализуется, а вместе с ним и SimpleXMLElement. Но SimpleXMLElements не сохраняют представление libxml dom, которому они принадлежат, когда они сериализуются. И затем, когда они снова не сериализуются, они больше не ссылаются на действительный dom, и PHP выдает предупреждение

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

Поскольку вас не интересует элемент SimpleXMLElement, но его текстовое содержимое просто приводит его к (string), в то время как представление dom (все еще) допустимо. Вы получите содержимое в виде «нормальной» строки, которую можно (конечно) сериализовать.

2 голосов
/ 03 октября 2009

Попробуйте это:

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'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...