Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/04/2011, 13h11   #1
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 39
Points : 39
Envoyer un message via MSN à Kuchiki Byakuya
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 :
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
Kuchiki Byakuya est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 14h15   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
A quoi sers ta boucle foreach() ? Pourquoi tu ne fais pas un simple count() ?

Code :
$_SESSION['panier']['qte']=$_SESSION['panier']['qte']$i;
A quoi sers cette ligne ? je suis d’ailleurs surpris que sa syntaxe sois bonne.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 16h12   #3
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 39
Points : 39
Envoyer un message via MSN à Kuchiki Byakuya
bon j'édite : J'ai tenu compte de tes remarques et voici mon script :

Code :
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.
Kuchiki Byakuya est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 23h47   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 01h35   #5
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 39
Points : 39
Envoyer un message via MSN à Kuchiki Byakuya
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.
Kuchiki Byakuya est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h34.


 
 
 
 
Partenaires

Hébergement Web