variable de session qui disparait

Répondre
djidji
le 20/05/2008 à 10:52
djidji
Bonjour,
Voilà, le titre est assez explicite.

Je suis entrain de créer un outil de recherche d'offres touristiques.
Celui ci présente plusieurs inconvénients :
_ Premièrement il doit fonctionnait sous eZ Publish (c'est un CMS pour ceux qui ne connaissent pas) celui me "contraint" d'utiliser ses propres librairies de fonctions.

_ Deuxièmement, je doit recherche les offres sur le serveur du Comité Départemental du Tourisme, qui utilise la syndication Tourinsoft, en gros il me retourne des flux xml, et je dois lui en envoyé pour qu'il me retourne les offres qui corresponde à ma recherche.

Donc mon code récupère du xml sur le serveur distant, le traite avec du Dom (celui de eZ Publish) pour en faire de joli tableau.

Je récupère deux flux, le premier, me donne toutes les variables sur lesquelles je peux faire une recherche. Le deuxième, me permet de récupérer certaines valeurs particulières ( valeur des listes, des boutons radios... ).
Je sauvegarde ces deux tableaux en variable de session.

Et là c'est le drame...
Le premier tableau est parfaitement sauvegardé.
Mais le second... mystère et boule de gomme... Lorsque je lui demande de l'afficher dans le code (après l'avoir sauvegardé) il me l'affiche.
Mais avec un autre fichier php, qui m'affiche les variables sessions, il me le retourne vide.

Donc, le problème ne vient ni d'un oublie de " session_start() ", ni d'un quelconque formulaire (image sans source).

Donc je suis bloqué...
Je n'ai pas mit mon code, car il contient pas mal de fonction eZ Publish, et qu'il y a toute une partie sur le traitement des tableaus qui fait environ 200 lignes.
djidji
LA GLOBULE
le 20/05/2008 à 12:26
LA GLOBULE
Si tu n'as pas oublier ton session_start, c'est que à un moment ou un autre, tu écrases ta variable de session.
Ou alors tu regénères un id de session en ne sauvegardant pas tes variables.
moogli
le 20/05/2008 à 14:49
moogli
salut,

pour compléter l'écrasement de variable :

cela peut être du au register globals =on (auto déclaration, des variables $_GET, $_POST, $_COOKIE et $SESSION en variable "normale" ($_SESSION['flux1'] devient $flux1.

le problème est que si tu utilise une variable $flux1 ça se mord la queue (coup classique du $_SESION['pseudo'] et de la variable $pseudo dans une connection d'espace membre.

si c'est le cas :
Vérifie que tes variables n'ont pas de nom identique à celui d'une variable de session. (tu peut mettre register globals à off mais je ne sais pas si les lib que utilise les supportent).

@+
Il en faut peu pour être heureux !!!!!
LupusMic
le 20/05/2008 à 15:01
LupusMic
(moogli) Uniquement s'il a register_global='On', ce qui est fortement déconseillé.

Quel est le backend (fichier plat, mémoire partagée, base de données) de sauvegarde de la session ?

Est-ce que le même code sauvegarde les tableaux, ou sont-ce deux codes différents ?

Quelle est la taille des tableaux ?

Es-tu certain que c'est le second tableau qui disparaît ?

Quelle est la taille de ces tableaux ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
djidji
le 20/05/2008 à 15:59
djidji
Tout d'abords, Merci pour tout ces conseil.

Pour répondre à LA GLOBULE
Je me sert de mes variables de session juste pour faire une sauvegarde, elles ne me servent à rien d'autre dans mon code, donc normalement aucun écrasement possible, j'ai fait un test avec seulement la parti sauvegarde de mes variable, et le deuxième tableau est le seul qui est perdu.

Pour répondre à moogli
Je viens de vérifier avec un petit phpinfo(), register_globals est bien à off, donc le problème ne vient pas de là, de plus la variable en question à bien un nom différent que celui de ma session.

Pour répondre à LupusMic :
_Je dois avouer que je ne sais pas ce qu'est le backend (I'm a noob), avec phpinfo(), il y a une variable qui s'appelle backend dont la valeur est Sablotron (je sais pas si ça correspond)
_ C'est le même code qui sauvegarde les deux tableaux (je le mets plus bas, j'en ai fait une version simplifié)
_ Pour la taille je dois avouer la encore que je sais pas trop de quoi tu parles, j'ai fait un count() le premier fais 7 et le second fait 2 (dans mon cas ce sont des tableaux de tableau (pour faire de jolies lignes)
_ En ce qui concerne la disparition, au que oui j'en suis sûr.. isset() me retourne false en tout cas pour le second et pas pour le premiers tableau

Donc voilà mon code qui fait la sauvegarde :
<?php
session_start();

if (isset($_SESSION['tableau'])) {
$tableau = $_SESSION['tableau'];
}
else { // Utilisation de la syndication pour récupérer la structure
$CDTServer = //la il y a l'adresse pour récupérer mon premier flux
$leXML = utf8_decode(file_get_contents($CDTServer)) ;

$xml = new eZXML(); //objet eZ Publish, qui me permet le parcours avec leur dom
$dom =& $xml->domTree($leXML,array("CharsetConversion"=>true) );

$racine =& $dom->elementsByName( 'CHAMP' );

$tableau = array() ;

// Creation du tableau
$i=0 ;
foreach ( $racine as $champs ){
$lesEnfants = $champs->children() ;
foreach ( $lesEnfants as $gosses ) {
$tableau[$i][$gosses->name()] = $gosses->textContent();
}
$i++;
}

// Sauvegarde du tableau en variable de session
$_SESSION['tableau'] = $tableau ;
}
// récupération des valeurs prédéfinies.
if (isset($_SESSION['valeursPreDef'])){ //Recuppération de la variable de session
$valeurs = $_SESSION['valeursPreDef'];
}
else{
foreach ($tableau as $maligne ) {
if ($maligne['TYPE']==7 or $maligne['TYPE']==8 or $maligne['TYPE']==9 ){

$CDTServer = //ma deuxième adresse pour récupéré mon deuxième flux xml

$leXML = utf8_decode(file_get_contents($CDTServer)) ;

$xml = new eZXML();
$dom =& $xml->domTree( $leXML,array("CharsetConversion"=>true) );

$racine =& $dom->elementsByName( 'LISTE' );

$list = array() ;

$i=0 ;
foreach ( $racine as $champs ){
$lesEnfants = $champs->children() ;
foreach ( $lesEnfants as $gosses ) {
$list[$i][$gosses->name()] = $gosses->textContent();
}
$i++ ;
}
$valeurs [$maligne['NAME']]=$list;
}
}
//Sauvegarde du tableau valeursPreDef pour la session
$_SESSION['valeursPreDef'] = $valeurs;
}
?>


Donc comme vous pouvez le voir, j'ai besoin de mon premier tableau pour créer le second.
Le seul petit truc un peu emmerd*** est que mon deuxième tebleau ($valeurs) à son premier paramètre est vide. Mais le problème ne vient pas de là, j'ai déjà tenté de le faire sans récupérer ce premier paramètre.

PS : désolé pour l'indentation un peu foireuse mais j'arrive pas à faire mieux, la case 50 pixel sur 20 pixel c'est pas top...
djidji
LupusMic
le 20/05/2008 à 19:18
LupusMic
Tu peux utiliser les sessions avec la même interface, mais avec un backend différent. Tu peux remplacer le terme backend par le terme plug-in :)

Chaque backend a ces avantages et ces limitations. une des limitations peut être la taille du tableau sérialisé.

Je t'encourage à relire cette section du manuel.

Comme je le pensais, ce n'est pas le même code qui gère le premier tableau et le second tableau :)

Après tout ce code, est-ce que les données sont bien induites dans le tableau de session :
<?php
var_dump($_SESSION) ;
?>


Pour l'indentation... certes la taille de la fenêtre n'est pas pratique. C'est pourquoi je rédige dans un éditeur de texte.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
djidji
le 21/05/2008 à 09:37
djidji
Ok, je vois ce que tu veux dire par même code. En effet ce n'est pas le même code.

Pour le backend, je ne pense pas que le problème vienne de là, bien que je t'avoue que je ne comprends toujours pas tout dessus. J'ai déjà sauvegardé beaucoup plus de contenu (trois exemplaire de mon premier tableau)

En ce qui conserne le tableau de session, je faisais un :
<?php 
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
?>

Ce qui me permettait de voir à peu près la même chose qu'avec un "var_dump($_SESSION)".
Et dans ma page courante mon deuxième tableau est bien dans ma variable de session.
Mais avec une autre page qui fait :
<?php
session_start();
echo "<pre>" ;
print_r($_SESSION) ;
echo "</pre>" ;
?>

Mon deuxième tableau est présenté comme telle : "[valeursPreDef] =>"

Je sais pas si t'aide pour trouver ce qui cloque... en tout cas moi, je suis perdu, et tous les développeurs que je connais, trouvent pas d'où vient mon problème.

En tout cas merci à toi
djidji
LupusMic
le 21/05/2008 à 15:24
LupusMic
Si, tout ça aide beaucoup à circonscrire le bogue. L'assaut nous allons donner ;)

Quelle est la version exacte de ton PHP ? Il y avait un bogue qui concernait la version 4.1.2, qui était assez similaire.

Essaye de serializer le tableau avant de le sauver en session, pour voir si ce n'est pas un problème de compatibiliter de ton tableau avec les routines de serialization.

<?php
// Pour sauvegarder
$_SESSION['tableau'] = serialize($tablo) ;
?>


<?php
// Pour utiliser
$tablo = unserialize($_SESSION['tableau']) ;
?>


Au fait, y a-t-il des objets dans le second tableau ? Il se peut que ces objets, lors de leur sérialization, aient définient les méthodes magiques __sleep et __wakeup. Si la méthode __sleep lèvent une exception lors de la sérialization de l'objet, il se peut que ça explique la disparition du tableau.
À noter qu'on le verra lors de la serialization et unserialization manuelle.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
djidji
le 21/05/2008 à 16:46
djidji
Je suis allé voir le bogue que tu a mit en lien. C'est exactement mon problème, mais je ne pense pas pour les mêmes raisons, toujours grâce à mon phpinfo() j'ai pu voir que ma version de php sur le serveur sur lequel je bosse est : "PHP Version 4.4.8-0.dotdeb.1"

La sérialisation ne semble pas faire grand chose... À vrai dire sa change rien (à par que le tableau est bien sérialisé) il reste visible dans mon script courant, mais dés que je tente de le récupérer ailleurs c'est toujours pareille.

Normalement mon tableau ne contient pas d'objet, voici le contenu :
Array
( [Classement] => Array
(
)
[Label] => Array
(
[0] => Array
(
=> 
[LIBELLE] =>
[ORDRE] => -1000
)
[1] => Array
(
[CODE] => code1
[LIBELLE] => valeur1
[ORDRE] => 0
)
[2] => Array
(
[CODE] => code2
[LIBELLE] => valeur2
[ORDRE] => 3
)
[3] => Array
(
[CODE] => code3
[LIBELLE] => valeur3
[ORDRE] => 4
)
)
)
PS : Encore désoler l'indentation à foirer...
djidji
djidji
le 22/05/2008 à 14:37
djidji
Nouveau rebondissement dans l'affaire de la variable disparue...

Il semblerais que rien ne soit sauvegardé si jamais ma variable de session (celle qui disparait) venait à se trouver avant les autres...

Je m'explique :
J'ai vérifié si ce n'était pas un problème du style je peux sauvegarder qu'une seule variable...
J'ai donc crée une variable que nous appellerons pour les besoins de l'enquête "$_SESSION['alacon']" que nous réduirons par son surnom alacon.

Cette variable alacon est définie bien avant les autres, si je lui met un contenu quelconque, ça passe, si je suis lui rajoute du contenu à la fin de mon code, ça passe aussi. Mais si je lui met comme contenu celui de mon deuxième tableau (variable de session), c'est une fois de plus le drame.
Cependant il est pire... en effet, mes deux autres variables de session (tableau) ont littéralement disparu...

Ce qui me fait penser qu'il y a un dans ce deuxième tableau quelque chose qui empêche à ma variable de session de se souvenir tout ce qui le suit... Le problème étant que dans mon script, les deux autres variable n'ont pas perdu leur contenu...

Pourtant aprioris mes deux tableaux ne contiennent que des tableau et des chaines de caractères...

À deux doigt du suicide...

PS : désolé pour le alacon mais c'est le premiers mot (ou en tout cas suite de mots) qui me soit venu
djidji
Répondre
LoadingChargement en cours