2009-10-03 9 views
0

Je tihnk mon autre question était un peu vague ... doncAide à la mise d'une session

Telle est la situation.

J'ai un flux xml qui génère une chaîne aléatoire de 24 caractères à chaque actualisation de page.

Ainsi, lorsqu'un utilisateur visite mon site et atterrit sur une page appelée « comment-faire-bleu-widgets.php » - leur chaîne unique est généré comme 38jsue710ppahchd67ywha94 par exemple.

Maintenant, lorsque cet utilisateur clique sur une autre page, permet de dire « comment-faire-rouge-widgets.php » - l'alimentation crée une toute nouvelle chaîne: 836aeq88udh761aso09kjs21.

Ce que je veux faire est de stocker la première valeur créée par le flux tout au long de la visite de l'utilisateur sur chaque page visitée.

J'utilise des sessions et voici mon code:

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

Il fonctionne très bien quand je visite le site, le script recrache la chaîne de session, mais quand je rafraîchis, il sort rien.

Des idées?

+1

Appelez-vous 'session_start' avant d'utiliser' $ _SESSION'? – Gumbo

+0

Oui, il y a plus de code avant tout cela –

+0

Et le session_start() fonctionne, c'est-à-dire qu'aucun contenu n'a été envoyé au client avant session_start()? Testez-vous votre script avec error_reporting = E_ALL et peut-être display_errors = On? – VolkerK

Répondre

4

Essayez

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

avec une toute nouvelle session. Lorsque vous lisez un document xml avec simplexml_load_string() libxml (la bibliothèque entraînant php-dom et php-simplexml derrière la scène) créera une représentation dom du document en mémoire. Tous les objets SimpleXMLElement qui "appartiennent" à un document XML font référence à la même représentation. Sans cette représentation dom les SimpleXMLElements sont plus ou moins sans valeur.
Sans le transtypage explicite en chaîne, vous stockez un SimplXMLElement dans _SESSION. À la fin de l'instance php ou lorsque session_write_close() est appelée _SESSION, elle est sérialisée et, avec elle, SimpleXMLElement. Mais SimpleXMLElements ne conserve pas la représentation libxml dom à laquelle ils appartiennent lorsqu'ils sont sérialisés. Et puis quand ils sont désérialisés à nouveau, ils ne font pas référence dom plus valide et PHP soulève un avertissement

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

Puisque vous n'êtes pas intéressé par le SimpleXMLElement mais le texte-contenu de celui-ci jettent tout à (string) alors que la représentation dom est (encore) valide. Vous obtiendrez le contenu comme une chaîne "normale" qui peut (bien sûr) être sérialisée.

2

Essayez ceci:

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']; 
+0

@Keith Donegan: Comment portez-vous l'ID de session? Via un cookie ou une URL? – Gumbo

+0

Pour le moment, j'essaie juste d'obtenir la chaîne correctement (ce que VolkerK m'a aidé) - Maintenant je vais passer à ça :) –