8797 sujets

Développement web côté serveur, CMS

Bonjour, j'ai crée un panier virtuel qui fonctionne à première vue, mais j'ai un problème aléatoire qui me rend complètement fou...

Si j'ajoute et que j'enlève des produits de facon intensive, au bout d'un moment la machine s'enraye et des produits préalablement supprimés réapparaissent par magie, c'est très énervant! Smiley biggol
Si vous pouvez m'aider, ce serait génial, merci d'avance.

Le Code:
<?php
session_start();
//init des variables
if (!isset($HTTP_SESSION_VARS['total'])) $HTTP_SESSION_VARS['total']=0;
if(!isset($HTTP_GET_VARS['ajoutPanier'])) $ajoutPanier="";//init de ajoutPanier si non déclaré
else  $ajoutPanier=$HTTP_GET_VARS['ajoutPanier']; 
if(!isset($HTTP_GET_VARS['suppPanier'])) $suppPanier="";//init de suppPanier si non déclaré
else $suppPanier=$HTTP_GET_VARS['suppPanier'];
if(!isset($HTTP_GET_VARS['enregistreCommande'])) $enregistreCommande="";//init de enregistreCommande si non déclaré
else $enregistreCommande=$HTTP_GET_VARS['enregistreCommande'];
if ((!isset($HTTP_SESSION_VARS['liste']))&&($ajoutPanier=="")) $liste[]=array("VIDE",1,0);//init de liste si VIDE
if (isset($HTTP_SESSION_VARS['liste'])) $liste=$HTTP_SESSION_VARS['liste'];//recup de la liste de la session
?>
<?php require_once('Connections/sakura_san.php'); ?>
<?php
mysql_select_db($database_sakura_san, $sakura_san);
$query_detail = "SELECT * FROM articles WHERE s_type = 'sushi' ORDER BY prix ASC";
$detail = mysql_query($query_detail, $sakura_san) or die(mysql_error());
$row_detail = mysql_fetch_assoc($detail);
$totalRows_detail = mysql_num_rows($detail);

  mysql_select_db($database_sakura_san, $sakura_san);
//----------------------------------------------------AJOUT PANIER
if ($ajoutPanier=="AJOUTER")
{
	$reference=$HTTP_GET_VARS['ref_article'];
	$nb=1; //par défaut la quantité est = 1
	$prix=$HTTP_GET_VARS['prix'];
	$liste[]=array($ref_article,1,$prix);
	$HTTP_SESSION_VARS['liste']=$liste;
	//ajoute un article à la liste
	
}

//----------------------------------------------------SUPP PANIER
if ($suppPanier==1)
{
	$article=$HTTP_GET_VARS['article'];
	for ($i=0;$i<count($liste);$i++)
		{
		if($article==$i)
			array_splice($liste,$i,1);
		//suppression de l'article
		}
	$HTTP_SESSION_VARS['liste']=$liste;//mAj de la liste
}
//----------------------------------------------------COMMANDER
if ($enregistreCommande=="COMMANDER")
{
	if(!isset($HTTP_GET_VARS['action'])) 
	$HTTP_SESSION_VARS['action']="enregistre";//mémorise l'action 
	header("Location: commande.php");
}
 ?>


Sur l'icone de suppression :

<a href="detail.php?article=<?php echo $i ?>&suppPanier=1">
            <div align="center"><img src="img/suppr.gif"


Si vous voulez jeter un oeil à la page : la voici : http://www.sakura-san.com/detail.php

Merci
Modifié par Funder (16 Jun 2005 - 17:56)
Bonjour, j'ai un peu du mal à cerner le problème, je pense que c'est un problème de php, et plus particulièrement de la gestion des sessions, j'ai essayé plusieurs choses qui n'ont pas fonctionné comme la suppression de la variable de session avec unset à chaque suppression de produit...

Je suis dans le trou noir.. Smiley bawling
Hum des sushi Smiley lol

$HTTP_SESSION_VARS['total']

C'est quoi cette syntaxe de l'ére préhistorique ??
Deja primo, remplace moi ca par $_SESSION, pareil pour les $_GET et les $_POST !
On est a PHP 4 sur la pluspart des serveurs aujourd'hui ^^
if ($ajoutPanier=="AJOUTER")
{
$reference=$HTTP_GET_VARS['ref_article'];
$nb=1; //par défaut la quantité est = 1
$prix=$HTTP_GET_VARS['prix'];
$liste[]=array($ref_article,1,$prix);
$HTTP_SESSION_VARS['liste']=$liste;
//ajoute un article à la liste

}


J'ai comme l'impression que, a chaque ajout dans le panier, tu ecrase la liste de produite precedente non ?
Smiley biggol
J'ai pris ce script sur un bouquin des éditions eyrolles, je t'avoue que j'en maitrise pas tous les aspects, je suis assez décu de ce code qui présente plein d'imperfections, comme $HTTP_SESSION_VARS par exemple.

Donc d'après toi le problème pourrait venir de là? la liste est écrasée à chaque fois? franchement j'en sais rien...

Mais je suis ouvert à toute proposition de modification... Merci
Moi je pensais que la fonction ajouter créer une nouvelle ligne dans le tableau à chaque ajour de produit. Qu'est ce qui te fait dire que ca écrase le tableau? Et y a-t-il une fonction plus appropriée pour ajouter une ligne à un tableau?
J ai testé ton site, et je vois pas le pb que tu rencontres ....

Si tu pouvais etre + précis pour le décrire ca pourrais etre utile Smiley cligne

Et je comprend pas pourquoi tu vide tout ton panier au lieu de supprimer 1 élément a la fois car si on fait une longue commande et qu on se plante a la fin, il faut tout se retaper .... c est pas top
Oué justement c'est la seule solution que j'ai trouvé, supprimer tout le caddie, en gros faire péter la session... je te laisse une page avec l'ancien système pour que tu vois le problème :

http://www.sakura-san.com/boisson_alcool.php

Ici tu peux donc supprimer un article du caddie, mais si tu rajoutes, par exemple 6 ou 7 produits que tu les supprimes un par un, tu verras vite le problème, c'est assez aléatoire. En fait les produits préalablement effacés réapparraissent par enchantement, le problème se résume à ca, c'est pas méchant mais je n'ai pas trouvé de solutions... Merci
Je viens d essayer ton site et c est vraiment bizare ... Smiley eek

Envoies le code original stp
Modifié par Mailtar (22 Jun 2005 - 11:23)
Le code original, c'est à dire celui du bouquin? le voila :
<?php
session_start();
//init des variables
if (!isset($_SESSION['total'])) $_SESSION['total']=0;
if(!isset($_GET['ajoutPanier'])) $ajoutPanier="";//init de ajoutPanier si non déclaré
else  $ajoutPanier=$_GET['ajoutPanier']; 
if(!isset($_GET['modifPanier'])) $modifPanier="";//init de modifPanier si non déclaré
else $modifPanier=$_GET['modifPanier'];
if(!isset($_GET['suppPanier'])) $suppPanier="";//init de suppPanier si non déclaré
else $suppPanier=$_GET['suppPanier'];
if(!isset($_GET['enregistreCommande'])) $enregistreCommande="";//init de enregistreCommande si non déclaré
else $enregistreCommande=$_GET['enregistreCommande'];
if ((!isset($_SESSION['liste']))&&($ajoutPanier=="")) $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
?>
<?php require_once('../Connections/ConnexionBoutiquemx.php'); ?>
<?php 
mysql_select_db($database_ConnexionBoutiquemx, $ConnexionBoutiquemx);
//----------------------------------------------------AJOUT PANIER
if ($ajoutPanier=="AJOUTER")
{
	$reference=$_GET['reference'];
	$nb=1; //par défaut la quantité est = 1
	$prix=$_GET['prix'];
	$liste[]=array($reference,$nb,$prix,$prix);
	$_SESSION['liste']=$liste;
	//ajoute un article à la liste
}
//----------------------------------------------------MODIF PANIER
if ($modifPanier=="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 ($suppPanier=="SUPPRIMER")
{
	$article=$_GET['article'];
	for ($i=0;$i<count($liste);$i++)
		{
		if($article==$liste[$i][0])
			array_splice($liste,$i,1);
		//suppression de l'article
		}
	$_SESSION['liste']=$liste;//mAj de la liste
}
//----------------------------------------------------COMMANDER
if ($enregistreCommande=="COMMANDER")
{
	if(!isset($_GET['action'])) 
	$_SESSION['action']="ENREGISTRER";//mémorise l'action 
	header("Location: commande.php");
}
 ?>
 <html>
<head>
<title>Boutique MX by phpmx.com</title>
 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>
<body>
<div align="center">
  <p><img src="../images/bandeauPublic.gif" width="650" height="100" border="0" usemap="#Map"> 
  </p>
 
    <map name="Map">
      <area shape="rect" coords="22,65,166,93" href="../public/catalogue.php">
      <area shape="rect" coords="190,67,293,94" href="../public/panier.php">
      <area shape="rect" coords="325,68,478,94" href="../public/commande.php">
      <area shape="rect" coords="524,66,621,96" href="../administrateur/index.php">
    </map>

</div> 
  

<table width="100%" border="0" cellspacing="0">
  <tr> 
    <td><p align="center"><strong><font color="#FF0000" size="6" face="Arial, Helvetica, sans-serif">PANIER</font></strong></p>
     
	 <?php if($liste[0][0]!="VIDE") { ?>	  <form action="../public/panier.php" method="get" >
  <table width="650" border="1" align="center" cellspacing="0" bordercolor="#FF0000">
    <tr> 
      <td><table width="650" border="0" align="center" cellpadding="0" cellspacing="0">
          <tr bgcolor="#FF0000"> 
            <td width="200"> <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, $ConnexionBoutiquemx) or die(mysql_error());
    $row_rsPanier = mysql_fetch_assoc($rsPanier);		
	?>
          <tr> 
            <td><div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><?php echo $row_rsPanier['titre'] ?></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="panier.php?suppPanier=SUPPRIMER&article=<?php echo $row_rsPanier['reference'] ?>"><img src="../images/Next.gif" width="14" height="13" border="0"></a></div></td>
          </tr>
          <?php
 	
	$total+=$row_rsPanier['prix'] * $liste[$i][1];
}
$_SESSION['total']=$total;//mAj du total dans la session

?>
          <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 ?> Euros</strong></font></div></td>
            <td ><div align="center"></div></td>
          </tr>
        </table></td>
    </tr>
  </table>
  <br>
  <p align="center"> 
    <input type="submit" name="modifPanier" value="ACTUALISER">
    <input name="enregistreCommande" 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>
<p align="center"><img src="../images/BarreBasPublic.gif"></p>
</div>
</body>
</html>


J'ai meme écris à l'auteur pour lui demander la solution...
J'ai fait un peu le tour du problème, en fait les variables de session restent en mémoire, meme après un array_splice ou meme un unset, rien à faire, la seule chose qui marche c'est la broyeuse, le session_destroy... Je sais pas si peut vous aider...