Probleme tuto panier en php

Par Babou, il y a 13 ans


Salut tout le monde,

Voila j'ai un petit soucis, j'ai suivi le tutoriel de grafikart mais j'ai remarqué que lorsqu'on modifie la quantité dans la partie panier avec des lettres cela fait tout beugé, j'ai essayé d'ajouter au code une condition du type if(is_int()) mais cela ne marche pas.. Quand je dis que cela fait tout beugé, j'entend par la que le prix et les quantités se remettent à zéro, mais le produit s'affiche toujours dans le panier.
Voila le code de la fonction recalc de panier.class.php :

<?php
public function recalc(){
    foreach($_SESSION'panier'] as $product_id => $quantity){
        if(isset($_POST'panier']'quantity']$product_id])){
            $_SESSION'panier']$product_id] = $_POST'panier']'quantity']$product_id];
        }
    }
}
?>

Si quelqu'un a une idée de comment arranger le problème, merci !

15 réponses

Typhon, il y a 13 ans

Le if(is_int()) ne change absolument rien ?

Babou, il y a 13 ans

Non cela change absolument rien, et même pire lorsque je met is_int() je ne peux même plus modifier !
Voila le code que j'obtient :

<?php
public function recalc(){
    foreach($_SESSION'panier'] as $product_id => $quantity){
        if(isset($_POST'panier']'quantity']$product_id])){
            if(is_int($_POST'panier']'quantity']$product_id])){
                $_SESSION'panier']$product_id] = $_POST'panier']'quantity']$product_id];
            }
        }
    }
}

Une idée ?

Typhon, il y a 13 ans

Pas très normale tout ça, tu peux faire un var_dump de $_POST avant le foreach ?

Babou, il y a 13 ans

Voila ce que j'obtient en mettant le var_dump avant le foreach :
array(1) { "panier"]=> array(1) { "quantity"]=> array(1) { [1]=> string(1) "3" } } }

Typhon, il y a 13 ans

Et ba voilà on à la réponse ;)

on voit que $_POST'panier']'quantity'][1] contient un chaine de caractère "3" et non le nombre 3

fait donc plutôt un if(is_int(intval($_POST'panier']'quantity']$product_id])))

Babou, il y a 13 ans

Ah oui en effet cela marche beaucoup mieux !
Cependant, j'aimerai que si on entre le mot "chien" dans le input et qu'on valide le formulaire alors il s'affiche la valeur précédente dans le formulaire, un genre de retour en arrière, mais je ne vois pas comment faire puisque la valeur "chien" est deja enregistré dans le $_SESSION donc aucun retour en arrière possible, si ?

Babou, il y a 13 ans

UP..

Typhon, il y a 13 ans

Ba normalement ça doit le faire tout seul dès qu'il y à une actualisation.

Babou, il y a 13 ans

Non justement le mot chien reste dans l'input et le total se remet à 0..

Je n'y comprend rien..

Babou, il y a 13 ans

Toujours aucunes réponses ?

Babou, il y a 13 ans

J'ai vraiment besoin de cette réponse...

toogy, il y a 13 ans

Je veux bien t'aider mais j'ai pas très bien compris exactement ce que tu voulais... :/

Babou, il y a 13 ans

Alors enfaite j'aimerai que lorsqu'on rentre des lettres dans le input ça m'affiche un message d'erreur ou quelque chose dans le type ou alors ça ne le prend pas en compte et ça fait comme si l'on n'avait rien écris.
Parce que là lorsque je tape des lettres ça met le compteur des prix à 0 mais dan sel panier mon article est toujours visible sauf que la quantité vaut "chien" ( c'est le mot que j'ai tapé ). Or j'aimerai que la quantité revienne à la quantité précédente ou alors à 1.

Typhon, il y a 13 ans

Bon j'ai réfléchis un petit coup, et voilà, je pense, le meilleur système pour faire ce que tu veux ;)

// Permet de recalculer les quantités des produits déjà existants dans le panier
    public function recalc(){
        // On parcours tout les produits du panier
        foreach($_SESSION'panier'] as $product_id => $quantity) {
            // Si une nouvelle quantité correspond au produit courant du panier 
            if(isset($_POST'panier']'quantity']$product_id])) {
                $new_quantity = $_POST'panier']'quantity']$product_id];
                // Si la nouvelle quantité est une chaine de caractère correspondante à un entier positif
                if(preg_match('/^[0-9]+$/', $new_quantity)) {
                    // Si la quantité est égale à 0, on supprime le produit du panier
                    if($new_quantity == '0') {
                        unset($_SESSION'panier']$product_id]);
                    }
                    // Sinon on modifie la quantité dans la panier
                    else {
                        $_SESSION'panier']$product_id] = $new_quantity;
                    }
                }
            }
        }
    }

On est obliger de passer par un système de preg_match, car un nombre entré dans un champs 'input' de type 'text' d'un formulaire est en faite une chaine de caractère correspondant au nombre et pas le nombre en lui même.

la fonction 'intval' n'était pas la bonne idée car si la chaine de caractère n'est pas un nombre elle le convertis en un 0 et deviens donc un nombre.

Testé et approuvé ;)

Babou, il y a 13 ans

Nickel ! Ca marche exactement comme ce que je voulais :)

Merci beaucoup beaucoup :D