Page 1 sur 2

Problème avec un panier virtuel

Posté : 21 nov. 2005, 19:04
par Zurg
Bonjour tout le monde !

je reviens avec mes questions...

Alors voilà, j'avance dans la conception de la boutique, et j'en suis au panier.
J'ai consulté la recherche et j'ai vu que beaucoup de gens s'étaient inspirés du même livre que moi pour le panier. J'ai aussi consulté le tuto très complet de Cyrano (merci pour ton boulot) , d'ailleurs tellement complet que je n'ai pas tout compris. :!:

Bref, venons en au fait :

Voici donc mon code: panier.php
<?php
session_start();
//init des variables
	if (!isset($_SESSION['total'])) $_SESSION['total']="";
	if(!isset($_GET['ap'])) $ap="";//init de ajoutPanier(ap) si non déclaré
	else  $ap=$_GET['ap']; 
	if(!isset($_GET['mp'])) $mp="";//init de modifPanier(mp) si non déclaré
	else $mp=$_GET['mp'];
	if(!isset($_GET['sp'])) $sp="";//init de suppPanier(sp) si non déclaré
	else $sp=$_GET['sp'];
	if(!isset($_GET['ec'])) $ec="";//init de enregistrerCommande(ec) si non déclaré
	else $ec=$_GET['ec'];
	if ((!isset($_SESSION['liste']))&&($ap=="")) $liste[]=array("VIDE",1,0,0);//init de liste si VIDE
	if (isset($_SESSION['liste'])) $liste=$_SESSION['liste'];//recup de la liste de la session
	if(!isset($_GET['ref'])) $ref="";
	else $ref=$_GET['ref'];
	

	
require_once('../Connections/cnn.php');
mysql_select_db($database_cnn, $cnn);

// caddy
$query_rscaddy= sprintf("SELECT * FROM articles WHERE articles.reference='%s' ORDER BY articles.libelle ASC" , $ref);
$rscaddy=mysql_query($query_rscaddy, $cnn) or die(mysql_error());
$row_rscaddy = mysql_fetch_assoc($rscaddy);
$totalRows_rscaddy = mysql_num_rows($rscaddy);

// menu gauche
$query_rsproduits = "SELECT rubriks.theme, rubriks.ID FROM rubriks ORDER BY rubriks.theme";
$rsproduits = mysql_query($query_rsproduits, $cnn) or die(mysql_error());
$row_rsproduits = mysql_fetch_assoc($rsproduits);
$totalRows_rsproduits = mysql_num_rows($rsproduits);

//----------------------------------------------------AJOUT PANIER

if ($ap=="c3126cde5eb24627ffa33cd98b0b3ad7")
{
	
	$nb=1; //par défaut la quantité est de 1
	$prix=$row_rscaddy['prix'];
	$liste[]=array($ref,$nb,$prix,$prix);
	$_SESSION['liste']=$liste;
	//ajoute un article à la liste
}

//----------------------------------------------------MODIF PANIER

if ($mp=="ACTUALISER")
{
	 for ($i=0;$i<count($liste);$i++)
		{
		$nbi='nb'.$i;
		$liste[$i][1]=$_GET["$nbi"];//recup du nbr d'article dans la liste
		$liste[$i][3]=$liste[$i][1]*$liste[$i][2];//prixArticle=nbre*prixUnitaire
		}
	$_SESSION['liste']=$liste;//mAj de la liste
}

//----------------------------------------------------SUPP PANIER

if ($sp==1)
{
	$article=$_GET['article'];
	for ($i=0;$i<count($liste);$i++)
		{
		if($article==$i)
			array_splice($liste,$i,1);
		//suppression de l'article
		}
	$_SESSION['liste']=$liste;//mAj de la liste
}

//----------------------------------------------------COMMANDER

if ($ec=="COMMANDER")
{
	if(!isset($_GET['action'])) 
	$_SESSION['action']="ENREGISTRE";//mémorise l'action 
	header("Location: commande.php");
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<title>Voici le contenu de votre panier...</title>

</head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
<link rel="stylesheet" href="style.css" type="text/css" />
</head>

<body>

	<div id="header" align="center">
	</div>
	
	<ul id="menuhaut">
		<li><a href="accueil.php" accesskey="1">Retour à l'accueil</a> - </li>
		<li><a href="contact.php">Contact</a> - </li>
		<li><a href="acc_admin.php">Espace Admin</a></li>
	</ul>
	<div id="zone_g">
	<br><br><br><br>
  	<table width="100%" border="0" cellpadding="0" cellspacing="0">
     <tr>
      <td width="11%"><img src="../images/Tablo/haut_gauche.gif"></td>
      <td width="83%" class="bh"><strong><font color="#669999" size="2" face="Verdana, Arial, Helvetica, sans-serif">Produits</font></strong></td>
      <td width="6%"><img src="../images/Tablo/haut_droit.gif"></td>
     </tr>
 	 <tr>
      <td height="57" class="bg">&nbsp;</td>
      <td bgcolor="#FFFFFF">
	   <table width="100%" border="0" cellspacing="0" cellpadding="0">
		   <tr> 
			<td><?php do { ?>
			   <a href="<?php echo "catalogue.php?rubrikID=".$row_rsproduits['ID']?>"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><?php echo $row_rsproduits['theme']."<br>"; ?></font></a> 
				<?php } while ($row_rsproduits = mysql_fetch_assoc($rsproduits)); ?>
			</td>
		   </tr>
       </table>
	  </td>
      <td class="bd">&nbsp;</td>
  	 </tr>
  	 <tr>
      <td height="25"><img src="../images/Tablo/bas_gauche.gif"></td>
      <td class="bb">&nbsp;</td>
      <td><img src="../images/Tablo/bas_droit.gif"></td>
     </tr>
	</table>
	</div>
	<div id="centre">
	 <p><font color="#330099" size="3" face="Verdana, Arial, Helvetica, sans-serif"><strong><br>
      <font color="#FF9900" size="6" face="Arial, Helvetica, sans-serif">PANIER 
      VIRTUEL</font></strong></font></p>
	  
	<?php if($liste[0][0]!="VIDE") { ?>	
	  
	<form action="panier.php" method="get" >
    <table width="650" border="1" align="center" cellspacing="0" bordercolor="#000000">
     <tr> 
      <td>
	   <table width="650" border="0" align="center" cellpadding="0" cellspacing="0">
       <tr bgcolor="#006600"> 
        <td width="200" height="20"><div align="center"><font color="#FFFFFF"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Titre</font></strong></font></div></td>
        <td width="200"><div align="center"><font color="#FFFFFF"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Quantit&eacute;</font></strong></font></div></td>
        <td width="200"><div align="center"><font color="#FFFFFF"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Prix</font></strong></font></div></td>
        <td width="50"><div align="center"><font color="#FFFFFF"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Supp</font></strong></font></div></td>
       </tr>
<?php
	$total=0.00;
 	for ($i=0;$i<count($liste);$i++)
		{
			$query_rsPanier="select * from articles where reference = '".$liste[$i][0]."'";
			//echo $query_rsPanier;
			$rsPanier = mysql_query($query_rsPanier, $cnn) or die(mysql_error());
			$row_rsPanier = mysql_fetch_assoc($rsPanier);		
?>
		<tr> 
        <td height="37"><div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><?php echo $row_rsPanier['libelle'] ?></font></div></td>
        <td><div align="center"> 
         <select name="nb<?php echo $i ?>" id="nb">
          <option value="1"  <?php if($liste[$i][1]==1) echo "SELECTED"; ?>>1</option>
          <option value="2" <?php if($liste[$i][1]==2) echo "SELECTED"; ?>>2</option>        
          <option value="3" <?php if($liste[$i][1]==3) echo "SELECTED"; ?>>3</option>        
          </select>              
          </div>
		</td>
        <td><div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><?php echo $row_rsPanier['prix'] ?></font></div></td>
        <td><div align="center"><a href="../public/panier.php?article=<?php echo $i ?>&sp=1"><img src="../images/boutique/ico_poubelle.gif" width="32" height="32" border="0"></a></div></td>
       </tr>
<?php
 	
		$total+=$row_rsPanier['prix'] * $liste[$i][1];
	}
	$_SESSION['total']=$total;

?>
          <tr> 
            <td ><div align="center"></div></td>
            <td ><div align="center"></div></td>
            <td ><div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Total 
                : <?php echo $total ?> Euro</strong></font></div></td>
            <td ><div align="center"></div></td>
          </tr>
      </table></td>
    </tr>
  </table>
    <br>
    <strong><font size="1" face="Verdana, Arial, Helvetica, sans-serif">En cliquant 
    sur le bouton Commander, vous signifiez avoir pris connaissance des<a href="javascript:Ouvrirpopup(cond_vente.php,a,directories=no,resizable=yes,location=no,height=290,width=515)"> 
    <font color="#006600">Conditions de Ventes</font></a><br>
    et les accepter.</font></strong><br>
  	<p align="center"> 
    <input name="mp" type="submit" value="ACTUALISER">
    <input name="ec" type="Submit" value="COMMANDER">
  </p>
</form> 
 <?php } else { ?>
      <p align="center"><strong><font size="4" face="Verdana, Arial, Helvetica, sans-serif">Votre panier est vide</font></strong></p>
	  
	 <?php }?>	  </td>
  </tr>
</table>
	</div>
	<div id="footer">
	</div>
	<br>
</html>
Le problème :

lorsque je clique sur le bouton "Actualiser", "j'obitens le message, votre panier est vide"... après recherche, j'ai l'impression que l'id de session change à ce moment : une idée, des critiques ?

merci d'avance pour votre aide :)

Posté : 21 nov. 2005, 19:55
par Zurg
Snif...

personne ne peut m'aider ? je suis pas mal dans la panade !! En attendant, je continue à chercher... Allez-y ne soyez pas timides ;) !

Posté : 21 nov. 2005, 21:26
par jeff
salut
fait une petite serie de teste
efface toute les sessions qui se trouvent dans ton repertoire de stockage(temp)
essai ton script et regarde combien de session on ete ecritre si >= 2
ta configuration client ou serveur n'est pas bonne (client au niveau des coockie et servaur au niveau du mode de transmission des sessions)

Posté : 21 nov. 2005, 22:59
par Zurg
Salut jeff !

merci de me répondre, en fait j'ai fait un echo session_id() sur la page panier.php, ainsi que sur ma page de catalogue, et effectivement, le session_id() change lorsqu'on charge une autre page...

Que puis-je faire :?:

Posté : 21 nov. 2005, 23:02
par jeff
session.use_cookies On On

Remarques-tu cette ligne, elle dit que la session utilise un cookies côté client, alors si ton navigateur a désactivé les cookies la session se casse à chaque rechargement.

Solution : Active les cookies côté navigateur

Posté : 21 nov. 2005, 23:17
par Zurg
Mais je ne stocke pas mes variables de session dans un cookie...

cela peut-il être dû au fait que mon site comprend des include, tu sais j'ai un header, un menu à gauche, une page centre, et je mettrai le footer plus tard, et donc sur le catalogue par exemple, la partie centrale est composée de la page centre.php dont le contenu varie en fonction des liens sur lesquels l'utilisateur a cliqué...

De +, les cookies sont acceptés côté client, peut-être faut-il regarder côté serveur?

Posté : 21 nov. 2005, 23:21
par jeff
fait voir ta config serveur sur les session (phpinfo)
(je me suis fait avoir ce week end avec :? )

attention si tu est sous IE il te faut un niveau bas de securité pour tester

Posté : 21 nov. 2005, 23:28
par Zurg
bon, ok, voici la config :
(je teste avec IE, Firefox et Opera...)

Code : Tout sélectionner

session Session Support enabled Registered save handlers files user Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 Off Off session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 1000 1000 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path C:\PROGRA~1\EASYPH~1\\tmp\ C:\PROGRA~1\EASYPH~1\\tmp\ session.serialize_handler php php session.use_cookies On On session.use_only_cookies Off Off session.use_trans_sid Off Off
j'espère que ça pourra t'aider...

Re: Problème avec un panier virtuel

Posté : 22 nov. 2005, 00:47
par Cyrano
... d'ailleurs tellement complet que je n'ai pas tout compris. :!:
Ce serait bien de me dire quelle partie t'a échappé. Ce type de retour aussi m'est utile, j'essaye d'écrire de façon à ce que ce soit accessible à des débutants. Mais j'ai pu zapper des étapes en oubliant que j'ai moi-même buté dessus quand j'ai commencé. Au besoin, fais-moi un petit topo par MP. Je garantis pas les explications détaillées dans la minute, en ce moment, j'ai vraiment pas le temps, mais j'essayerai de trouver quelques minutes pour rectifier si nécessaire.

Posté : 22 nov. 2005, 16:39
par Zurg
Salut Cyrano,

voilà, c'est parti par MP.

Enfin bon, je suis toujours dans les limbes obscures de ce panier qui se vide tout seul....

quelqu'un aurait-il par hasard une idée ??

Posté : 22 nov. 2005, 17:12
par jeff
teste avec ie et un niveau de securité faible

Posté : 22 nov. 2005, 20:18
par Zurg
Salut jeff (les autres aussi hein !)

j'ai testé avec IE niveau de sécurité faible, sous firefox et opera, et j'ai le même résultat..

Et.... ILLUMINATION !!! ce que tu viens de me dire m'a fait tester en désactivant mon firewall....et là, miracle, comme par hasard, mes identifiants de session ne changent plus !!

Ouf ! Quelle saleté ce ZoneAlarm...grrr :twisted:


Merci de m'avoir aiguillé !!

Quelqu'un sait-il comment je règle ça? je vais farfouiller, maintenant que je suis sur la bonne voie ! :wink:

Posté : 22 nov. 2005, 20:21
par Cyrano
Ça vient peut-être d'un niveau de filtrage des cookies trop sévère: les sessions sont gérées avec des cookies en général: mais si ton Firewall rejette tous les cookies sans distinction, la session risque fort de ne jamais fonctionner si je trans_id est à OFF (voir php.ini pour le trans_id)

Posté : 22 nov. 2005, 20:28
par jeff
a mon avis tu va devoir activé le passage de l'id de session par l'url
pour l'instant ca fonctionne chez mais je voi mal une ou deux lignes sur le site disant:
desactivé votre firewall et baissé le niveau de securité de votre navigateur

Posté : 22 nov. 2005, 20:32
par Zurg
Ouaip,

les cookies de session sont autorisés pourtant, faut-il que je crée une règle ?
(euh, et si oui laquelle?) J'avais créé une règle sur le 127.0.0.1 en autorisant tout, mais apparemment, c'était pas ça...puisque ça marche toujours pas..

Je sais qu'on sort un peu du contexte là, désolé...m'enfin, je suis preneur de toute suggestion !