Insertion en BDD différente de mon nb d'articles dans panier

Insertion en BDD différente de mon nb d'articles dans panier - PHP - Programmation

Marsh Posté le 19-08-2015 à 17:53:13    

Bonjour à tous,
 
J'ai un problème au niveau de mon panier. Que j'ai 1 ou plusieurs articles dans mon panier, dans ma table details_commande, il ne veut pas me créer autant de ligne qu'il n'y a d'article avec le même id_details_commande qui correspondra à cette même commande.  
 
Voici mon code:
 

Code :
  1. if(isset($_POST['payer']) && $_POST['payer'])
  2.   {
  3.     //boucle qui tourne autant de fois qu'il y a d'articles différents dans le panier :  
  4.     for($i = 0; $i < count($_SESSION['panier']['id_article']) ; $i++)
  5.       //cf. count() équivalent du sizeof() => http://php.net/manual/fr/function.sizeof.php
  6.     {
  7.       $resultat = informationSurUnArticle($_SESSION['panier']['id_article'][$i]);
  8.      
  9.       $article = $resultat->fetch_assoc();
  10.      
  11.       #verification du stock : (on est toujours dans la boucle dont le but est de nous retourner le contenu du panier)
  12.       if($article['stock'] < $_SESSION['panier']['quantite'][$i]) //si le stock actuel est strictement inférieur à la quantité que l'on souhaite commander...=>PROBLEME !!!
  13.       {
  14.         echo '<hr><div class="erreur">Stock restant : ' . $article['stock'] . '</div>';
  15.         echo '<div class="erreur">Quantité demandée : ' .$_SESSION['panier']['quantite'][$i] . '</div>';
  16.      
  17.         if($article['stock'] > 0)
  18.         {
  19.           echo '<div class="erreur">la quantité de l\'article ' . $_SESSION['panier']['id_article'][$i] . ' a été réduite car notre stock était insuffisant. Veuillez vérifier vos achats</div>';
  20.           $_SESSION['panier']['quantite'][$i] = $article['stock'];
  21.         }
  22.         else //rupture de stock : on retire carrément les articles du panier.  
  23.         {
  24.           echo '<div class="erreur">l\'article ' . $_SESSION['panier']['id_article'][$i] . ' a été retiré de votre panier car nous sommes en rupture de stock, veuilliez vérifier vos achats.</div>';
  25.           retirerArticleDuPanier($_SESSION['panier']['id_article'][$i]); //on retire l'article.  
  26.           $i--; //on décrémente pour retirer un article. Lorsque l'on souhaite rajouter une valeur à notre variable on incrémente, ici on souhaite enlever une valeur du coup on décrémente.  
  27.         }
  28.         $erreur = TRUE;
  29.       }
  30.     }
  31.   if(!isset($erreur)) //si $erreur = FALSE => on enregistre le panier.  
  32.   {
  33.  executeRequete("INSERT INTO commande(id_membre,montant,date) VALUES (" . $_SESSION['utilisateur']['id_membre'] . "," . montantTotal() . ", NOW())" );
  34.  //récupération du dernier identifiant auto-généré par l'auto-increment de la BDD
  35.  $id_commande = $mysqli->insert_id;
  36.  //pour tous les articles dans le panier, on observe l'id, la quantité, le prix : on récupère tout pour les placer dans la table details_commande :  
  37.  for($j = 0 ; $j < count($_SESSION['panier']['id_article'][$j]); $j++)
  38.  {
  39.    //ajout des informations dans la table details_commande :  
  40.  executeRequete("INSERT INTO details_commande (id_commande,id_article,quantite,prix) VALUES ($id_commande, ". $_SESSION['panier']['id_article'][$j] . "," . $_SESSION['panier']['quantite'][$j] . ",". $_SESSION['panier']['prix'][$j]. " )" );
  41.   
  42.    //on va faire un update de notre stock : on attribue le nouveau stock  
  43.  executeRequete("UPDATE article SET stock=stock-".$_SESSION['panier']['quantite'][$j] . " WHERE id_article=" . $_SESSION['panier']['id_article'][$j]);
  44.  }
  45.  //paiement par chèque du coup on vide le panier :  
  46.  unset($_SESSION['panier']);
  47.  //envoi mail confirmation achat au client :  
  48.  // mail($_SESSION['utilisateur']['email'],"Confirmation de la commande", "Votre suivi de commande est le suivante : $id_commande","From:confirmation@hus.com" );
  49.  echo "<div class='validation'>Merci pour votre commande. Votre n° de suivi est le $id_commande</div>";
  50.   } 
  51. }


 
Si vous voyez le problème... Je tourne en rond depuis 1 semaine et ne comprend pas pourquoi il ne fait pas autant de ligne que je n'ai d'articles dans ma table.
 
Merci d'avance !!!!


---------------
L'écoconception n'est pas négociable - Topic habitats de demain : https://tinyurl.com/y5h2mjx7
Reply

Marsh Posté le 19-08-2015 à 17:53:13   

Reply

Marsh Posté le 21-08-2015 à 14:25:56    

cette ligne ne s'exécutera qu'une fois, non ?

Code :
  1. for($i = 0; $i < count($_SESSION['panier']['id_article']) ; $i++)


(a priori t'as pas 2 articles qui ont le même id...)
 
montre le contenu de $_SESSION sinon.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 21-08-2015 à 15:26:30    

C'est peut-être le contraire :  
si

Code :
  1. $_SESSION['panier']['id_article']

contient un nombre d'éléments correspondant au nombre d'articles,
c'est la ligne 39 qui ne fait qu'une exécution :

Code :
  1. for($j = 0 ; $j < count($_SESSION['panier']['id_article'][$j]); $j++)


 
ne faudrait-il pas retirer [$j] à la fin de

Code :
  1. $_SESSION['panier']['id_article'][$j]

?


Message édité par lefilsdelaterre le 21-08-2015 à 15:43:12
Reply

Marsh Posté le 22-08-2015 à 20:48:26    

Le $_SESSION montre bien des id_article différents, donc il n'y a aucun soucis a ce niveau là :
 
Array
(
    [panier] => Array
        (
            [id_article] => Array
                (
                    [0] => 12
                    [1] => 6
                )
 
            [titre] => Array
                (
                    [0] => Tourne-disque Gramovox
                    [1] => Verres en gré (Lot de 4)
                )
 
            [photo] => Array
                (
                    [0] => /Hus/photo/_gramovox.jpg
                    [1] => /Hus/photo/6_6_oldmu7ayiu2p55vmr4fa.png
                )
 
            [prix] => Array
                (
                    [0] => 399
                    [1] => 38
                )
 
            [quantite] => Array
                (
                    [0] => 1
                    [1] => 1
                )
 
            [id_promo] => Array
                (
                    [0] => 1
                    [1] => 1
                )
 
            [reduction] => Array
                (
                    [0] => 0
                    [1] => 0
                )
 
        )
)
 
Le code fonctionnait sur un autre site auparavant et me rentrait en BDD tout mes articles, c'est ça que je ne comprends pas.
 
lefilsdelaterre, tu as raison le soucis c'est bien ça [$j], un grand merci !


---------------
L'écoconception n'est pas négociable - Topic habitats de demain : https://tinyurl.com/y5h2mjx7
Reply

Marsh Posté le 24-08-2015 à 14:13:58    

Ligne 7, $resultat contient quoi ? Normalement, ça devrait être une ressource sur la BD.
 
Ligne 9, $article contient quoi ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-08-2015 à 15:52:16    

Peut-être que tous les appels à la base de données seront faits en amont, et les résultats déjà stockés dans les tableaux.
Par contre cela comporte un risque...
Si l'utilisateur attend longtemps avant de vouloir payer, et qu'entre-temps d'autres clients ont acheté le même produit, la variable de stock n'est pas mise à jour (il me semble en tout cas).
 
Il vaudrait mieux, au moins pour le stock, faire l'appel à la base de données au moment de payer... et même mettre à jour le stock à ce moment-là pour éviter le chevauchement entre plusieurs clients, quitte à remettre le stock à son niveau initial si le paiement n'est pas validé.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed