L'articleCitation:
Cet article a pour but d'expliquer la création simple d'un panier en PHP.
Version imprimable
L'articleCitation:
Cet article a pour but d'expliquer la création simple d'un panier en PHP.
Bonjour,
Comme à chaque fois, article clair et precis.
Je vais le mettre en application cette semaine.
Le site pour lequel je compte l'utiliser est en lien WWW.
Merci
Bonjour RideKick.
C'est simple et assès clair, merci.
J'ai juste quelques questions pour la forme :)
Pourquoi tu n'en a pas fais une classe ?
Ensuite, pourquoi utilisé _REQUEST ?
Laisser le choix entre _GET et _POST pour passer l'action est excellent, mais du coups je comprend pas pourquoi _REQUEST pour les autres paramètres (p, q et l.
Ensuite, y'a, je pense du moins, un réèl manque de test de l'existence des variables dans certains cas de figure. (je parle évidemment d'un développement avec les erreurs PHP à E_ALL)
Exemples :
- $erreur n'a pas de valeur par défaut
- si on demande 'ajout', les valeurs $l, $q et $p ne sont pas forcément déclarés, je ne suis pas allez voir les conséquences ceci dit.
- (Je n'ai pas tout testé, y'en peut être d'autre)
Je sais que c'est des petites choses, même si c'est pas exactement un tutoriel pour les débutants non plus... Tant qu'a faire, autant donner des bons exemples.
Pour finir :
Si ni POST ni GET existe, on aura un warning php.Code:$action = (isset($_POST['action'])? $_POST['action']: $_GET['action']);
Il faut ici aussi soit changer la conditions, soit avoir une valeur par défaut.
Quoi qu'il en soit, le principe est sympa, je vais essayer d'en faire une classe :)
Evidemment, ceci sont des critiques que j'espère constructives et point négatives !
Sky
yop, bonjour,
as-tu finis la classe du panier, je serais fortement intéressé par celle-ci (je suis pas encore assez doué pour concevoir une classe) ?
Merci ! :ccool:
oups j'avais pas vu tu avais posté il y a 20 min... :oops: peut être un peu léger pour concevoir une classe...
Merci
Pour la simple et bonne raison que beaucoup de débutants s'en servent tel quel, je ferais surement un petit aparté pour la mise en classe plus tard
Qustion de facilité en effet, même si certains raccourcis ne sont pas forcement les plus judicieux
Tout à fait, encore une facilité qu'offre PHP, de plus le panier est bien à mettre sur un serveur de prod donc sans erreurs apparentes.
Tu as raison
Yep , j'avais la version du code avec valeur par défaut, oublie de ma part. (idem pour $erreur)
Merci je prends toute critique positivement, merci a toi de prendre le temps de les coucher sur le forum :ccool:
à jour :ccool:
Bonsoir,
En effet, pas mal d'améliorations :)
Bon courage pour la suite,
Sky
Edit : pour les erreurs qui apparaisse pas en prod, c'est vrai... mais c'est pas parce que les erreurs ne sont pas affichés quelles ne sont pas gérés par PHP et du coups, ralentissent (pas de beaucoup, y'a des bench la dessus) l'exécution du script global. Bon, je chipote je sais, mais plus on sais ce genre de petite chose, plus les scripts que l'on développe sont rapide.
un très grand merci pour ce tuto RideKick :ccool:, il va me servir pour l'une de mes APA ;)
Merci beaucoup pour ce tuto vraiment clair et complet pour un debutant comme moi !!!
Au passage si quelqu un la transformer en classe je suis preneur :lol:
Merci beaucoup en tous cas pour la qualite du travail fourni.
Bonjour,
j'ai voulu tester le tutorial, mais cele me renvoi des erreurs :
Voici la page html/cataloque de test que j'ai créé, j'ai essayé avec le lien en exemple mais aussi avec un formulaire, et dans les 2 cas les erreurs apparaissent.Citation:
Warning: array_search() [function.array-search]: Wrong datatype for second argument in /homez.342/ornelys/www/panier2/fonctions-panier.php on line 32
Warning: array_push() [function.array-push]: First argument should be an array in /homez.342/ornelys/www/panier2/fonctions-panier.php on line 41
Warning: array_push() [function.array-push]: First argument should be an array in /homez.342/ornelys/www/panier2/fonctions-panier.php on line 42
Warning: array_push() [function.array-push]: First argument should be an array in /homez.342/ornelys/www/panier2/fonctions-panier.php on line 43
Votre panier
Libellé Quantité Prix Unitaire Action
Votre panier est vide
voici ma page catalogue
Test avec lien
test avec formulaireCode:
1
2 <a href="panier.php?action=ajout&l=5&q=2&p=42" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter au panier</a></p>
Merci de votre aideCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <p> </p> <form id="form1" name="form1" method="post" action="panier.php"> <p>Produit : <input type="text" name="l" id="l" /> </p> <p>Qté : <input type="text" name="q" id="q" /> </p> <p>Taille : <input type="text" name="p" id="p" /> </p> <p> <input type="submit" name="action" id="action" value="ajout" /> </p> </form>
Je me réponds à moi même
Cela fonctionne avec explorer mais pas avec firefox
Après recherche,
c'est un problème niveau hébergeur
Pour ovh il faut créer un fichier .htaccess
avec : SetEnv PHP_VER 4
Hervé
Merci beaucoup pour ce tuto, il est exactement ce que je cherchais.
J'ai tout de même une demande à faire qui je pense peut intéresser d'autres personnes.
Je ne sais pas comment récupérer les données de $_SESSION dans une table.
J'ai trouvé ce code sur un autre forum :
Vous pourrez peut être m'éclairer.Code:
1
2
3 for ($i=0; $i<count($_SESSION['panier']['libelleProduit']); $i++) { mysql_query("INSERT INTO $tbl_name2 VALUES ('','$order_number','$myusername','".$_SESSION['panier']["libelleProduit"][$i]."','".$_SESSION['panier']["qteProduit"][$i]."','".$_SESSION['panier']["prixProduit"][$i]."','$total','$payment_','$date_hour') ") or die(mysql_error()); }
Tous ces champs ne m'intéressent pas, je souhaite juste comprendre pour :
- libelleProduit
- qteProduit
- prixProduit
- MontantGlobal
Ma table doit avoir combien de champs par rapport aux données des produits ?
Merci par avance à celui ou celle qui me répondra. ;)
J'ai trouvé comment faire pour pratiquement tout.
J'ai modifié ma base avec un nombre de champ fixe, j'ai 10 produits, du coup j'ai créé 10 champs pour les libellés, 10 champs pour la quantité et 10 champs pour le prix unitaire.
Bien sûr le champ pour le prix total.
Sur la page qui valide le panier, j'ai ajouté au début ce code :
jusqu'à 10 ...Code:
1
2
3
4
5
6
7
8
9 $libelleProduit1=(isset($_POST['libelleProduit1']))?$_POST['libelleProduit1']:Null; $qteProduit1=(isset($_POST['qteProduit1']))?$_POST['qteProduit1']:Null; $prixProduit1=(isset($_POST['prixProduit1']))?$_POST['prixProduit1']:Null; $libelleProduit2=(isset($_POST['libelleProduit2']))?$_POST['libelleProduit2']:Null; $qteProduit2=(isset($_POST['qteProduit2']))?$_POST['qteProduit2']:Null; $prixProduit2=(isset($_POST['prixProduit2']))?$_POST['prixProduit2']:Null; $libelleProduit3=(isset($_POST['libelleProduit3']))?$_POST['libelleProduit3']:Null; $qteProduit3=(isset($_POST['qteProduit3']))?$_POST['qteProduit3']:Null; $prixProduit3=(isset($_POST['prixProduit3']))?$_POST['prixProduit3']:Null;
Avant l'insertion dans la base j'ai mis le code suivant :
jusqu'à 10 ... pareil pour la quantité et le prix.Code:
1
2
3
4
5
6
7
8
9
10
11
12 if (!empty($_SESSION['panier']["libelleProduit"][0])) { $libelleProduit1=($_SESSION['panier']["libelleProduit"][0]); } if (!empty($_SESSION['panier']["libelleProduit"][1])) { $libelleProduit2=($_SESSION['panier']["libelleProduit"][1]); } if (!empty($_SESSION['panier']["libelleProduit"][2])) { $libelleProduit3=($_SESSION['panier']["libelleProduit"][2]); } if (!empty($_SESSION['panier']["libelleProduit"][3])) { $libelleProduit4=($_SESSION['panier']["libelleProduit"][3]); }
et dans le code d'insertion :
Mon soucis est que le montant total ne s'enregistre pas.Code:$sql="INSERT INTO $table_commande (libelleProduit1, qteProduit1, prixProduit1, libelleProduit2, qteProduit2, prixProduit2, libelleProduit3, qteProduit3, prixProduit3, libelleProduit4, qteProduit4, prixProduit4, libelleProduit5, qteProduit5, prixProduit5, libelleProduit6, qteProduit6, prixProduit6, libelleProduit7, qteProduit7, prixProduit7, libelleProduit8, qteProduit8, prixProduit8, libelleProduit9, qteProduit9, prixProduit9, libelleProduit10, qteProduit10, prixProduit10, MontantGlobal) VALUES ('$libelleProduit1', '$qteProduit1', '$prixProduit1', '$libelleProduit2', '$qteProduit2', '$prixProduit2', '$libelleProduit3', '$qteProduit3', '$prixProduit3', '$libelleProduit4', '$qteProduit4', '$prixProduit4', '$libelleProduit5', '$qteProduit5', '$prixProduit5', '$libelleProduit6', '$qteProduit6', '$prixProduit6', '$libelleProduit7', '$qteProduit7', '$prixProduit7', '$libelleProduit8', '$qteProduit8', '$prixProduit8', '$libelleProduit9', '$qteProduit9', '$prixProduit9', '$libelleProduit10', '$qteProduit10', '$prixProduit10', '$MontantGlobal')";
Sur la page ou se trouve l'affichage du montant j'ai créé un input hidden.
Mais il ne doit pas fonctionner comme il faut.Code:
1
2
3
4
5
6 echo "<td colspan=\"2\" align=right>"; echo "<p style=font-size:14px><b>Total : $ ".MontantGlobal(); echo "</b></p>"; echo "<input type=\"hidden\" id=MontantGlobal name=MontantGlobal value=".MontantGlobal(); echo ">"; echo "</td>";
Dans le code il n'est pas en $_SESSION, donc du coup je sais pas trop comment faire.
Si quelqu'un pouvait m'apporter un coup de pouce, merci d'avance ;)
Merci pour ce tuto qui m'a permi de mettre un panier sur mon site.
J'ai juste une question à propos du verrou.
A quoi il sert?
Comment verrouiller le panier?
Quelles actions peut-on faire sur le panier quand il est verrouillé?
Merci d'avance...
Bonjour,
Le verrou sert a figer le panier avant de passer a l'étape de paiement.
Si aucune précaution n'est prise de cote la, un utilisateur malveillant pourrait commander 10 articles dans une fenêtre et valider sa commande, juste avant de payer il pourrait dans une autre fenêtre enlever des articles de son panier pour descendre le montant lors du paiement.
Maintenant ça dépend énormément du scenario de commande, le verrou est juste une petite sécurité minimal mais quand on a un scénario bien rodé on peut s'en passer.
Exemple :
- La validation du panier engendre une mise en base et une identification de la commande, ainsi qu'une purge du panier, l'étape de paiement se base sur la commande validée en base.
- La plupart des modules de paiements aujourd'hui attendent des données envoyées par un formulaire, rendant difficile le genre de manipulations citées précédemment car l'utilisateur payerait 2 commandes différentes en arrivant 2 fois sur la page de paiement.
bonjour,
ca va peut etre vous paraitre nul, mais je me demande apres lecture du script, (je suis nouveau sous php)quel table doit on faire avec phpmyadmin pour valider ce script du cadie?
thank you for your lumieres!
Bonsoir,
nouveau en PHP (2 mois), je ne comprend pas comment on fait pour verrouiller le panier sur la page suivante (en l'occurrence, paiement).
Merci de me montrer un exemple...
Bonjour
Quand on modifie plusieur quantitées d'article du panier dont une a zéro.
Ce message s'affiche :
Notice: Undefined offset: 1 in /.../panier.php on line 49
la ligne 49 pour moi est :
Comment résoudre se problème ?Code:
1
2
3
4
5
6
7 46 Case "refresh" : 47 for ($i = 0 ; $i < count($QteArticle) ; $i++) 48 { 49 modifierQTeArticle($_SESSION['panier']['libelleProduit'] [$i],round($QteArticle[$i])); 50 } 51 break;
Merci
Bonjour
suite au bug dont je fais mention plus haut j'ai changer ceci :
1) pour corriger le bug sur le rafraîchissement avec une quantité a zéro
modifier dans panier.php
explication : la valeur de $i est celle de l'ancien panier mais celui-ci est modifier lors de la suppression d'un article. $a prend donc la valeur du nouveau panier.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Case "refresh" : $a = 0; for ($i = 0 ; $i < count($QteArticle) ; $i++) { if($QteArticle[$i] != 0) { modifierQTeArticle($_SESSION['panier']['libelleProduit'][$a],round($QteArticle[$i])); $a++; } else { modifierQTeArticle($_SESSION['panier']['libelleProduit'][$a],round($QteArticle[$i])); } } break;
2) pour éviter les erreurs avec les nombres négatif (en effet un client peu modifier la quantiter par -10 par ex.)
modifier dans panier.php
VoilàCode:
1
2
3
4
5
6
7
8
9
10
11
12 //On traite $q qui peut etre un entier simple ou un tableau d'entier if (is_array($q)){ $QteArticle = array(); $i=0; foreach ($q as $contenu){ $valeur = intval($contenu); if($valeur <= 0) { $QteArticle[$i++] = 0 ; } else { $QteArticle[$i++] = $valeur ; } } }
Il ma fallu du temp pour résoudre ses bug.
J'espère que sa pourra aidé ;)
Bonjour et merci de ton intérêt pour la panier !
En effet il y'a un bug concernant la quantité des articles à 0.
Comme tu l'as dis le panier change puisque ça supprime l'article donc l'index du produit n'est plus bon.
Pour le 2eme "bug", il y'à déjà un cas prévu pour ça dans la fonction de modification de l'article :
Merci à toiCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 //Si la quantité est positive on modifie sinon on supprime l'article if ($qteProduit > 0) { //Recharche du produit dans le panier $positionProduit = array_search($libelleProduit, $_SESSION['panier']['libelleProduit']); if ($positionProduit !== false) { $_SESSION['panier']['qteProduit'][$positionProduit] = $qteProduit ; } } else supprimerArticle($libelleProduit);
Bonjour
en effet cela vient de mon code de bug concernant la quantité des articles à 0.
j'ai misalors qu'il fautCode:if($QteArticle[$i] != 0)
MerciCode:if($QteArticle[$i] <= 0)
édit : Ce srais bien de mettre le tuto a jour ;)
Bonjour, juste un message pour vous remercier de ce tuto très bien réalisé.
Salut paul01, à quel moment tu précise quel libellé doit se voir ajouter une quantité ? Avec ce code, dans le cas d'un panier avec plusieurs articles, il m'est impossible d'ajouter une quantité dans le formulaire du panier, comment se fait-il ?
---> en fait, la quantité ne va pas dans le bon article ... comment se fais-ce ? :calim2:
Bonjour,
Débutante en php, je me suis lancée dans la programmation d'un site e-commerce. J'avance bien mais bloque sur le panier. Incapable d'en créer un moi même j'ai (j'avoue c'est pas beau :zoubi:) copié le script de jc Rozier.
Problème : une fois la sélection faite par le client du produit, quantité et prix sur mon site (listes déroulantes), le panier n'affiche que la première lettre/chiffre de la sélection. Pourriez vous m'indiquer la modification à apporter à votre script ?
Merci beaucoup...
P.S : je galère vraiment et ne sais pas quoi faire du tout
Bonjour,
j'aurais quelques remarques sur ce tutorial.
Je trouve la structure du panier très mauvaise.
Pourquoi ne pas utiliser directement $_SESSION['panier'][$libelleProduit], ce qui éviterait les array_search(), $positionProduit, etc.
Cela éviterait aussi de passer par un panier temporaire pour supprimer un élément ce qui me semble aberrant.
Pourquoi également utiliser array_push() pour ajouter un seul élément à un tableau ? On a un appel de fonction pour rien car on peut faire ceci :
Au final, je trouve le code de ce tutorial extrêmement lourd pour pas grand-chose, en partie à cause d'un mauvais choix de structure à la base, il me semble.Code:$arr[] = $element;
Salut
Je deterre ....
Je tente d'utiliser ce code, il marche dans l'ensemble, j'aimerai y ajouter des modifications :
- Afficher les prix comme ça 15,00 ou 26,20 au lieu de 15 et 26,2
- Ajouter un lien vers paypal avec le montant total pour que l'acheteur puisse payer directement
Merci d'avance pour vos réponses !!! Et desolé pour ce deterrage, je n'ai rien trouver sur google.
bonjour,
tu cherches mal
- http://www.php.net/round
Merci pour la reponse, j'ai pourtant pas mal cherché :?
Par ailleurs, je ne sais pas vraiment comment integrer la fonction au code de ce tuto.
Au niveau de l'affichage sur la page panier.php ou alors en amont sur le lien qui ajoute l'objet. D'experience j'aurai tendance a dire plutot à l'affichage panier.php mais alors par exemple dans ce code comment inclure la commande ? A moins que ce ne soit dans fonction_panier.php ....
Desolé pour mon ignorance !!!!
Integration paypal resolue, en ajoutant ce code au panier pour payer :
Par contre je n'arrive toujours pas afficher les 2 décimales sur le panier ...Code:<a href="https://www.paypal.com/xclick/business=ton adresse@paypal.fr&item_name=test&amount=<? echo MontantGlobal(); ?>&return=http://validé&cancel_return=http://annul&no_shipping=1&currency_code=EUR"><img src="ton image.gif" alt="Payer" border="no" /></a>
Une petite aide ?
Bon ben j'ai trouvé les solutions a mes problèmes .... merci a moi meme !!!
J'ai un autre problème sur ce panier, lorsque le nom d'un produit contient un "V", celui ci disparait, c'est a dire que dans le panier je vais avoir "oiture" au lieu de "voiture" ... ce n'est pas mortel mais c'est un peu agaçant !! :lol:
Une solution a ce problème ?
Bonjour et merci pour se tutoriel qui ma servi de base pour mon panier.
J’ai ajouté des fonctions avec des boutons plus et moins pour modifier la quantité du produit.
Mais je ne sais pas comment faire pour gérer les fonctions du navigateur Précédent, Suivant et Actualiser. En effet j’ajout un produit par l’URL suivante /mon_panier.php?action=ajout&l=L01&q=1&p=12 si je fais Actualiser (ou F5) alors j’ajout une nouvelle fois le produit. Ou bien, j’ajout un produit, je le supprime et je fais précédent comme si l’utilisateur voulais revenir à la liste des produits alors en faite je ré actualise l’Url avec l’action = ajout et du coup cela remet le produit :cry: !!
J’imagine que c’est un problème classique.
Merci de votre aide ;).
Bonjour à tous
Pour afficher les prix avec les deux décimales :
Code:
1
2
3
4
5
6
7
8
9 function MontantGlobal(){ $total=0; for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++) { $total += $_SESSION['panier']['qteProduit'][$i] * $_SESSION['panier']['prixProduit'][$i]; } return $total=number_format($total, 2, '.', '');; }
Bonjour,
J'aimerais beaucoup tester ce tutoriel mais est ce que quelqu'un pourrait mettre une capture des différents affichage ou mettre un lien vers un site l'utilisant ? et sinon quelqu'un en a fait une classe ?
Et sinon, aura t'on un jour la gestion des produits via une bdd ?
Bonjour
J'ai testé ce code mais rien ne s'affiche à part un tableau vide
Pouvez vous me dire ou l'on configure les produits ? ou si quelqu'un aurait un code fonctionne avec ,Citation:
Votre panier
Libellé Quantité Prix Unitaire Action
Votre panier est vide
Merci d'avance
Petite erreur dans la page "panier.php" lorsqu'on rédige le html pour le tableau :
Il manque juste les accolades {} apres le if :)Code:
1
2
3
4
5
6 if (creationPanier()) { $nbArticles=count($_SESSION['panier']['libelleProduit']); if ($nbArticles <= 0) echo "<tr><td>Votre panier est vide </ td></tr>";
Bonjour
Merci pour ce tuto très bien fait :)
Est il compliqué d'ajouter un nouveau choix pour les articles ? genre un select pour choisir une couleur
Car la pour ajouter un produit on passe par un lien Href , alors que si on met des choix il faut un form pour chaque article non ? pour récupérer en $_GET les valeurs
J'aimerai me faire un catalogue interne pour ajouter des produits qui ont une taille et une couleur, au final avoir un panier que j'envoi par mail :)
Merci d'avance
PS : si quelqu'un à un peu de temps et les connaissances pour modifier les ajouts dans le script je suis preneur et je suis prêt à faire un don, car tout travail mérite salaire, (je posterai d'ailleurs le contenu si besoin pour d'autres)
Edit
Je vous met mes avancées dans les modifications, pour le moment on peu donc choisir une taille pour l'article, le refresh fonctionne, reste à voir pour supprimer un article qui ne fonctionne pas encore
Le plus compliqué reste à venir, ajouter encore un select pour une couleur, j'essaye de m'y mettre mais c'est pas facile,
index.php
panier.phpCode:
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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Document sans nom</title> </head> <body> <form name="myform" action="panier.php?action=ajout" method="post" > <br> <input type="hidden" name="l" value="REFERENCE1" /> <br> Quantité<br> <select name="q" id="q"> <option value="1">1</option> <option value="2">2</option> </select><br> Taille<br> <select name="t" id="t"> <option value="39/40">39/40</option> <option value="40/41">40/41</option> <option value="42/43">42/43</option> </select> <br> Prix 12<br /> <input type="hidden" name="p" value="12" /> <br> <input type="submit" value="envoi"> <br> </form> <br /> <form name="myform2" action="panier.php?action=ajout" method="post" > <br> <input type="hidden" name="l" value="REFERENCE2" /> <br> Quantité<br> <select name="q" id="q"> <option value="1">1</option> <option value="2">2</option> </select><br> Taille<br> <select name="t" id="t"> <option value="39/40">39/40</option> <option value="40/41">40/41</option> <option value="42/43">42/43</option> </select> <br> Prix 14<br /> <input type="hidden" name="p" value="14" /> <br> <input type="submit" value="envoi"> <br> </form> <br /> </body> </html>
fonctions-panier.phpCode:
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 <?php session_start(); include_once("fonctions-panier.php"); $erreur = false; $action = (isset($_POST['action'])? $_POST['action']: (isset($_GET['action'])? $_GET['action']:null )) ; if($action !== null) { if(!in_array($action,array('ajout', 'suppression', 'refresh'))) $erreur=true; //récuperation des variables en POST ou GET $l = (isset($_POST['l'])? $_POST['l']: (isset($_GET['l'])? $_GET['l']:null )) ; $t = (isset($_POST['t'])? $_POST['t']: (isset($_GET['t'])? $_GET['t']:null )) ; $p = (isset($_POST['p'])? $_POST['p']: (isset($_GET['p'])? $_GET['p']:null )) ; $q = (isset($_POST['q'])? $_POST['q']: (isset($_GET['q'])? $_GET['q']:null )) ; //Suppression des espaces verticaux $l = preg_replace('#\v#', '',$l); //On verifie que $p soit un float $p = floatval($p); //On traite $q qui peut etre un entier simple ou un tableau d'entier if (is_array($q)){ $QteArticle = array(); $i=0; foreach ($q as $contenu){ $QteArticle[$i++] = intval($contenu); } } else $q = intval($q); } if (!$erreur){ switch($action){ Case "ajout": ajouterArticle($l,$t,$q,$p); break; Case "suppression": supprimerArticle($l,$t); break; Case "refresh" : for ($i = 0 ; $i < count($QteArticle) ; $i++) { modifierQTeArticle($_SESSION['panier']['libelleProduit'][$i],$_SESSION['panier']['taille'][$i],round($QteArticle[$i])); } break; Default: break; } } echo '<?xml version="1.0" encoding="utf-8"?>';?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>Votre panier</title> </head> <body> <form method="post" action="panier.php"> <table style="width: 400px"> <tr> <td colspan="4">Votre panier</td> </tr> <tr> <td>Libellé</td> <td>Taille</td> <td>Quantité</td> <td>Prix Unitaire</td> <td>Action</td> </tr> <?php if (creationPanier()) { $nbArticles=count($_SESSION['panier']['libelleProduit']); if ($nbArticles <= 0) echo "<tr><td>Votre panier est vide </ td></tr>"; else { for ($i=0 ;$i < $nbArticles ; $i++) { echo "<tr>"; echo "<td>".htmlspecialchars($_SESSION['panier']['libelleProduit'][$i])."</ td>"; echo "<td>".htmlspecialchars($_SESSION['panier']['taille'][$i])."</ td>"; echo "<td><input type=\"text\" size=\"4\" name=\"q[]\" value=\"".htmlspecialchars($_SESSION['panier']['qteProduit'][$i])."\"/></td>"; echo "<td>".htmlspecialchars($_SESSION['panier']['prixProduit'][$i])."</td>"; echo "<td><a href=\"".htmlspecialchars("panier.php?action=suppression&l=".rawurlencode($_SESSION['panier']['libelleProduit'][$i])."&t=".rawurlencode($_SESSION['panier']['taille'][$i]))."\">XX</a></td>"; echo "</tr>"; } echo "<tr><td colspan=\"2\"> </td>"; echo "<td colspan=\"2\">"; echo "Total : ".MontantGlobal(); echo "</td></tr>"; echo "<tr><td colspan=\"4\">"; echo "<input type=\"submit\" value=\"Rafraichir\"/>"; echo "<input type=\"hidden\" name=\"action\" value=\"refresh\"/>"; echo "</td></tr>"; } } ?> </table> </form> <br /> <br /> <a href="index.php">Retour</a> </body> </html>
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 <?php /** * Verifie si le panier existe, le créé sinon * @return booleen */ function creationPanier(){ if (!isset($_SESSION['panier'])){ $_SESSION['panier']=array(); $_SESSION['panier']['libelleProduit'] = array(); $_SESSION['panier']['taille'] = array(); $_SESSION['panier']['qteProduit'] = array(); $_SESSION['panier']['prixProduit'] = array(); $_SESSION['panier']['verrou'] = false; } return true; } /** * Ajoute un article dans le panier * @param string $libelleProduit * @param int $qteProduit * @param float $prixProduit * @return void */ function ajouterArticle($libelleProduit,$taille,$qteProduit,$prixProduit){ //Si le panier existe if (creationPanier() && !isVerrouille()) { //Si le produit existe déjà on ajoute seulement la quantité $positionProduit = array_search($libelleProduit, $_SESSION['panier']['libelleProduit']); $positionTaille = array_search($taille, $_SESSION['panier']['taille']); if ($positionProduit !== false && $positionTaille !== false) { if ($positionTaille !== true) { //echo "PRODUIT EXISTE DEJA"; $_SESSION['panier']['qteProduit'][$positionTaille] += $qteProduit ; } } else { //Sinon on ajoute le produit //echo "PREMIER AJOUT"; array_push( $_SESSION['panier']['libelleProduit'],$libelleProduit); array_push( $_SESSION['panier']['taille'],$taille); array_push( $_SESSION['panier']['qteProduit'],$qteProduit); array_push( $_SESSION['panier']['prixProduit'],$prixProduit); } } else echo "Un problème est survenu veuillez contacter l'administrateur du site."; } /** * Modifie la quantité d'un article * @param $libelleProduit * @param $qteProduit * @return void */ function modifierQTeArticle($libelleProduit,$taille,$qteProduit){ //Si le panier éxiste if (creationPanier() && !isVerrouille()) { //Si la quantité est positive on modifie sinon on supprime l'article if ($qteProduit > 0) { //Recharche du produit dans le panier $positionProduit = array_search($libelleProduit, $_SESSION['panier']['libelleProduit']); $positionTaille = array_search($taille, $_SESSION['panier']['taille']); if ($positionProduit !== false && $positionTaille == true) { $_SESSION['panier']['qteProduit'][$positionTaille] = $qteProduit ; } } else supprimerArticle($libelleProduit); } else echo "Un problème est survenu veuillez contacter l'administrateur du site."; } /** * Supprime un article du panier * @param $libelleProduit * @return unknown_type */ function supprimerArticle($libelleProduit){ //Si le panier existe if (creationPanier() && !isVerrouille()) { //Nous allons passer par un panier temporaire $tmp=array(); $tmp['libelleProduit'] = array(); $tmp['taille'] = array(); $tmp['qteProduit'] = array(); $tmp['prixProduit'] = array(); $tmp['verrou'] = $_SESSION['panier']['verrou']; for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++) { if ($_SESSION['panier']['libelleProduit'][$i] !== $libelleProduit) { array_push( $tmp['libelleProduit'],$_SESSION['panier']['libelleProduit'][$i]); array_push( $tmp['taille'],$_SESSION['panier']['taille'][$i]); array_push( $tmp['qteProduit'],$_SESSION['panier']['qteProduit'][$i]); array_push( $tmp['prixProduit'],$_SESSION['panier']['prixProduit'][$i]); } } //On remplace le panier en session par notre panier temporaire à jour $_SESSION['panier'] = $tmp; //On efface notre panier temporaire unset($tmp); } else echo "Un problème est survenu veuillez contacter l'administrateur du site."; } /** * Montant total du panier * @return int */ /*function MontantGlobal(){ $total=0; for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++) { $total += $_SESSION['panier']['qteProduit'][$i] * $_SESSION['panier']['prixProduit'][$i]; } return $total; } */ function MontantGlobal(){ $total=0; for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++) { $total += $_SESSION['panier']['qteProduit'][$i] * $_SESSION['panier']['prixProduit'][$i]; } return $total=number_format($total, 2, '.', '');; } /** * Fonction de suppression du panier * @return void */ function supprimePanier(){ unset($_SESSION['panier']); } /** * Permet de savoir si le panier est verrouillé * @return booleen */ function isVerrouille(){ if (isset($_SESSION['panier']) && $_SESSION['panier']['verrou']) return true; else return false; } /** * Compte le nombre d'articles différents dans le panier * @return int */ function compterArticles() { if (isset($_SESSION['panier'])) return count($_SESSION['panier']['libelleProduit']); else return 0; } ?>