Problème de disparition des données Mysql de mon tableau PHP

maisonmeto
Invité n'ayant pas de compte PHPfrance

25 juil. 2012, 20:34

Bonsoir.

Voilà, j'ai créé une mini-boutique dont voici le fonctionnement :
1) Le client est sur la catalogue, il ajoute au panier un produit.
2) Le produit est envoyé à la page du panier sous la forme url/id=idproduit.
3) L'id produit est récupéré sur la page du panier et ses informations, dont le prix notamment, sont indiqués dans un tableau récapitulatif.

Mais voici mon problème : dès que je quitte la page ou que je la rafraîchis, la ligne disparaît du tableau pour une raison qui m'est inconnue !

Voici la page du panier, si vous avez besoin d'autre chose précisez-le moi ! D'avance merci pour toute aide qui me sera extrêmement précieuse...

Cordialement, maisonmeto :D .

Code source du panier :
<form method="post" action="panier.php" align="center">
        <?php
mysql_connect("$sql_host", "$sql_user", "$sql_password");
mysql_select_db("$sql_db");
?>

<table border="1" bgcolor="cccccc"><tr>
<th>Serveur</th>
<th>Disponibilité</th>
<th>Quantité de kamas</th>
<th>Prix unitaire</th>
<th>Quantité</th>
<th>Supprimer</th>
</tr>

<?php
$retour = mysql_query('SELECT * FROM produits WHERE id=' . $id . '') or die("");
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les données.
{
?>

<tr>
<td><?php echo stripslashes($donnees['nom']); ?></td>
<td>
<?php if ($donnees['Disponibilité'] == 1)
    {
        echo "<center><img src=\"style/logos/yes.png\"></center>";
    }
    else
    {
        echo "<center><img src=\"style/logos/no.jpg\"></center>";
    }
	?>
</td>
<td><?php echo stripslashes($donnees['Quantité']); ?>K</td>
<td><?php echo stripslashes($donnees['prix']); ?>€</td>
<td><input type="text" size="4" name="q[]" value="<?php echo $q ?>".htmlspecialchars($_SESSION['panier']['qteProduit'][$i])./></td>
<td><center><a href="panier.php?action=suppression&id=<?php echo $id ?>"><img src="style/logos/delete.png"></a></center></td>
</tr>
<?php
} // Fin de la boucle
?>
</table>
<p align="Right" ><input type="submit" value="Recalculer"/>
<input type="hidden" name="action" value="refresh"/></p>
</form>
(sur la même page il y a aussi ceci :)
<?php
session_start();
include_once("fonctions_paniers.php");

$erreur = false;

$action = (isset($_POST['action'])? $_POST['action']:  (isset($_GET['action'])? $_GET['action']:null )) ;
if($action !== null)
{
   if(!in_array($action,array('ajout', 'suppression', 'refresh')))
   $erreur=true;

   //récuperation des variables en POST ou GET
   $q = (isset($_POST['q'])? $_POST['q']:  (isset($_GET['q'])? $_GET['q']:null )) ;
   $id = (isset($_POST['id'])? $_POST['id']:  (isset($_GET['id'])? $_GET['id']:null )) ;
   //Suppression des espaces verticaux
   $l = preg_replace('#\v#', '',$l);
   //On verifie que $p soit un float
   $p = floatval($p);

   //On traite $q qui peut etre un entier simple ou un tableau d'entier
    
   if (is_array($q)){
      $QteArticle = array();
      $i=0;
      foreach ($q as $contenu){
         $QteArticle[$i++] = intval($contenu);
      }
   }
   else
   $q = intval($q);
    
}

if (!$erreur){
   switch($action){
      Case "ajout":
         ajouterArticle($q,$id);
         break;

      Case "suppression":
         supprimerArticle($id);
         break;

      Case "refresh" :
         for ($i = 0 ; $i < count($QteArticle) ; $i++)
         {
            modifierQTeArticle($_SESSION['panier']['id'][$i],round($QteArticle[$i]));
         }
         break;

      Default:
         break;
   }
}

echo '<?xml version="1.0" encoding="utf-8"?>';?>
Et mes fonctions panier :
<?php

/**
 * Verifie si le panier existe, le créé sinon
 * @return booleen
 */
function creationPanier(){
   if (!isset($_SESSION['panier'])){
      $_SESSION['panier']=array();
      $_SESSION['panier']['libelleProduit'] = array();
      $_SESSION['panier']['qteProduit'] = array();
      $_SESSION['panier']['prixProduit'] = array();
      $_SESSION['panier']['verrou'] = false;
   }
   return true;
}


/**
 * Ajoute un article dans le panier
 * @param string $libelleProduit
 * @param int $qteProduit
 * @param float $prixProduit
 * @return void
 */
function ajouterArticle($qteProduit,$id){

   //Si le panier existe
   if (creationPanier() && !isVerrouille())
   {
      //Si le produit existe déjà on ajoute seulement la quantité
      $positionProduit = array_search($libelleProduit,  $_SESSION['panier']['libelleProduit']);

      if ($positionProduit !== false)
      {
         $_SESSION['panier']['qteProduit'][$positionProduit] += $qteProduit ;
      }
      else
      {
         //Sinon on ajoute le produit
         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.";
}



/**
 * Modifie la quantité d'un article
 * @param $libelleProduit
 * @param $qteProduit
 * @return void
 */
function modifierQTeArticle($libelleProduit,$qteProduit){
   //Si le panier éxiste
   if (creationPanier() && !isVerrouille())
   {
      //Si la quantité est positive on modifie sinon on supprime l'article
      if ($qteProduit > 0)
      {
         //Recharche du produit dans le panier
         $positionProduit = array_search($libelleProduit,  $_SESSION['panier']['libelleProduit']);

         if ($positionProduit !== false)
         {
            $_SESSION['panier']['qteProduit'][$positionProduit] = $qteProduit ;
         }
      }
      else
      supprimerArticle($libelleProduit);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

/**
 * Supprime un article du panier
 * @param $libelleProduit
 * @return unknown_type
 */
function supprimerArticle($libelleProduit){
   //Si le panier existe
   if (creationPanier() && !isVerrouille())
   {
      //Nous allons passer par un panier temporaire
      $tmp=array();
      $tmp['libelleProduit'] = array();
      $tmp['qteProduit'] = array();
      $tmp['prixProduit'] = array();
      $tmp['verrou'] = $_SESSION['panier']['verrou'];

      for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++)
      {
         if ($_SESSION['panier']['libelleProduit'][$i] !== $libelleProduit)
         {
            array_push( $tmp['libelleProduit'],$_SESSION['panier']['libelleProduit'][$i]);
            array_push( $tmp['qteProduit'],$_SESSION['panier']['qteProduit'][$i]);
            array_push( $tmp['prixProduit'],$_SESSION['panier']['prixProduit'][$i]);
         }

      }
      //On remplace le panier en session par notre panier temporaire à jour
      $_SESSION['panier'] =  $tmp;
      //On efface notre panier temporaire
      unset($tmp);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}


/**
 * Montant total du panier
 * @return int
 */
function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++)
   {
      $total += $_SESSION['panier']['qteProduit'][$i] * $_SESSION['panier']['prixProduit'][$i];
   }
   return $total;
}


/**
 * Fonction de suppression du panier
 * @return void
 */
function supprimePanier(){
   unset($_SESSION['panier']);
}

/**
 * Permet de savoir si le panier est verrouillé
 * @return booleen
 */
function isVerrouille(){
   if (isset($_SESSION['panier']) && $_SESSION['panier']['verrou'])
   return true;
   else
   return false;
}

/**
 * Compte le nombre d'articles différents dans le panier
 * @return int
 */
function compterArticles()
{
   if (isset($_SESSION['panier']))
   return count($_SESSION['panier']['libelleProduit']);
   else
   return 0;

}

?>
Alors, où est le problème ??? Encore merci !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 juil. 2012, 09:26

Le problème vient du fait que lorsque tu utilises ton bouton recalculer, tu renvois un nouveau formulaire et que dans ce nouveau formulaire il n'y a pas de champ "id" permettant de savoir sur quel produit tu es en train de travailler :)

Une solution pourrait consister simplement en l'ajout d'un input caché avec pour nom "id" et pour valeur un echo de $id, devrait te permettre de résoudre le problème puisque l'identifiant serait alors renvoyé également lors du rechargement de la page :)

Attention par contre à bien vérifier que tu récupères bien $id lorsqu'il est passé en get (via l'url ; $_GET['id']) mais également en post (via le formulaire ; $_POST['id'])
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...