Panier PHP

Petit nouveau ! | 4 Messages

11 déc. 2019, 21:37

Bonsoir,

J'ai suivis un tutoriel pour la création d'un panier en php tout fonctionne mis à part que c'est pas possible d'ajouter un article s'il est deja dans le panier même si la taille est différente

Je n'ai aucune idée à comment réctifier ca si quelqu'un peut bien m'aider

Voici mon PHP
<?php
if(isset($_POST["type"]) && $_POST["type"]=='add' && $_POST["produit_quantite"]>0)
{
    foreach($_POST as $key => $value){
        $new_produit[$key] = filter_var($value, FILTER_SANITIZE_STRING);
    }
 
    unset($new_produit['type']);
    unset($new_produit['return_url']);
     
  
    $statement = $mysqli->prepare("SELECT produit_nom, prix, produit_image_nom, produit_description FROM produits WHERE produit_code=? LIMIT 1");
    $statement->bind_param('s', $new_produit['produit_code']);
    $statement->execute();
    $statement->bind_result($produit_name, $price, $produit_img_name, $produit_desc);
     
    while($statement->fetch()){
         
         
         
        $new_produit["produit_nom"] = $produit_nom;
        $new_produit["produit_prix"] = $prix;
        $new_produit["produit_img_nom"] = $produit_img_nom;
        $new_produit["produit_desc"] = $produit_desc;
         
        if(isset($_SESSION["cart_produits"])){ 
            if(isset($_SESSION["cart_produits"][$new_produit['produit_code']]))
            {
                unset($_SESSION["cart_produits"][$new_produit['produit_code']]);
            }          
        }
        $_SESSION["cart_produits"][$new_produit['produit_code']] = $new_produit;
    }
}
?>
Merci d'avance

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

12 déc. 2019, 12:40

Salutations !

Actuellement ton panier est géré avec pour seule clé la clé "produit_code". En gros, ton panier est un meuble à tiroir ayant chacun une étiquette correspondant au code de tes produits. Actuellement, quand tu ajoutes un article, tu regardes si le tiroir correspondant est déjà rempli et si oui, tu le vides, puis tu mets ton article dedans.

Si les articles de tailles différentes ont le même code produit, il est normal que le précédent soit remplacé par le nouveau au lieu d'être ajouté. Il faudrait soit des codes produits différents, soit prévoir une clé supplémentaire et pas seulement le code produit pour étiqueter tes tiroirs ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 4 Messages

12 déc. 2019, 16:15

Salut
Merci pour la réponse,
J'avais un peu compris comment fonctionnait le code mais voila que tout s'éclaircit,
Je dois donc passer par une clé supplémentaire car le produit reste le même mis a part la taille qu'on choisis à partir d'un input dans la page précédente.
Le problème c'est comment faire, je suis pas du tout PHP je suis juste de passage haha
Merci d'avance

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

12 déc. 2019, 16:30

Il y a différentes façon de le faire ... le plus simple est peut être de changer le nom de ta clé dans le tableau "cart_produits" que tu stockes en session. Actuellement c'est uniquement le code produit (qui du coup est remplacé) :
$_SESSION["cart_produits"][ $new_produit['produit_code'] ] 
Si tu concatènes celui-ci avec la taille du produit, tu auras un identifiant unique par code et par taille (attention aux impacts que cela peut avoir dans le traitement de ton panier en session par la suite) :
$_SESSION["cart_produits"][ $new_produit['produit_code']  . '/' . $new_produit['produit_taille'] ] 
En supposant que $new_produit['produit_taille'] contienne l'information de la taille (et sinon tu peux adapter ;))

Tu auras ainsi des "tiroirs" étiquetés "Code/Taille" ce qui évitera de remplacer un article par un autre quand tu en changes la taille...

A noter que tu peux grandement simplifier cette partie du code :
        if(isset($_SESSION["cart_produits"])){ // tu regardes s'il y a un panier en session
            if(isset($_SESSION["cart_produits"][$new_produit['produit_code']])) // tu regardes si ce panier contient ton produit
            {
                unset($_SESSION["cart_produits"][$new_produit['produit_code']]); // si c'est le cas, tu supprimes le produit
            }          
        }
// puis tu ajoutes le nouveau produit (au passage, sans t'assurer ici que le panier existe bien en session)
        $_SESSION["cart_produits"][$new_produit['produit_code']] = $new_produit;
Il n'est pas nécessaire de supprimer le produit précédent dans la mesure où tu vas le remplacer par le nouveau. Tu peux donc enlever ce contrôle car si le produit existe déjà dans ton panier, il sera automatiquement remplacé, inutile de le supprimer au préalable :
if (isset($_SESSION["cart_produits"])) { 
        // ajoute ou remplace le produit
        $_SESSION["cart_produits"][$new_produit['produit_code']] = $new_produit;
}
Et avec la modification évoquée ci-dessus :
if (isset($_SESSION["cart_produits"])) { 
        // ajoute ou remplace le produit
        $_SESSION["cart_produits"][$new_produit['produit_code']  . '/' . $new_produit['produit_taille'] ] = $new_produit;
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 4 Messages

12 déc. 2019, 18:42

Je te remercie pour avoir pris le temps de bien m'expliquer, sa marche impeccable, j'avais essayé un truc du genre avant mais il me manquait les . '/' .
Manque plus d'afficher du coté panier.
Bonne fin de journée et merci encore

Petit nouveau ! | 4 Messages

27 déc. 2019, 00:30

Bonsoir, je me permets de re-up le sujet car j'ai rencontré un petit problème lorsque je veux supprimer des articles
j'ai essayé pendant des jours etant mediocre en PHP je n'ai pas réussis si quelqu'un pourrait m'aider
voici mon code

Code : Tout sélectionner

if(isset($_POST["product_qty"]) || isset($_POST["remove_code"])) { //update item quantity in product session if(isset($_POST["product_qty"]) && is_array($_POST["product_qty"])){ foreach($_POST["product_qty"] as $key => $value){ if(is_numeric($value)){ $_SESSION["cart_products"][$key]["product_qty"] = $value; } } } //remove an item from product session if(isset($_POST["remove_code"]) && is_array($_POST["remove_code"])){ foreach($_POST["remove_code"] as $key){ unset($_SESSION["cart_products"][$key]); } } }
Sa fonctionnait quand il s'agissait de produit sans libellé (couleur) mais je sais pas comment l'adapter avec la maj de mon code
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8431 Messages

27 déc. 2019, 10:52

Il faut que tu avances davantage dans ton debug.
A quel endroit ton code ne se comporte pas comme prévu ?

Mets des var_dump($var); un peu partout dans ton code pour voir à quel endroit tes variables ou appel de fonction n'ont pas le comportement attendu.
Quand tout le reste a échoué, lisez le mode d'emploi...