Affichage d'une variable de session

Fermé
Drajl29 - 21 avril 2011 à 06:06
 Drajl29 - 21 avril 2011 à 17:03
Bonsoir,
Je suis actuellement en train de créer un site web commercial pour un projet de programmation. Afin de créer le panier, j'ai utiliser deux tableaux qui sont des variables de sessions: une pour la référence du produit et une pour la quantité.
Elles sont déclarées de cette manière:
$_SESSION["reference"]=array();
$_SESSION["quantite"]=array();
A la suite, j'ai un formulaire avec un SELECT, qui transmet des données à une seconde page appelée panier.php et dans cette dernière j'ai utilisé les commandes suivantes: [...]
$i = count($_SESSION["reference"]);
$j = count($_SESSION["quantite"]);
$_SESSION["reference"][$i] = $_POST["refPdt"];
$_SESSION["quantite"][$j] = $_POST["quantite"];
[...] afin de récupérer les données envoyées par le formulaire.
Mon problème est que l'utilisateur choisi les produits un à un et donc selectionne un produit dans la liste déroulante, en selectionne un autre et ainsi de suite jusqu'à la fin de son panier. Je désire donc lui afficher ce panier mais à chaque fois qu'il ajoute un produit au panier à l'aide de la liste déroulante, ça n'affiche qu'une ligne de tableau avec le dernier produit choisi et non pas TOUS les produits...

J'aimerais donc savoir comment faire pour stocker dans ces variables de session TOUTES les références et les quantités ajoutés par l'utilisateur.

Voilà j'espère avoir été assez clair.
Merci d'avance pour votre soutient.

9 réponses

Pour l'erreur de syntaxe, fautes de frappe à répétition
for ($k=0; k<=i$;k++) {
il fallait lire
for ($k=0; $k<=$i;$k++) {

Pour le while($ligne) j'ai tout simplement déclaré juste après la requête un $ligne = mysql_fetch_assoc($res) . Je m'en doutais un peu, sinon tu ne serais pas allé bien loin, mais c'est quand même mieux de ne pas avoir à faire deux fois le $ligne = mysql_fetch_assoc($res), non ? Il faut généralement éviter les recopies de code, elles sont source de problèmes surtout en cas de modification.

Ton ORDER BY ne changera rien du tout. Je ne vois pas ce que tu veux en faire. Si $_SESSION["reference"][$k] vaut 5 par exemple, ça veut dire que tu fais un "ORDER BY 5" ce qui ne donne pas grand chose. Tu voulais peut-être dire "ORDER BY reference", je ne vais pas m'étendre mais ça ne donnera rien non plus.
Pour l'instant, dans ce que tu montres, tu n'ajoutes les produits qu'à la session, pas à la BDD donc laissons la BDD de côté. Ce sont ces lignes là qui ajoutent le produit :
$i = count($_SESSION["reference"]);
$j = count($_SESSION["quantite"]);
$_SESSION["reference"][$i] = $_POST["refPdt"];
$_SESSION["quantite"][$j] = $_POST["quantite"];
Avant de le faire, il faudrait rechercher dans le tableau $_SESSION["reference"].
Une meilleur manière de faire, à mon avis, serait d'avoir un seul tableau associatif avec la référence pour clé

Tu fais directement
$_SESSION["quantite"][$_POST["refPdt"] = $_POST["quantite"];
Ça ajoute la nouvelle référence si elle n'existait pas, ça remplace la valeur si la référence était déjà dans le panier. Et il faut modifier l'affichage en conséquence

$_SESSION["quantite"][$_POST["refPdt"] = $_POST["quantite"];
foreach ($_SESSION["quantite"] as $ref=>$qte) {
$req = 'SELECT pdt_designation, pdt_prix FROM produit Where pdt_ref="'.$ref.'"';
$res = mysql_query($req);
$ligne = mysql_fetch_assoc($res);
$montant = $ligne["pdt_prix"]*$qte;
echo '<tr><td>'.$ref.'</td><td>'.$ligne["pdt_designation"].'</td><td>'.$ligne["pdt_prix"].'</td><td>'.$qte.'</td><td>'.$montant.'</td></tr>';
} // for k
echo '</table>';

(si je n'ai pas fait trop de fautes de frappe)
1
Bonjour

Il faudrait que tu montres le code de la page qui enregistre le panier et celui qui l'affiche.
Avec ce que tu dis, on ne peut pas savoir si c'est un problème d'enregistrement ou d'affichage
Remarque que si tu refais $_SESSION["reference"]=array(); à chaque soumission du formulaire, tu effaces ce qui avait été enregistré auparavant.
0
Salut,
Déjà merci pour ta réponse aussi rapide.
Voici le code du listPdt.php (où l'utilisateur saisi les produits désirés):
echo '<form action="panier.php" method="post" align="center">';
echo 'Référence: ';
echo '<select name="refPdt" size="1">';
while ($ligne)
{
echo '<option>'.$ligne["pdt_ref"].'</option>';
$ligne = mysql_fetch_assoc($res); // Ici ma requête affiche chaque produits
}
echo '</select>';
echo '   ';
echo 'Quantité : ';
echo '<input type="text" name="quantite" size="5" value="1" />';
echo '<br/><input type="submit" name="action" value="Ajouter au panier" />';
echo '</form>';

Et celui du panier.php:

$i = count($_SESSION["reference"]);
$j = count($_SESSION["quantite"]);
$_SESSION["reference"][$i] = $_POST["refPdt"];
$_SESSION["quantite"][$j] = $_POST["quantite"];
$req = 'SELECT pdt_designation, pdt_prix FROM produit Where pdt_ref="'.$_SESSION["reference"][$i].'"';
$res = mysql_query($req);
$ligne = mysql_fetch_assoc($res);
$montant = ($ligne["pdt_prix"])*($_POST["quantite"]);
echo '<tr><td>'.$_SESSION["reference"][$i].'</td><td>'.$ligne["pdt_designation"].'</td><td>'.$ligne["pdt_prix"].'</td><td>'.$_SESSION["quantite"][$j].'</td><td>'.$montant.'</td></tr>';
echo '</table>';


Et la partie de déclaration de session du fichier listPdt.php:

<?php
session_start();
if (!isset($_SESSION["reference"]))
{
$_SESSION["reference"]=array();
$_SESSION["quantite"]=array();
}
?>

Merci encore.
0
A priori, il suffit de faire une boucle sur ton tableau pour afficher toutes les lignes. Je suppose que tu as bien un session_start(); aussi au début de panier.php
...
$_SESSION["quantite"][$j] = $_POST["quantite"];
for ($k=0; k<=i$;k++) {
$req = 'SELECT pdt_designation, pdt_prix FROM produit Where pdt_ref="'.$_SESSION["reference"][$k].'"';
$res = mysql_query($req);
$ligne = mysql_fetch_assoc($res);
$montant = ($ligne["pdt_prix"])*($_SESSION["quantite"][$k]);
echo '<tr><td>'.$_SESSION["reference"][$k].'</td><td>'.$ligne["pdt_designation"].'</td><td>'.$ligne["pdt_prix"].'</td><td>'.$_SESSION["quantite"][$j].'</td><td>'.$montant.'</td></tr>';
} // for k
echo '</table>'; 

Il y a aussi 2 ou 3 trucs qui me chagrinent dans ton code :
while ($ligne)
{
echo '<option>'.$ligne["pdt_ref"].'</option>';
$ligne = mysql_fetch_assoc($res); // Ici ma requête affiche chaque produits
} 
Que vaut $ligne avant d'entrer dans la boucle ? Mystère. L'écriture classique, qui marche très bien est :
while ($ligne = mysql_fetch_assoc($res))
{
echo '<option>'.$ligne["pdt_ref"].'</option>';
} 
Comme ça, tu exécutes la requête et tu fais le test à la fois.
D'autre part, si ton client clique 3 fois sur un article, il aura 3 lignes dans sa commande avec le même article. Il faudrait remplacer une ligne, et non pas en ajouter une.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci encore,
J'ai bien mis un session_start(); en début de chaque pages.
Pour le while($ligne) j'ai tout simplement déclaré juste après la requête un $ligne = mysql_fetch_assoc($res)
Si tu veux le code complet de la requête, le voici:
$requete='Select * From produit, categorie Where categorie.cat_code=produit.pdt_categorie AND pdt_categorie="'.$categ.'"';
$resultat = mysql_query($requete);
$ligne = mysql_fetch_assoc($resultat);
Par contre, avec la boucle for j'ai ce message d'erreur:

Parse error: syntax error, unexpected '$', expecting ';' in C:\wamp\www\Aquarelle\panier.php on line 25
(la ligne 25 correspond à celle ou il y a le for.
Je sais que ça doit paraître stupide mais je ne vois pas le problème :S

Concernant le fait de voir plusieurs fois le même produit il suffirait de faire un ORDER BY .$_SESSION["reference"][$k]. dans ma requête SQL non?
0
L'erreur de synaxe bien vu j'avais modifié le i$ en $i et le k=0 en $k=0 mais pas le dernier bêtement ^_^"
Pour le while($ligne) tu n'as pas tort, c'est juste que mon prof nous a appris de cette manière et du coup je m'y suis habitué il est peut être temps de changer mes habitudes? :)
Pour le ORDER BY ça devait être la fatigue qui parlait (enfin j'espère)

Enfin pour ton idée d'un seul tableau associatif je vais te suivre car on est à peine passé sur les array en cours (d'où le but de ce projet je suppose, pour nous faire bosser dessus) donc je ne suis pas vraiment bon dessus, par contre j'ai bien fais les modifications j'ai un message d'erreur une fois de plus:
Parse error: syntax error, unexpected ';', expecting ']' in C:\wamp\www\Aquarelle\panier.php on line 24
(la ligne 24 correspond à celle là: $_SESSION["quantite"][$_POST["refPdt"] = $_POST["quantite"];)
Juste pour être sûre, vu qu'on a remplacé les deux tableaux par un seul, je peux supprimer la ligne "$_SESSION["reference"][$i] = $_POST["refPdt"];" et celle qui déclare le tableau référence dans mon fichier listPdt.php?

EDIT: J'ai trouvé, il manquait un crochet après le [$_POST["refPdt"] ^^
Tout semble marcher, je te tiens au courant mais en tout cas pour le moment merci beaucoup tu m'as beaucoup aidé déjà!
0
Effectivement, le tableau $_SESSION["reference"] n'a plus de raison d'exister.
Et bravo d'avoir corrigé mon erreur, ça montre que tu ne contentes pas de recopier .
0
Merci mais bon sans toi je n'aurais probablement jamais trouvé étant donné que j'ai tout juste vu les array :) J'avais pensé à un tableau à deux dimensions comme en C mais n'avais rien trouvé sur internet pour faire ça en php mais ce que tu m'as donné ressemble beaucoup je trouve à un tableau deux dimensions?
En tout cas je viens de tester avec chaque produits, tout marche parfaitement, il ne me reste plus qu'à réussir à faire l'ajout à la base de données et tout sera bon :-)
0
Désolé de te redéranger une fois de plus j'ai une question, j'avais complètement oublié d'afficher le montant total, pourrais-tu m'indiquer comment faire le calcul s.t.p?
J'ai trouvé la fonction array_sum sur internet j'ai donc tenté un
$total = array_sum($montant);
mais ça ne marche pas :S
Désolé de carrément demander de me donner la réponse mais... je ne connais pas du tout le moyen de faire ça :$
0