Pb avec le tuto panier

Jean-Jacques
Invité n'ayant pas de compte PHPfrance

06 oct. 2006, 23:51

Bonjour,
j'ai utilisé le tuto panier du forum (merci à Cyrano pour ce très bon tuto) mais j'ai un soucis pour l'utiliser correctement.
Ce que je veux : empêcher l'ajout d'un même article déjà présent dans le panier (même id_article).
Cela marche correctement SAUF pour l'article ajouté en premier dans le panier, il est rajouté à chaque fois !
J'arrive pas à voir où est ma boulette donc si quelqu'un pouvait m'aider ça serait sympa !
Voici mon code :

<?php
session_start();


function verif_panier($ref_article) 
{ 
    /* On initialise la variable de retour */ 
    $present = false; 
    /* On vérifie les numéros de références des articles et on compare avec l'article à vérifier */ 
    if(array_search($ref_article,$_SESSION['panier']['id_article']) != false) 
    { 
        $present = true; 
    } 
    return $present; 
}


function ajout($select) 
{ 
    $ajout = false; 
    if(!verif_panier($select['id'])) 
    { 
         array_push($_SESSION['panier']['id_article'],$select['id']); 
         $ajout = true; 
    } 
    return $ajout; 
} 


function display_caddie($tableau) 
{
?>
     <form id="formpanier" name="formpanier" method="post" action="panier.php">
     <table width ="568" border ="0" align="center" cellspacing ="1">
       <tr height="30" bgcolor="#484067">
         <th width="328"><span class="Style1">Article(s)</span></th>
	   </tr>
	 <?php 
     $nb_art = count($tableau['id_article']);  
     for($i = 0; $i < $nb_art; $i++) 
     { 
	 ?> 
	   <tr bgcolor="#635D7F">
	     <td align="center"><input type="text" name="id" id="id" value="<?php echo $tableau['id_article'][$i] ?>"></td>
	   </tr>
	 <?php 
     }
     ?> 
	 </table>
     </form>
<?php
}

$id_article = isset($_GET['new'])? $_GET['new']:null;

$select = array(); 
$select['id'] = $id_article; 

/* On vérifie l'existence du panier, sinon, on le crée */ 
if(!isset($_SESSION['panier'])) 
{ 
    $_SESSION['panier'] = array(); 
    $_SESSION['panier']['id_article'] = array();
} 

/* Ici, on sait que le panier existe, donc on ajoute l'article dedans. */ 
ajout($select);

Mammouth du PHP | 19672 Messages

07 oct. 2006, 14:14

Si tu appelles cette page sans paramètre, ta variable select vaut NULL. Mais tu appelles quand même la fonction d'ajout d'article : il manque un test lors de cet appel :
<?php
//...
/* Ici, on sait que le panier existe, donc on ajoute l'article dedans S'IL EXISTE . */
if(isset($select['id']))
{
    ajout($select);
}
//...
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Jean-Jacques
Invité n'ayant pas de compte PHPfrance

08 oct. 2006, 00:13

Oui effectivement j'avais oublié cette condition dans le cas où j'appelerai ma page panier sans paramètre, je te remercie.
Mais ça n'a pas résolu mon pb !
Lorsque je suis sur ma page catalogue et que je clique sur le lien "ajouter au panier", j'ai bien ma page panier avec l'article que je viens d'ajouter.Mais le pb c'est que quand je retourne sur ma page catalogue et que j'essaie de rajouter ce même article dans le panier et bien il me le rajoute quand même !! Alors que ça marche très bien pour les autres articles, je ne peux pas les rajouter s'ils existent déjà dans le panier.
En fait ça ne marche pas que pour le 1er article ajouté au panier.
Je ne comprends pas, on dirait que mon 1er article n'est pas stocké dans mon tableau ???

Mammouth du PHP | 19672 Messages

08 oct. 2006, 00:40

J'avoue que j'ai pas trop compris le pourquoi, ça m'a effectivement fait le même coup pour une raison que j'ignore complètement.

Du coup j'ai simplifié un peu le code, voici :
<?php
session_start();
if(isset($_GET['vider']))
{
    $_SESSION['panier'] = array();
}
//$_SESSION = array();
/* On vérifie l'existence du panier, sinon, on le crée */
if(!isset($_SESSION['panier']))
{
    $_SESSION['panier'] = array();
    $_SESSION['panier']['id_article'] = array();
}
function verif_panier($ref_article)
{
    return in_array($ref_article, $_SESSION['panier']['id_article']);
}


function ajout($select)
{
    $ajout = false;
    if(false === verif_panier($select['id']))
    {
        $_SESSION['panier']['id_article'][] = $select['id'];
        $ajout = true;
    }
    return $ajout;
}


function display_caddie($tableau)
{
?>
     <form id="formpanier" name="formpanier" method="post" action="panier.php">
     <table width ="568" border ="0" align="center" cellspacing ="1">
       <tr height="30" bgcolor="#484067">
         <th width="328"><span class="Style1">Article(s)</span></th>
       </tr>
     <?php
     $nb_art = count($tableau['id_article']);
     for($i = 0; $i < $nb_art; $i++)
     {
     ?>
       <tr bgcolor="#635D7F">
         <td align="center"><input type="text" name="id" id="id" value="<?php echo $tableau['id_article'][$i] ?>"></td>
       </tr>
     <?php
     }
     ?>
     </table>
     </form>
<?php
}
/* S'il y a un article en paramètre, on l'ajoute */
if(isset($_GET['new']))
{
    $article = array("id" => $_GET['new']);
    ajout($article);
}

display_caddie($_SESSION['panier']);
?>
Et là plus de problème. À noter, j'ai rajouté un vidage de panier possible pour ne pas avoir à fermer le navigateur et faire des tests.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Jean-Jacques
Invité n'ayant pas de compte PHPfrance

08 oct. 2006, 13:42

Impeccable ça marche nickel !
Merci beaucoup Cyrano, c'est vraiment très sympa.

En plus tu m'as rassuré en disant que ça t'avait fait le même pb car ça faisait un moment que je cherchais pourquoi j'avais ce résultat là !