Pb panier et include

Signaler
Messages postés
71
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
17 février 2010
-
Messages postés
71
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
17 février 2010
-
Bonjour,

j'ai un soucis qui m'embête bien dans la réalisation d'un site internet.
Un peu d'explications :
tout le site est géré par un système d'include(). J'ai donc un index, et toutes les autres pages sont appelées au sein d'un
en fonction du clic sur les rubriques d'un menu... jusque là pas de problème.

Ensuite, sur 1 des pages insérées par l'include(), j'ai des articles répertoriés dans une base de données, que j'affiche, et je propose d'ajouter chaque article dans un panier. pour le panier, je me suis référé à cette page : http://jcrozier.developpez.com/articles/web/panier/
(ma connexion à la base, le session_start et l'appel aux fichiers externes se font 1 seule fois au niveau de l'index.php)
De plus, l'affichage du nombre d'articles dans mon panier est présent sur l'index, donc visible sur toutes les pages du site pour l'internaute.

En local, AUCUN problème, j'ajoute, je vide mon panier, je navigue entre mes pages... les données de session de mon panier sont conservées sans aucun problème n'importe où je me trouve.
Par contre, dès que je transfère tout ça sur un serveur je rencontre des problèmes :
1 - je ne peux ajouter qu'un seul article dans mon panier (si je clique sur un autre, il vient remplacer celui existant et non l'ajouter)
2 - quand j'ai donc mon seul article dans le panier et que je me rends sur un autre page du site (donc je reste sur l'index, mais j'include une autre page), ma session de panier se perd, et j'obtient un panier vide...

Donc ma question :
A quoi cela peut être du ? Pourquoi cette différence entre local et en ligne ? Quelqu'un a-t-il des pistes pour me sortir de cette "galère" ?

Merci d'avance.

A bientôt sur phpcs

7 réponses

Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011

Bonjour,

Question idiote numéro 1 : Es tu sur d'avoir remonté tout t'es fichier sur le serveur?

As tu sur d'avoir ton session_start partout?
Messages postés
71
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
17 février 2010

bonjour,

a priori, OUI, j'ai remonté TOUS les fichiers sur le serveur. et j'ai mon session_start() non pas sur toutes les pages, mais uniquement sur la page index.php qui "porte" en quelque sorte toutes les autres par un système d'include().
D'ailleurs si je mets session_start() sur toutes les pages, ça me crée une erreur comme quoi une session est déjà ouverte, ce qui est logique...

Voila la réponse à la "question idiote numéro 1"...
Une deuxième ?

Merci
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Il faudrait voir un peu ton code (la gestion d'ajout, de suppression etc ...)

... et la question idiote n°2 est :
Ton hébergeur supporte t il les sessions ?

Cordialement,

Kohntark -
Messages postés
71
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
17 février 2010

salut,

je viens de vérifier que l'hébergeur supporte bien les sessions, et OUI, c'est bien le cas.
Le système de panier est identique à ce que l'on peut trouver sur http://jcrozier.developpez.com/articles/web/panier/ à savoir (pour la création et l'ajout) :

/////////////////////////////////////////////////////////////////////////////////
/* PAGE fonctions-panier.php */

<code class="php_keyword1">function
creationPanier()
{

$
ret
=
false
;


if
(isset(
$
_SESSION
[
'
panier
'
]
))
 
$
ret
=
true
;

else

{


  
$
_SESSION
[
'
panier
'
]
=
array
()
;

  
$
_SESSION
[
'
panier
'
]
[
'
libelleProduit
'
]
=
array
()
;

  
$
_SESSION
[
'
panier
'
]
[
'
qteProduit
'
]
=
array
()
;

  
$
_SESSION
[
'
panier
'
]
[
'
prixProduit
'
]
=
array
()
;

  
$
ret
=
true
;

}

return
$
ret
;

}
</code>

<code class="php_keyword1">function
ajouterArticle(
$
libelleProduit
,
$
qteProduit
,
$
prixProduit
)
{


if
(creationPanier())
{

$
positionProduit
=
array_search(
$
libelleProduit
,
$
_SESSION
[
'
panier
'
]
[
'
libelleProduit
'
]
)
;


  
if
(
$
positionProduit
!
=
=
false
)
  
{

   
$
_SESSION
[
'
panier
'
]
[
'
qteProduit
'
]
[
$
positionProduit
]
+
=
$
qteProduit
;

  
}

  
else

  
{

   array_push(
$
_SESSION
[
'
panier
'
]
[
'
libelleProduit
'
]
,
$
libelleProduit
)
;

   array_push(
$
_SESSION
[
'
panier
'
]
[
'
qteProduit
'
]
,
$
qteProduit
)
;

   array_push(
$
_SESSION
[
'
panier
'
]
[
'
prixProduit
'
]
,
$
prixProduit
)
;

  
}


}


else

  echo
"
Un
problème
est
survenu
veuillez
contacter
l
'
administrateur
du
site
.
"
;

}


///////////////////////////////////////////////////////////////////////////////////////
</code>
/* PAGE commande.php */

et ensuite, j'ajoute de cette manière :

if (isset($_POST['libelle']) &amp;&amp; isset($_POST['qte']) &amp;&amp; isset($_POST['prix']))
{
$libelleProduit=intval($_POST['libelle']);
$qteProduit=intval($_POST['qte']);
$prixProduit=floatval($_POST['prix']);

ajouterArticle($libelleProduit,$qteProduit,$prixProduit);
}
$req=mysql_query("SELECT * FROM commande");
while ($res=mysql_fetch_array($req))
{
$id=$res['id'];
$txt=$res['texte'];
$px=$res['prix'];

echo $txt." - ".$px."
<form action="" method="post">

</form>
";
}
////////////////////////////////////////////////////////////////////////////////////


Voila ! ce code fait donc parti de la page 'commande' qui est appelée dans un
au sein de la page
index.php géré par un système d'include().

//////////////////////////////////////////////////////////////////////////////////////
/* PAGE index.php */

et voici comment commence le fichier index.php :

<?php
session_start();
$filename = "param.php";
if (file_exists($filename)) include($filename);
$connect = mysql_connect($mysql,$login,$pass);
mysql_select_db($base, $connect);
require_once "link.inc.php";
include_once "fonctions-panier.php";
?>
//////////////////////////////////////////////////////////////////////////////////////////////
session_start en premier,
param.php est le fichier de connexion à la base de données
link.inc.php est le fichier permettant de gérer l'include()
fonctions-panier.php contient les fonctions du panier

Ces 1ères lignes de code sont inscrites UNIQUEMENT sur l'index.php.

Voila pour mon code...
Tout cela n'explique pas pourquoi tout ceci marche très bien en local avec easyphp 1.8 et pas en ligne !

Quelqu'un a-t-il déja géré un système de panier en plus d'un système d'include de page ?

Merci.

A bientôt
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

... ben je ne vois pas trop non plus. Tu ne tournes pas avec une version de php < 4.2.0 par hasard ?
Pour déboguer je mettrai des print_r($_SESSION); un peu partout; après session_start dans index.php et sur toutes les pages include concernées, ça peut permettre d'identifier le pb.
Je remplacerai aussi tous les include (et include_once) par des require .... on ne sait jamais

Tu as bien l'affichage des erreurs activé ?
Il ressemble à quoi le link.inc.php ?

Au passage ton panier semble très peu sécurisé (mais je n'ai pas vu tout ton code ). Par exemple ça :
<form action="" method="post">

</form>


C'est très dangereux si tu n'as pas de contrôle par la suite, rien n'empêche d'envoyer un prix à 1 centimes alors qu'il en vaut 10000 fois plus. En tout état de cause, même si c'est contrôlé par la suite, seuls les champs libelle et qte devraient être posté, c'est ensuite au script côté serveur de faire le calcul du prix à partir de la DB.

Cordialement,

Kohntark -
Messages postés
71
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
17 février 2010

salut Kohntark !

un grand merci pour le conseil de sécurité vis à vis du panier ! je vais faire en sorte de sécuriser tout ça.

Sinon, pour mon problème de départ, j'arrête de chercher, ça m'a trop saoulé et j'ai surtout perdu trop de temps là-dessus.
La solution un peu crade => j'ai sorti la page commande de l'include et j'ai repris le CSS de l'index pour que l'internaute de base ne se rende compte de rien.
Ça ne me satisfait pas, mais bon... on va faire comme ça, ça sera plus simple !

Encore merci beaucoup d'avoir essayé avec moi de chercher une solution au problème.

A bientôt sur phpcs.
Messages postés
71
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
17 février 2010

...petite précision :
j'avais déjà fait des var_dump($_SESSION)

pour voir comment se comportait le panier, et c'est bien comme cela que j'avais vu qu'au lieu d'ajouter un article au panier, ça remplacé l'article qu'on avait déja mis dans le panier.

De plus, la version de PHP est supérieure à 4.2.0.

Et enfin, le link.inc.php ressemble à ça :
/*-----------------------------------------------------------------------------------*/
$numlien = @$_GET["numlien"];
switch ($numlien)
 {
    case 1 :
    $page = "index.php";
    break;
   
    case 2 :
    $page = "commande.php";
    break;

   default :
   $page = "index.php";
   break;
}
/*-----------------------------------------------------------------------------------*/
et l'index.php donne ça :

echo "Accueil
";
echo "Commande
";

...et plus loin

<?php include $page; ?>

/*-----------------------------------------------------------------------------------*/

Voila pour les renseignements que tu demandais !
Si ça te donne des idées dans la résolution du problème, je suis toujours preneur !

Cordialement.

Yebs