IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

erreur d'operande dans un panier


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut erreur d'operande dans un panier
    bonjour à tous, voici mon petit problème : je créé un site de e-commerce en local pour m'entrainer et j'ai des soucis avec mon panier :
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    if(isset($_GET['produit']))//contient l'id du produit à ajouter au panier
    {
    	$req=mysql_query("select * from produits where id_produit='".$_GET['produit']."'");
    	$query=mysql_fetch_array($req);
    	if(!isset($_SESSION['panier']))
    	{
    		//crée le tableau session pr faire le panier
    		$_SESSION['panier'] = array();
    		$_SESSION['panier']['id_produit'] = array();
    		$_SESSION['panier']['nom_produit'] = array();
    		$_SESSION['panier']['prix_produit'] = array(); 
    		$_SESSION['panier']['qte'] = array();
    	}
    	else 
    	{
    		$selec=mysql_query("select * from produits where id_produit='".$_GET['produit']."';");
    		$select=mysql_fetch_array($selec);
                    //cette boucle suivi du if devrai me servir à eviter les doublons en augmentant la quantité
    		$i=0;
    		foreach($_SESSION['panier']['nom_produit'] as $valeur)
    		{
    			$i++;
    		}
    		if($i>0)
    			$_SESSION['panier']['qte']=$_SESSION['panier']['qte']$i;
    		array_push($_SESSION['panier']['id_produit'],$select['id_produit']);
    		array_push($_SESSION['panier']['nom_produit'],$select['nom_produit']);
    		array_push($_SESSION['panier']['qte'],$qte); 
    		array_push($_SESSION['panier']['prix_produit'],$select['prix_produit']); 
     
     
    		echo'Article ajouté au panier : Nom : '.$select['nom_produit'].' Quantité : '.$qte.' Prix unitaire :'.$select['prix_produit'].'€ Prix total : '.($_SESSION['panier']['qte']*$i).'€ <br/>Cliquer <a href="./boutique.php">ici</a> pour revenir aux choix des produits.<br/>Cliquer <a href="./panier.php">ici</a> pour voir votre panier.';
    	}
    }
    évidemment celà ne marche pas :S
    la variable $qte n'est pas encore présente donc pour mes test j'ai défini la variable $qte à 1 mais ça ne fonctionne toujours pas, voilà l'erreur reçue que je ne parviens pas à identifier :

    ( ! ) Warning: array_push() expects parameter 1 to be array, integer given in C:\wamp\www\momo\new\panier.php on line 33
    Call Stack
    # Time Memory Function Location
    1 0.0006 396296 {main}( ) ..\panier.php:0
    2 0.0055 413384 array_push ( ) ..\panier.php:33

    Sinon mon panier marche en dehors de cet aspect de doublons à suprimer en augmentant la quantité.
    Merci de m'avoir lu

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    A quoi sers ta boucle foreach() ? Pourquoi tu ne fais pas un simple count() ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['panier']['qte']=$_SESSION['panier']['qte']$i;
    A quoi sers cette ligne ? je suis d’ailleurs surpris que sa syntaxe sois bonne.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    bon j'édite : J'ai tenu compte de tes remarques et voici mon script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    <?php
    session_start();    // ouverture de session 
    require("./constante.php");   // requiert le fichier constante.php
    $link=mysql_connect("".SERVEUR."","".NOM."","".PASS."") or die(mysql_error());// Connexion à MySQL
    $database=mysql_select_db("".BASE."",$link) or die(mysql_error());     // connexion à la table
    include('./menu.php');
    echo'<div id="texte"/>';
    function verif_panier($ref_produit)
    {
        /* 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(count($_SESSION['panier']['id_produit']) > 0 && array_search($ref_produit,$_SESSION['panier']['id_produit']) !== false)
        {
            $present = true;
        }
        return $present;
    }  
    function modif_qte($ref_produit, $qte)
    {
        /* On compte le nombre d'articles différents dans le panier */
        $nb_produits = count($_SESSION['panier']['id_produit']);
        /* On parcoure le tableau de session pour modifier l'article précis. */
        $ajoute = false;
    	for($i = 0; $i < $nb_produits; $i++)
        {
            if($ref_produit == $_SESSION['panier']['id_produit'][$i])
            {
                $_SESSION['panier']['qte'][$i] = $qte[$i] + $_GET['quantite'];
    			$ajoute = true;
    		}
        }
        return $ajoute;
    } 
     
     
     
    /*on récupère l'id du produit et on detruit la variable temporaire.*/
    if(isset($_SESSION['tmp']))
    {
    	$idProduit = $_SESSION['tmp'];
    	unset($_SESSION['tmp']);
    }
    if(isset($idProduit))//contient l'id du produit à ajouter au panier
    {
    	$req=mysql_query("select * from produits where id_produit='".$idProduit."'");
    	$query=mysql_fetch_array($req);
    	if(!isset($_SESSION['panier']))
    	{
    		//crée le tableau session pr faire le panier
    		$_SESSION['panier'] = array();
    		$_SESSION['panier']['id_produit'] = array();
    		$_SESSION['panier']['nom_produit'] = array();
    		$_SESSION['panier']['prix_produit'] = array(); 
    		$_SESSION['panier']['qte'] = array();
    	}
    	$selec=mysql_query("select * from produits where id_produit='".$idProduit."';");
    	$select=mysql_fetch_array($selec);
    	$test=verif_panier($idProduit);//on lance le test pour savoir si le prouit existe déjà.
    	if($test == true )
    	{
    		$id_produits = $idProduit;
    		$ancienne_qte = $_SESSION['panier']['qte'];
    		/*on lance la moification de la quantite => on modifie la qte d'un produit précédant si c'est le meme au lieu e l'ajouter*/
    		$qte = modif_qte($id_produits,$ancienne_qte);
    	}
    	else
    	{
    		/*On rentre les valeurs dans le panier*/
    		$qte=$_GET['quantite'];
    		array_push($_SESSION['panier']['id_produit'],$select['id_produit']);
    		array_push($_SESSION['panier']['nom_produit'],$select['nom_produit']);
    		array_push($_SESSION['panier']['qte'],$qte); 
    		array_push($_SESSION['panier']['prix_produit'],$select['prix_produit']); 
    	}
    	$i=0;
    	/*pr chaque produit ds le panier, on affiche les informations qui vont avec.*/
    	echo'Votre article a été ajouté au panier.<br/>Votre panier contient donc : <br/>';
    	foreach($_SESSION['panier']['prix_produit'] as $valeur)
    	{
    		$prixtotal=$valeur*$qte;
    		echo'Nom : '.$_SESSION['panier']['nom_produit'][$i].' Quantité : '.$_SESSION['panier']['qte'][$i].' Prix unitaire :'.$_SESSION['panier']['prix_produit'][$i].'€ Prix total : '.$prixtotal.'€<br/>';
    		$i++;
    	}
    	echo'<br/>Cliquer <a href="./boutique.php">ici</a> pour revenir à la boutique.<br/>Cliquer <a href="./panier.php">ici</a> pour voir votre panier.';	
     
    }
    else if(!isset($_SESSION['panier']))
    {
    	echo'Aucun article dans votre panier. Cliquer <a href="./boutique.php">ici</a> pour revenir à la boutique.';
    }
    else
    {
    	echo'<br/>';
    	echo'<h3>Votre panier contient :</h3>';
    	$j=0;echo'<table>';
    	echo '<tr><td>Nom du produit : </td><td>Prix : </td><td>Quantité :</td><td>Modifier</td><td>Supprimer</td></tr>';
     
    	foreach($_SESSION['panier']['qte'] as $valeur)
    	{
    		echo '<tr><td>Nom du produit : '.$_SESSION['panier']['nom_produit'][$j].'</td><td>'.$_SESSION['panier']['prix_produit'][$j].'€</td><td>'.$valeur.'</td><td><a href="./panier.php?modifier=1"><img src="./image/modifier.png"/></a></td><td><a href="./panier.php?supprimer=1"><img src="./image/supprimer.png"/></a></td></tr>';
    		$j++;
    	}
     
    }
    echo'</div>';
    ?>
    Je crois avoir tester tous les cas de figure et celà fonctionne à chaque fois sauf en un cas : si l'acheteur refresh sa page après la suppression de la variable $_SESSION['tmp'] .
    Si quelqu'un peut jeter un petit coup d'oeil pour me dire s'il voit des erreurs que j'aurai pu manquer.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    la fonction array_push ne doit pas être utilisé (cf. sa documentation).

    Pour les 100 lignes de code, je ne vais pas me les relire.
    Cependant en diagonale, je vois des impasses logiques comme ton $j incrementé a la fin.
    Se baser sur une variable incrémentée pour lire un tableau c'est une mauvaise idée.

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Tout d'abord merci pour tes conseils.
    Sinon ok pour le array_push, j'ai lu ça dans un tuto donc ok je vais le modifier
    et pour la remarque sur le $j qui s'incrémente, je n'ai pas trouvé d'autre moyen de lui faire afficher la bonne valeur. Evidemment si je le retire, les valeurs sont illisibles et je reçoit un Array en sortie au lieu de ma valeur. Peut être y a t-il une méthode que je ne connais pas ( Je faisais la même chose en C et ça me paraissait pas mal ), je vais regarder dans les tutos à nouveau.

Discussions similaires

  1. erreur d'ecriture dans un fichier
    Par fjp dans le forum C++Builder
    Réponses: 4
    Dernier message: 03/07/2005, 12h31
  2. Erreur compilation DLL dans Eelphi 6
    Par jakouz dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2005, 17h38
  3. [JSP]Erreur de syntaxe dans un tag <option select
    Par logica dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 03/05/2005, 15h33
  4. Erreur type interdit dans __property
    Par Neilos dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/01/2005, 22h45
  5. [Servlet][Compilation] Erreur de compil dans code servlet
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/05/2004, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo