Page 1 sur 2
Problème de duplication de variables session
Posté : 05 mai 2006, 15:07
par pitbull
Bonjour,
Dans le cadre du développement d'une petite boutique en ligne, j'ai un soucis lorsque j'ajoute un article à mon panier : en effet, je place chaque article en session (plus le total commandé et le nombre d'article) et tout se passe bien, sauf que si je reste quelques secondes (à la louche une trentaine de secondes) sans naviguer sur le site, et qu'ensuite je reprends ma navigation, les derniers éléments placés en session ont été dupliqués !
Je n'y comprends rien...
Voici le code d'ajout d'un article (item) et de màj des compteurs :
$_boutique_nb_articles = isset($_SESSION['boutique_nb_articles']) ? $_SESSION['boutique_nb_articles'] : 0;
$_boutique_total_articles = isset($_SESSION['boutique_total_articles']) ? $_SESSION['boutique_total_articles'] : 0;
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
if($action == "ajout") {
//echo "ajout";
// incrémentation du compteur d'articles en panier
$_boutique_nb_articles++;
$_SESSION['boutique_nb_articles'] = $_boutique_nb_articles;
// mise à jour du total du panier
$_boutique_total_articles = $_boutique_total_articles + $_SESSION['tb_boutique_current_article_prix'];
$_SESSION['boutique_total_articles'] = $_boutique_total_articles;
// mémorisation de l'article ajouté
$item = 'item['.$_boutique_nb_articles.']';
$_SESSION[$item] = array($_SESSION['$tb_boutique_current_article_id'], $_SESSION['tb_boutique_current_article_nom'], $_SESSION['tb_boutique_current_article_prix'], 1);
}
Merci d'avance de votre aide !!!
Posté : 05 mai 2006, 18:23
par Cyrano
Bon allez, je le ressors :
une source d'inspiration
Posté : 05 mai 2006, 18:55
par pitbull
Merci de ta réponse Cyrano, je regarderai ton exemple la semaine prochaine.
Par contre, je l'ai lu rapidement et je n'ai rien vu expliquant mon problème... qui est qu'une variable mise en session est dupliquée au bout d'un certain temps d'inactivité :/
Posté : 05 mai 2006, 19:00
par Cyrano
Disons que comme ça ne se produit pas dans mon code, il y a certainement quelque chose dans le tien qui cloche... donc la compariaison entre les deux te permettra peut-être de relever une coquille quelque part ?
Posté : 05 mai 2006, 19:13
par pitbull
Sans doute

Je pensais peut-être aux crochets dans la déclaration du tableau "item" en session...
Posté : 05 mai 2006, 19:28
par Cyrano
Cette ligne est en effet curieuse, tu veux faire quoi au juste ?
$item = 'item['.$_boutique_nb_articles.']';

Posté : 10 mai 2006, 16:45
par pitbull
Bonjour,
J'ai utilisé ton exemple de boutique en ligne, mais malheureusement ça ne résout pas le problème...
J'ai toujours le même comportement :
- lors de l'ajout d'un item au panier, tout se passe bien
- si je navigue, le panier m'affiche toujours le bon nombre d'articles etc
- lorsque j'arrête de naviguer (à partir de 15s d'inactivité) mon item est à nouveau ajouté au panier
- cet "ajout automatique" ne s'est pas fait en passant par la fonction d'ajout (j'ai mis un echo pour vérifier l'utilisation de cette fonction) !!!
- il semble qu'il y ait donc une sorte de duplication des variables mises en session à partir d'une quinzaine de secondes d'incativité...
- j'ai ce comportement en développement (local), et sur le serveur de mon hébergeur
Je n'ai absolument aucune idée de l'origine de ce bug, je suis perdu...
Merci d'avance de ton aide !!!
Posté : 10 mai 2006, 16:47
par Cyrano
Si l'ajout ne passe pas par la fonction dédiée à cet effet, on a un problème relevant de la cinquième dimension là...

Posté : 10 mai 2006, 16:57
par pitbull
Tout à fait...
Il y a deux éléments :
- inactivité d'une quinzaine de secondes
- duplication session en mémoire non initiée par une fonction
Qu'est-ce qui pourrait faire que le serveur d'application duplique une variable session au bout d'un laps de temps d'inactivité ? Peut-être ai-je mal codé quelque chose quelque part ???

Posté : 10 mai 2006, 17:07
par Cyrano
l'incrémentation a forcément lieu quelque part dans le code, la génération spontanée n'existe pas en informatique non plus. DOnc le problème, c'est de débusquer le bout de code qui fait ça... là, ça risque d'être soit très rapide avec un coup de bol soit une galère sans nom de quelques jours...
Posté : 10 mai 2006, 17:11
par pitbull
C'est que je me suis dit initialement, mais le délai d'inactivité m'intrigue : s'il y avait un bug de code, la duplication se ferait dès le premier clic, et non pas uniquement après 15s d'inactivité... non ?

Posté : 10 mai 2006, 18:57
par Cyrano
On ne se pose sans doute pas la bonne question... si on trouve la bonne question, trouver la réponse sera infiniment plus facile... mais j'avoue que je vois pas trop dans quel sens aborder le problème. Tu connais ton code mieux que moi, tu sauras peut-être mieux voir.
Posté : 10 mai 2006, 23:27
par Bioas
Je n'ai aucune idée de ce qui peut ce produire dans ton code moi aussi. Je n'ai aps vraiment le temps d'étudié le cas non plus mais tu pourais essaillé de testé ton code sur une autre machine avec des configuration semblable. Test en fonction du temps mais aussi si cela ce reproduit plusieur fois. Tu pourra alors savoir si l'erreur se reproduit a chaque fois et si c'est le serveur qui est en cause. Après tout sa si le problème persiste, je te conseille de faire une classe ou de fonction pour gèré tout tes item plus facilement. Je te donne un petit apercu.
Tu pourais passé la liste des item par un paramètre "GET", il se retrouve à la fin de l'adresse, par un cookie ou encore les session si elles ne cause pas de problèmes. Tes item doivent être dans une bdd alors ils ont des identifiant. Que se soit un nom un numéro ou nimporte quoi d'autre tu pourais te servir ce celui-ci. Regarde bien :
Code : Tout sélectionner
// La variable session contien le panier depuis que l'utilisateur navigue...
$_SESSION['BASKET']=$_SESSION['BASKET']; // Sa valeur bien sur....
// Mais elle pourais ici être ...
$_SESSION['BASKET']="%A2BC3:2%AC456:1%B37DA:0";
// Donc tu as ici l'item A2BC3 deux fois, AC456 une fois et B37DA aucune fois.
Ensuite il te reste a gèré sa. La sa devient plus compliqué.. et je n'ai aps beaucoup de temps, alors je t'explique rapidement. Surement que quelqu'un pourais te donné de l'aide ici.
Tu déclare une ou des variables globale, généralement des tableau. Disont un tableau. Pour chaque case dans celui ci tu retrouve un autre tabvleau avec les information du panier pour les traité dans ta page. Tu remplis ce tableau avec la variable de session a l'aide d'une fonction qui sais le faire.
Tu doit utilisé la commande Explode() pour séparé la chaine en plusieur partie avec les symbole que tu veut. Donc la fonction traite la variable session et affecte ceci au tableau. voila un petit début :
Code : Tout sélectionner
Globa $Basket;
Function fillBasket($String) {
// Le code ici...
Return $Resulta;
}
$Basket=fillBasket($_SESSION['BASKET']);
Après tu parcour ton tableau pour affiché tes item un a la fois avec les information dans la bdd comme leur nom. Pour en ajouté tu fait une ou plusieur fonction qui font le travail en parcourant ton tableau.
Tout ce que tu as a faire pour que tout fonctionne est de définir ta variable de session avec une autre fonction qui converti ton tableau en chaine de caractère avec la commande Implode(). Cette commande fait l'inverse d'explode.
Code : Tout sélectionner
Function setSession($Tableau) {
// le code et finalement
$_SESSION['BASKET']=$String;
}
// Mais moi j'aime mieux comme sa :
Function setSession($Tableau) {
//Le code qui se charge de convertir le tableau en chaine...
Return $Resultat; // Ou string...
}
$_SESSION['BASKET']=setSession($Basket);
Et la classe est la meilleur option car elle contien toutes ces méthode et tu peut l'utilisé comme ceci :
Code : Tout sélectionner
$BasketClass=new Basket;
$BasketClass->Fill($_SESSION['BASKET']);
// Ta page... Tes fonction.. requète....
// Petit exemple
$Basket->increaseItem("A2BC3");
// Et à la fin :
$BasketClass->setSession("$_SESSION['BASKET']");
// Regarde bien la fin de ce setSession :
Function setSession($VarSession) {
Eval($VarSession."=".$String.";"); // Ici on prend ta variable de session et on met la chainne qui contien tout le panier pour la prochaine page..
}
Les classe sont parfois compliqué car il y as énormément de façon de les créer pour arrivé a faire ce que l'ont veut. Alors si tu ne veut pas les apprendre et expérimenté contente toi de Fonction simple que tu fait dans un fichier a inclure dans ta page ou ton script....
J'espère avoir pu t'aidé
Posté : 11 mai 2006, 07:02
par pitbull
Salut Bioas
Merci de ton aide.
En fait le pb n'est pas lié à mon environnement car j'ai également le souci sur le serveur chez mon hébergeur.
J'ai effectivement pensé utiliser les cookies plutôt que les sessions, mais ça n'aurait été qu'une solution de contournement et ne m'aurait pas expliqué l'origine du soucis...
J'ai d'ailleurs toujours pas trouvé, donc pour l'instant je me suis créé une petite fonction qui contrôle les éventuels doublons d'article dans le panier en session et qui les supprime.
Ca règle le pb fonctionnellement, par contre l'anomalie technique subsiste, ce qui est vraiment génant :/
Posté : 11 mai 2006, 12:45
par Invité
>- cet "ajout automatique" ne s'est pas fait en passant par la fonction d'ajout (j'ai mis un echo pour vérifier l'utilisation de cette fonction) !!!
de quelle façon fais tu ton test ?
pour être sûr tu peux écrire dans un fichier qui gardera en mémoire chaque passage dans ton code.
est ce que le problème persiste si avant de rester 15 sec inactif tu te place sur une page qui ne contient pas le code d'ajout ?