# PHP > PHP & Base de donnes > [MySQL] panier et commande d'achat

## janyoura

salut
je veux faire un panier d'achat en ligne, mais il ne l'est pas vraiment, il n'y aura pas de paiement en ligne (c'est un projet d'tude et non pas site  hbrger) 

J'ai consult le tuto sur la cration d'un panier en php:  pour avoir une petite ide sur l'organisation du travail, mais la diffrence c'est que je veux utiliser la base de donne (cration avance d'un panier en php et Mysql).

Cependant, je ne trouve pas comment procder  cela. 
Quelles sont les principaux diffrences entre cration simple et avancs? Seulement stocks les $_POST['..'] dans un champ spcifi de la table ou y'a t'ils d'autres changements?

Pouvez vous m'clairez le chemin? 
Merci

NB: je suis de niveau dbutante

----------


## janyoura

En se basant sur la fonction ajouterPanier() du tutoriel j'ai fais ma la meme fonction mais en utilisant la base donne.
table: panier
champ: -produit
            -quantite
            -prix
            -id_client


```

```

Est ce correcte comme a? ou c'est pas la peine de changer la fonction intiale au tuto?
Comme aussi, j'ai pas su comment correspondre le nouveau panier au coordonnes du client, cd j'ai pas su comment correspondre id_client avec la table client qui contient le username, password et le nom du client connect au site (session en cours)

Merci de me fournir de l'aide afin que je corrige les fautes et que je puisse terminer les autres fonctions aprs avoir compris.

----------


## redoran

Salam ; si tu veux matrialis ton panier c'est simple , il faut reprendre les champs existant dans la table et les mtrent dans le paniers ensuite tu les insert dans ta table aprs confirmation du client.
je crois aussi qu'il te manque la date c'est important. je ne suis expert dans la matire mais juste un avis.
a propos si ta bdd est en innodb , je crois qu'il faut passer par les transactions.  ::coucou::

----------


## janyoura

> a propos si ta bdd est en innodb , je crois qu'il faut passer par les transactions.


Bonjour,
je n'ai pas compris innodb.
et est ce que le code que j'ai mis est correcte?
merci

----------


## RunCodePhp

Salut




> je n'ai pas compris innodb.


 ::google:: 
Recherche du cot GG, genre MySQL InnoDB et MyISAM.
Essai de voir les diffrences qu'il y a entre ces 2 l, leur avantages et inconvnients.
Regarde aussi quel est le moteur de MySQL est utilis pour ta Bdd, tes tables.




> et est ce que le code que j'ai mis est correcte?


Thoriquement non tant donn que le panier n'est pas li  un client, et c'est apparemment ce que tu souhaiterais faire.
Pour lier la table "panier"  la table "clients", suffit de rajouter un champ "id_client" dans la table "panier".

Dans ton projet d'tude n'est-il pas prvu toute une partie pour la conception de Bases De Donnes ?
Faire du Merise par exemple ? (de l'UML peut tre ?)
C'est thoriquement indispensable, il y a des choses qui ne se devine pas, o alors a prendra un temps fou avant de l'apprendre de manire auto-didacte.




```
$requete = $bdd->query('SELECT produit, quantite, prix FROM panier WHERE produit =\'' . $libelleProduit . ' \'');
```

Ceci par exemple est thoriquement une erreur de conception.
Normalement il doit avoir un champ "id_produit" comme cl primaire, et pour rcuprer un produit on se basera sur ce champ "id_produit", et non selon son libell.
D'une part c'est plus performant, une Bdd est plus rapide quand il s'agit de nombre entier, puis une cl primaire est un index, l encore l'accs  une donne sera plus performant.
Puis faire rfrence  un entier comme paramtre est nettement plus simple  vrifier/filtrer qu'une chaine de caractre, le cot applicatif y gagne en fiabilit, simplicit.
Il peu trs bien avoir 2 produits avec un mme libell, si c'est le cas ici ce sera source de bug.
Et enfin, faire une requte prpare serait bien mieux que de l'excuter directement. Il y a un paramtre, donc un risque d'injection SQL persistera toujours.


Concernant ce tuto.
Ne remarques tu rien sur la manire de structurer le tableau $_SESSION ?
Est-il utile, judicieux, ncessaire d'enregistrer le prix des produits dans le panier ?
D'aprs toi, comment ferait-on pour grer le panier pour un internaute non identifi comme client (donc avec ou pas de compte client de cr) et pour un internaute identifi (un client cette fois) ?

----------


## janyoura

Salut,



> Recherche du cot GG, genre MySQL InnoDB et MyISAM.
> Essai de voir les diffrences qu'il y a entre ces 2 l, leur avantages et inconvnients.
> Regarde aussi quel est le moteur de MySQL est utilis pour ta Bdd, tes tables.


est-il necessaire que je comprenne ceci pour faire un panier, sachant que comme jai dis c'est juste pour la forme c'est pas un systeme de paiement en ligne.




> Thoriquement non tant donn que le panier n'est pas li  un client, et c'est apparemment ce que tu souhaiterais faire.
> Pour lier la table "panier"  la table "clients", suffit de rajouter un champ "id_client" dans la table "panier".


Effectivement j'ai mis un id_client dans la table "panier" mais j'ai pas su comment faire aprs  ::?: 




> Dans ton projet d'tude n'est-il pas prvu toute une partie pour la conception de Bases De Donnes ?
> Faire du Merise par exemple ? (de l'UML peut tre ?)
> C'est thoriquement indispensable, il y a des choses qui ne se devine pas, o alors a prendra un temps fou avant de l'apprendre de manire auto-didacte.


Rien de prvu, d'ailleurs on n'a rien tudi concernant les bases de donnes, etc. Juste le prof nous a demand de faire un systme d'achat mais sans paiement en ligne, il n'a pas oblig d'utiliser une base de donne pour cela.





> ```
> $requete = $bdd->query('SELECT produit, quantite, prix FROM panier WHERE produit =\'' . $libelleProduit . ' \'');
> ```
> 
> Ceci par exemple est thoriquement une erreur de conception.
> Normalement il doit avoir un champ "id_produit" comme cl primaire, et pour rcuprer un produit on se basera sur ce champ "id_produit", et non selon son libell.
> D'une part c'est plus performant, une Bdd est plus rapide quand il s'agit de nombre entier, puis une cl primaire est un index, l encore l'accs  une donne sera plus performant.
> Puis il peu trs bien avoir 2 produit avec un mme libell, si c'est le cas ici ce sera source de bug.


Tout cela semble un grand travail surtout a demande du temps et moi je suis vraiment prsse :\, y'a t'il un autre moyen pour m'pargner de cette mthode? 




> Concernant ce tuto.
> Ne remarques tu rien sur la manire de structurer le tableau $_SESSION ?
> Est-il utile, judicieux, ncessaire d'enregistrer le prix des produits dans le panier ?
> D'aprs toi, comment ferait-on pour grer le panier pour un internaute non identifi comme client (donc avec ou pas de compte client de cr) et pour un internaute identifi (un client cette fois) ?


Je compte faire juste pour un internaute identifi.

Merci pour votre attention  ::):

----------


## RunCodePhp

> est-il necessaire que je comprenne ceci pour faire un panier, sachant que comme jai dis c'est juste pour la forme c'est pas un systeme de paiement en ligne.


Le paiement en ligne n'a rien  voir.
A partir du moment o on utilise une Bdd, savoir le BABA sur le choix de celle est  mon sens indispensable.

T'inviter  faire cette recherche sur ces 2 moteurs MySQL (MyISAM, InnoDB) devrait t'amener  connaitre la diffrence entre une Bdd non relationnelle et relationnelle.
-> SGBD et SGBDR.
Il y a un minimum  savoir, et a j'y peux rien.  :;): 





> Rien de prvu, d'ailleurs on n'a rien tudi concernant les bases de donnes, etc. Juste le prof nous a demand de faire un systme d'achat mais son paiement en ligne, il n'a pas oblig d'utiliser une base de donne pour cela.


Pourquoi utiliser une Bdd dans ces conditions ?




> Tout cela semble un grand travail, y'a t'il un autre moyen pour m'pargner de cette mthode?


Non, c'est plus simple justement.
Peut tre ne le perois tu pas.
Quand on conoit une Bdd, on cre des cls primaires et cls trangres, et c'est leur relations entre elles qui permet de reprsenter toute une activit et les donnes qui vont avec.
Le fonctionnement d'une Bdd est purement technique.
Un panier, un site e-commerce, un logiciel de compta, etc ... quelque soit l'activit le principe/concept est le mme.

Si on cre une Bdd sans se rfrer  ces identifiants (cl primaire, cl trangre), alors a coincera tt ou tard.
Tout cela s'apprend.
Mais comme cela ne serait pas encore fait, il est normal que tout ce que je te racontes te semble flou, peut tre mme complexe.

Cependant, il nous sera impossible de tout t'expliquer.  :;): 


Bref ...
Tu demande si le code est bon.
Je te rponds pourquoi il n'est pas bon.
C'est  toi de voir ensuite.  :;):

----------


## janyoura

> Bref ...
> Tu demande si le code est bon.
> Je te rponds pourquoi il n'est pas bon.
> C'est  toi de voir ensuite.


D'accord  ::):  merci, j'utiliserai le code fourni au tuto.

----------


## RunCodePhp

> D'accord merci, j'utiliserai le code fourni au tuto.


Essai par exemple de rpondre  ces 2 questions l, elles ne sont pas anodines.
Vu que tu est en tude, avoir un oeil critique sur un code est toujours bon ( mon avis en tout cas).



> Ne remarques tu rien sur la manire de structurer le tableau $_SESSION ?
> Est-il utile, judicieux, ncessaire d'enregistrer le prix des produits dans le panier ?


Mais comme d'hab, tu fais comme tu veux.  :;):

----------


## janyoura

Bon je remarque j'il y a deux identifient du tableau $_session: il y a 'panier' et ce que contient le panier , comme:


```
 $_SESSION['panier']['libelleProduit'] = array();
```

Je pense qu'ils sont deux tableau unis dans un seul

Pour la 2me question, oui je pense c'est ncessaire de mettre le prix du produit, pour chaque produit au panier on affiche son prix.

----------


## RunCodePhp

Concernant le prix, il est forcment dfini quelque part (Bdd, ou autre, peu importe), mais admettons dans une Bdd.

Imaginons que je suis sur ton site, j'ajoute  ce moment mme un produit dans le panier. Le prix sera celui dfini dans la Bdd actuellement.
Ensuite, juste aprs tu changes le prix de ce mme produit.
Puis ensuite, aprs ce changement de prix, j'affiche le contenu de mon panier.

Quel prix vais-je voir, le prix de dpart ou le nouveau prix modifi ?
Puis mme s'il n'y pas de paiement, quel sera le prix lors de la validation (commande), celui de dpart ou le nouveau ?

Il y a quelque chose de particulier selon la manire de grer le panier non ?


On retrouve aussi  peu prs la mme chose pour la quantit mise dans le panier, entre la quantit en stock (dfini dans le produit) et la quantit mise dans le panier.
S'il y a une quantit de 2 dans le produit (le stock) et qu'un ajoute 3 comme quantit dans le panier, faut il l'accepter ?
Ici, on se retrouvera avec un stock ngatif (-1) si la commande est faite.
L aussi il y a quelque chose de particulier, non ?


Maintenant, faut voir jusqu'o cet exercice vous demande de grer un panier.  :;): 


Pour ce qui est de la structure du tableau de session, on peu le faire au moins de 2 faons.
1/ Celle du tuto.
2/ Et comme ceci aussi : (c'est schmatique)
$_SESSION['panier'][id_produit]['quantite'] (valeur de la quantit : 2 par exemple).
(id_produit tant la valeur du produit, un identifiant : 1, ou 5, etc ...).
Les 2 sont tout aussi valables  mon sens.
Aprs,  chacun selon sa vison la dessus de plutt adhrer  l'une que l'autre.

La 2me est thoriquement plus simple  grer les produits, car (pour exemple) il n'y a plus  rechercher un produit selon une position (le tuto), l'identifiant dfini le produit.

----------


## janyoura

[quote]


> Concernant le prix, il est forcment dfini quelque part (Bdd, ou autre, peu importe), mais admettons dans une Bdd.
> 
> Imaginons que je suis sur ton site, j'ajoute  ce moment mme un produit dans le panier. Le prix sera celui dfini dans la Bdd actuellement.
> Ensuite, juste aprs tu changes le prix de ce mme produit.
> Puis ensuite, aprs ce changement de prix, j'affiche le contenu de mon panier.
> 
> Quel prix vais-je voir, le prix de dpart ou le nouveau prix modifi ?
> Puis mme s'il n'y pas de paiement, quel sera le prix lors de la validation (commande), celui de dpart ou le nouveau ?
> 
> ...


Ah oui c'est vrai, donc il ne faut pas mettre le prix que lors de la commande.




> Maintenant, faut voir jusqu'o cet exercice vous demande de grer un panier. 
> 
> 
> Pour ce qui est de la structure du tableau de session, on peu le faire au moins de 2 faons.
> 1/ Celle du tuto.
> 2/ Et comme ceci aussi : (c'est schmatique)
> $_SESSION['panier'][id_produit]['quantite'] (valeur de la quantit : 2 par exemple).
> (id_produit tant la valeur du produit, un identifiant : 1, ou 5, etc ...).
> Les 2 sont tout aussi valables  mon sens.
> ...


La 2me m'a parus plus simple, mais j'ai une petite question:
supposant que panier est une table qui contient: id_produit/quantit
en faisant $_SESSION['panier'] est ce que je rcupre le contenu du panier dans la base (normalement non je crois)?

----------


## RunCodePhp

> Ah oui c'est vrai, donc il ne faut pas mettre le prix que lors de la commande.


Pas forcment.
Rien empche au niveau des ces spcifications, dans le cahier des charges, dans le manuel ... peu importe, de cadrer parfaitement ce point, comme :
Toute modifications de prix, libell, etc ... j'en passe et des meilleurs sera fait  des heures de faible affluence/trafique, voire aucun.
Ou mme que le site prvoit de se mettre en mode "maintenance", donc plus aucun trafique possible et les modification seront fait  ce moment.

Donc on ici ce sera possible de procder comme le tuto sans risque, pour cet aspect l du moins.

Ceci dit pas vraiment, et l c'est des choses qu'on apprend lors de la conception de Bdd.
Normalement il ne faut pas crer de donnes redondantes (dupliques), a rend plus compliques la gestion de ces donnes, a augmente l'instabilit de la Bdd.
Enregistrer le prix pour un produit dans une table "panier" et enregistrer ce mme prix pour le mme produit dans une autre table "produits" fait qu'il y aura toujours un risque d'incohrence entre ces 2 prix, d'avoir 2 prix diffrent pour un mme produit.
C'est pour cette raison que l'on se base toujours (ou du moins au maximum) uniquement sur des identifiant, on fait des jointure pour "piocher" les donnes l o elles sont (et 1 fois -> 1 prix, un nom, un libell, etc ...).


Ce n'est pas toujours vrai, attention, il y a des cas particuliers, et c'est le cas pour un site type e-commerce pour certains cas.
Mais je n'irais pas plus loin, il y a beaucoup trop  dire.  :;): 


Mais disons que ce n'tait pas vraiment pour a mes questions.
C'est juste pour dire qu'il faut faire attention aux codes sur le Net ou ailleurs, il faut avoir un oeil critique, sinon a peut tre le meilleur comme le pire.
Sur le Net il y a  boire et  manger ... attention.  :;): 




> en faisant $_SESSION['panier'] est ce que je rcupre le contenu du panier dans la base ?


Non, uniquement ce que contient la session, du moins le contenu de la variable de session "panier".

Ca sous entend que le panier est stock dans 2 "support" (si on peu dire) diffrent en parallle.
Il faudrait thoriquement synchroniser les 2 pour viter des incohrences.


Mais si ce qui est demand au niveau de l'exercice ne demande pas de "pousser" les choses aussi loin, alors faut faire simple, comme un peu le tuto par exemple.
Je ne sais pas, a c'est  toi de voir.  :;):

----------


## janyoura

bonsoir,
bon voil la table que j'ai fais pour grer le panier:
table panier: 
id_produit : qui sera utiliser pour lier au caractristique du produit choisi (prix, quantit disponible) /
id_client : rfrence sur les dtails du client / 
quantit (quantit demand) 
Est ce correcte comme un choix?
le problme c'est que je dois  chaque ajout d'un produit dans le panier, faire en mme temps la jointure entre la table des produits et la table du client, est ce possible?
Je trouve un problme pour ajouter un nouveau produit, comment faire l'insertion? j'ai fais : 

```
 $rep = $bdd->prepare('INSERT INTO panier (id_produit, id_client) VALUES (?, ?) ');
```

 mais j'ai pas su comment affecter id_produit et id_client.

----------


## RunCodePhp

```
$rep = $bdd->prepare('INSERT INTO panier (id_produit, id_client) VALUES (?, ?) ');
```

Des exemples de code t'avais t donn dans d'autres topics.
Puis n'oublie pas qu'il y a un forum ddi  PDO, c'est autant d'exemples de code : SGBD - PDO

Pour insrer un panier pour un client, il faut que le client soit d'abord identifi, sinon ce ne sera pas possible.
Il faut donc que l'identifiant du client identifi soit mmoris quelque part, comme dans une session : genre $_SESSION['id_client'].

Pour le produit, l'identifiant doit tre connu, il doit provenir d'un paramtre GET ou POST (d'un lien ou formulaire) : genre : $_POST['id_produit']

A partir du moment o ces lments l sont bien obtenu, je ne vois pas o est la difficult de faire la requte SQL.





> e problme c'est que je dois  chaque ajout d'un produit dans le panier, faire en mme temps la jointure entre la table des produits et la table du client, est ce possible?


Non, il n'y a pas de jointure dans une requte d'insertion (INSERT INTO), ce n'est pas possible, ce n'est pas logique de vouloir le faire.
Comme je l'ai expliqu ci-dessus, les donnes  insrer doivent tre connues avant insertion (produit, client, quantit, etc ...), quitte  les rcuprer avant quelque part (session, Bdd, fichier, etc ...).

----------


## redoran

Salam ; 


> mais j'ai pas su comment affecter id_produit et id_client.


exemple :


```

```

 ::ccool::

----------


## janyoura

> Il faut donc que l'identifiant du client identifi soit mmoris quelque part, comme dans une session : genre $_SESSION['id_client'].


Il faut tout d'abord associer $_SESSION['id_client']  l'id client correspondant dans la table client , donc j'ai pens  faire comme suit:
- il faut que je cherche l'id du client en faisant une requte pdo qui slecte l'id ou (WHERE) le username correspond  $_SESSION['username'].
Correcte?

----------


## janyoura

voil le code que j'ai fais pour ajouter un produit au panier:


```

```

----------


## RunCodePhp

> il faut que je cherche l'id du client en faisant une requte pdo qui slecte l'id


Non, il vaut mieux te baser directement sur l'identifiant du client identifi (genre $_SESSION['id_client']).

Pour cela, et lors de la phase/tape de l'identification, il faudrait tout simplement rajouter cette donne (cette variable de session id_client) dans la session, tout comme le username.
De plus, la session sert en grande partie  a, et non juste afficher un nom, un prnom, un username, etc ...
Dans l'absolu, on s'en fiche du nom et du prnom du client, c'est son ID qui dtermine qui il est, et tout ce qui sera li  cette personne reposera sur cet ID (et pas autre chose).

D'ailleurs, plusieurs clients peuvent trs bien avoir le mme username (nom, prnom, ou autre).
Si on se repose la dessus a va tre un sacr problme, alors qu'il y en aura jamais avec un identifiant (qui lui  l'origine est bas d'un login et mot de passe o on fera tout pour qu'ils soient unique, sinon cela n'ira pas non plus).


Tu as tendance  toujours vouloir te baser sur des noms, titre, etc ... c'est une erreur  :;): .
Si tu rcupres l'ID du client par rapport  un "username", tu vas avoir un problme (tt ou tard).
Cet id_client tu vas en avoir besoin souvent, beaucoup de choses seront bases la dessus, donc le dfinir/crer une bonne fois pour tout dans la session est thoriquement ncessaire.

Vois tu pourquoi j'insiste tant sur ces identifiants ?
C'est essentiel de comprendre a  :;):

----------


## janyoura

Je comprends que c'est mieux d'utiliser l'id mais je ne trouve pas encore comment faire pour que $_SESSION['id_client'] soit le mme que l'id de ce client dans la table client :\
moi, j'ai fais ce code pour extraire l'id_client mais aprs avoir lu votre rponse, je pense que c'est faux puisque je me base sur username  ::?: 

Comment faire? vous comprenez mon problme? j'arrive pas  envisager la correspondance entre $_SESSION['id_client'] et son id dans la table.


```

```

----------


## RunCodePhp

> mais je ne trouve pas encore comment faire


Dans ton programme (le site), tu doit avoir une tape, une page (genre login.php, ou identification.php) pour permettre  un internaute de s'identifier, de se loguer en tant que client.

C'est  cette tape l o normalement tu as d crer cette variable de session "username" ($_SESSION['username']), du moins je suppose.

(Cela suppose aussi que, avant qu'un internaute puisse s'identifier comme client, qu'un compte client soit cr, qu'une page genre "creer_compte.php".
Une fois le compte cr, normalement on fait en sorte que le l'internaute soit identifi comme client, tout comme l'tape d'identifiaction).

C'est toi qui dois savoir o tout cela se droule, non ?

----------


## janyoura

ah voil, aprs avoir rflchi un petit peu, je pense que j'ai trouv la solution:
extraire $_SESSION['id_client']  partir d'un $_GET (l'id_client sera dans l'url de connexion)
Oui?
merci pour l'aide  ::):

----------


## janyoura

> (Cela suppose aussi que, avant qu'un internaute puisse s'identifier comme client, qu'un compte client soit cr, qu'une page genre "creer_compte.php".
> Une fois le compte cr, normalement on fait en sorte que le l'internaute soit identifi comme client, tout comme l'tape d'identifiaction).
> 
> C'est toi qui dois savoir o tout cela se droule, non ?


Bien sure que c'est moi  ::D: , effectivement j'ai fais de la mme sorte (page login.php)  :;):  et maintenant les ides commencent  tre plus claire dans ma tte  :;):

----------


## RunCodePhp

J'ai rpondu un peu vite (le code n'y tait pas encore).

Alors il faudrait plutt faire comme ceci :


```

```

Il ne faut pas crer/initialiser la session avant que la requte SQL soit excute, que celle-ci retourne un rsultat, sinon la personne sera considre comme identifie alors que username ne correspondrait  personne.
Faut le faire aprs vrification.
Une fois fait, suffit de crer ces 2 variable de session : "id" et "username".

Ensuite, il ne sert  rien de crer des variables $id_client et $username, exploite dans ton code directement $_SESSION['id_client'] ou $_SESSION['username'] lorsque cela est ncessaire.


Aussi, dans toutes les pages o une identification est ncessaire, obligatoire, il suffit de faire une alternative :


```

```

----------


## janyoura

J'ai fais la procdure d'ajout au panier d'un produit, mais il y a erreur : ::roll::  
y'a il une faute?
Code page: achat.php


```

```

erreur:


```

```

J'ai test le problme en faisant echo $id_produit et effectivement j'ai eu une erreur *undefined variable $id_produit* 
Normalement id_produit doit provenir du lien de redirection lors du clic sur 'ajouter au panier' (dans une autre page que achat.php)

```
<a href="achat.php/id_produit=<?php echo $film['id_film'] ?>"> Ajouter au panier </a> // ça marche correctement dans l'URL; c'est affiché le id_produit
```

----------


## RunCodePhp

> Notice: Undefined variable: req ...etc... achat.php on line 33


L'erreur retourne est trs clair : $req n'existe pas, donc elle ne serait pas affecte/initialise.

A la ligne juste au-dessus : $rep = $bdd->prepare(...) tu as fais une faute de frappe.
remplace $rep par *$req*




```
<a href="achat.php/id_produit=<?php echo $film['id_film'] ?>"> Ajouter au panier </a>
```

Il y a une erreur de syntaxe.
Pour "passer" (transmettre) une valeur en paramtre, la bonne syntaxe c'est :


```
<a href="achat.php?id_produit=<?php echo $film['id_film'] ?>"> Ajouter au panier </a>
```

Exp. : page.php?param1=valeur1&param2=valeur2


N'oublie pas qu'il y a beaucoup de cours, tutos, etc ... sur ce forum, comme :
Le tutoriel pour grands dbutants presss
J'ai jamais pris le temps de parcourir ce tuto, mais  mon avis il doit avoir des choses intressantes.

Juste pour information comme a.
Normalement il est prfrable de privilgier d'utiliser un formulaire pour ce genre d'oprations (ajout, modification, suppression au panier, etc...) pour une raison simple.
Normalement le site est destin  tre sur le Net, et son contenu tre rfrenc/index par des moteurs de recherches.
Les moteurs de recherches jusqu' lors "suivent" les liens prsents des pages mais pas les formulaires.
Donc si on met un lien pour ajouter un produit, tous les moteurs de recherches pourraient alors eux aussi ajouter des produits dans le panier.
Permettre cela devient quelque part absurde, on peu considrer cela comme un bug.

Pour ton exo je pense que ce n'est pas gnant (c'est  toi de voir), faut juste le savoir.  :;): 
Les liens selon le contexte est par moment indispensable, par moment  proscrire.

----------


## janyoura

le problme undefined variable id_produit reste toujours  ::?: 
Ai-je fais une erreur dans la transmission  travers l'URL?? j'ai corrig / par ? mais a marche toujours pas

----------


## janyoura

code qui contient le lien de redirection:


```

```

----------


## xeloch

Je vais peut tre dire quelque chose de tout bte.
As tu fais un echo pour voir si ton code passe dans le test vrifiant la prsence de ton id_produit?
Au lieu de faire un echo $id_produit; faire un echo "test"; et voir si le test est pris en compte?

----------


## janyoura

> Je vais peut tre dire quelque chose de tout bte.
> As tu fais un echo pour voir si ton code passe dans le test vrifiant la prsence de ton id_produit?
> Au lieu de faire un echo $id_produit; faire un echo "test"; et voir si le test est pris en compte?


Je n'ai pas compris, quelle est la diffrence entre echo $id_produit et echo test? Que contient "test"?

----------


## xeloch

La tu as tester en faisant un echo $id_produit;
Donc normalement aprs avoir affecter ta valeur. Cependant si ton test n'est pas pris en compte $id_produit n'existe pas.

Alors que si tu fais :


```

```

Si le test s'affiche sur ta page, cela voudrait dire que ton test est pris en compte et que l'erreur de ta variable viendrait de son affectation ou de la rcupration de sa valeur

----------


## janyoura

> Si le test s'affiche sur ta page, cela voudrait dire que ton test est pris en compte et que l'erreur de ta variable viendrait de son affectation ou de la rcupration de sa valeur


Test ne s'affiche pas  ::?:

----------


## RunCodePhp

En faite c'est normal, la page achat s'attend  ce que les donnes soient transmises en POST via un formulaire :

C'est ce code :


```

```

Du coup on entre pas dans cette condition l.

Pour que la gestion du panier (de achat.php) soit plus simple, au lieu de crer un lien pour ajouter un produit (ou film), crer un formulaire, avec un bouton submit avec le mme nom : valider
Avec un champ cach (type hidden) pour transmettre 'id_produit'.


achat.php contient aussi une autre erreur, le header() qui dfini l'encodage est mal plac : (faut le faire au tout dbut, avant le moindre envoie HTML)


```

```

----------


## janyoura

> En faite c'est normal, la page achat s'attend  ce que les donnes soient transmises en POST via un formulaire :
> 
> C'est ce code :
> 
> 
> ```
> 
> ```
> 
> Du coup on entre pas dans cette condition l.


On entre mais il y a une erreur dans la rcupration de id_produit.



> Pour que la gestion du panier (de achat.php) soit plus simple, au lieu de crer un lien pour ajouter un produit (ou film), crer un formulaire, avec un bouton submit avec le mme nom : valider
> Avec un champ cach (type hidden) pour transmettre 'id_produit'.


un autre formulaire avec le bouton submit: valider. Ah d'accord je ferai comme a peut etre a rsoudra le problme

----------


## RunCodePhp

> On entre mais il y a une erreur dans la rcupration de id_produit.


Si le code ici (plus haut) de achat.php est le mme que tu as chez toi, c'est impossible.
Un lien transmet les donnes en GET, et non en POST, donc c'est pas possible.
Pour bien se comprendre : On ne peu pas entrer dans la condition, mais la page elle sera affiche.


Au passage corrige cette erreur sur le header(), c'est important.
Je n'explique pas pourquoi car c'est un peu long.  :;):

----------


## janyoura

> Si le code ici (plus haut) de achat.php est le mme que tu as chez toi, c'est impossible.
> Un lien transmet les donnes en GET, et non en POST, donc c'est pas possible.


dans achat.php il y'a un formulaire, peut etre vous ne l'avez pas remarqu, le voil:


```

```




> Au passage corrige cette erreur sur le header(), c'est important.
> Je n'explique pas pourquoi car c'est un peu long.


D'accord  ::):

----------


## xeloch

Une question.
Ton id_produit s'affiche t'il apres le clique sur le lien?
Car la tu arrives donc bien avec ton id.
Cependant quand tu excutes ton formulaire en mettant une action sur "achat.php" tu as supprimer le passage de ton id_produit en Get et c'est pour cela qu'il ne le rcupre pas et donc n'entre pas dans le test

----------


## janyoura

> Une question.
> Ton id_produit s'affiche t'il apres le clique sur le lien?
> Car la tu arrives donc bien avec ton id.


Oui lorsque je clique sur le lien id_produit est bien associ.

----------


## xeloch

Trs bien maintenant regarde sur quoi pointe ton formulaire.

Il ne pointe pas sur ta page "achat.php" reprenant l'identifiant de ton produit, mais uniquement sur une page "achat.php". C'est pour ca qu'il ne reprends pas l'identifiant du produit aprs l'excution du formulaire.

Aprs a c'est la correction de ton code, mais je pense que la solution de RunCodePhp est beaucoup plus correct.

Alors au final c'est toi qui choisis comment procder  :;): 


Edit : RunCodePhp, je viens de lire ton post suivant, si elle entre dans le test de valider, puisque son echo $id_contenu lui as retourner un resultat.

le soucis se trouve au niveau du formulaire avec ceci normalement cela devrait mieux fonctionner en suivant sa mthode



```

```

----------


## RunCodePhp

> dans achat.php il y'a un formulaire, peut etre vous ne l'avez pas remarqu, le voil:


Oui, j'ai un peu rctifi ma remarque.
La page elle est bien affiche, pas de souci, mais on entre pas dans la condition du isset() de "valider", et les traitements ne seront pas effectus (ceux entre les accolades).

La condition s'attend  ce qu'un lment "valider" existe et soit transmit en POST.

Comme un lien transmet les donnes en GET, tu rencontre un problme.
Pour faire simple, le mieux est de tout faire via un formulaire en POST.

----------


## janyoura

> Comme un lien transmet les donnes en GET, tu rencontre un problme.
> Pour faire simple, le mieux est de tout faire via un formulaire en POST.


Voil j'ai fais tout dans un formulaire:


```

```

a devra fonctionner comme a, non?

----------


## janyoura

Problme corrig  ::):  

effectivement *xeloch*, la faute est dans 'action' du formulaire.

*RunCodePhp*, le formulaire modifi correspond t'il a votre proposition de correction de la faute?

Merci  vous deux

----------


## RunCodePhp

Pourquoi $_GET['id_produit'] ?

C'est quoi au juste achat.php ?

Normalement les choses devraient se drouler au minimum en 2 temps, dans 2 pages diffrentes.
- Une page d'un dtail d'un produit dans le but d'ajouter un produit au panier
- Puis le panier : sa gestion des divers produits qu'il peu contenir. Un panier peu potentiellement contenir plusieurs produits.

Au dpart je pensais que achat.php tait l'quivalent du dtail du produit.
Maintenant j'ai l'impression que c'est le panier et sa gestion.


La faon de nommer tes fichiers porte  confusion (du moins celui l).
Dans tous les cas il n'y a pas d'achat, pas de commande, pas  ce stade, car on en est au panier seulement.
S'il y a un processus d'achat, a donnerait lieu  un autre fichier, une autre action : "acheter" (ou commander, qui est en gnral plus utilis).
C'est juste une remarque.  :;):

----------


## RunCodePhp

> RunCodePhp, le formulaire modifi correspond t'il a votre proposition de correction de la faute?


Je ne sais pas, je ne sais, plus, c'est un peu l'embrouille.  ::mrgreen:: 

J'suis un peu perdu sur ce coup l.
Faire plusieurs choses en mme temps c'est pas vident par moment.  :;):

----------


## xeloch

C'est vrai qu'aux premiers abords achat.php correspond au moment de la transaction.
Alors que la on dirait plus etre au niveau de l'ajout dans le panier non?

----------


## janyoura

> Pourquoi $_GET['id_produit'] ?


Celui qui existe dans action du formulaire? j'ai du l'ajouter pour que a marche, lorsque je ne le mets pas, il y a l'erreur undefined $id_produit aprs dans la condition  .




> C'est quoi au juste achat.php ?


C'est le panier, ce n'est qu'une page d'essai achat.php. je compte ajouter dans cette page l'affichage du panier aprs l'ajout du produit, mais j'ai un petit problme; aprs la validation (l'ajout dans la base), le formulaire reste afficher alors que je veux afficher 'succs d'ajout' et puis affichage du panier.

----------


## xeloch

> Celui qui existe dans action du formulaire? j'ai du l'ajouter pour que a marche, lorsque je ne le mets pas, il y a l'erreur undefined $id_produit aprs dans la condition .


Je t'ai donn une solution plus propre que de rappeler ta variable  la deuxime page.

Utilise :


```
<form action = "<?php $_SERVER['PHP_SELF'] ?>" method="post">
```

Enfin je peux me tromper mais a moi cela me semble plus propre. (Juste une remarque aussi  :;): )

----------


## janyoura

> Je ne sais pas, je ne sais, plus, c'est un peu l'embrouille. 
> 
> J'suis un peu perdu sur ce coup l.
> Faire plusieurs choses en mme temps c'est pas vident par moment.


Vous avez raison  ::mrgreen:: , moi mme a m'arrive l'embrouille, j'ai des tas de pages  faire en mme temps, du fait souvent j'ai des fautes c'est pourquoi je poste au forum. 

(Nous sommes trs mal encadrs par le prof malheureusement ou plutt aucun encadrement ni prparation et en plus de a le temps du projet est trop limit)

Merci pour votre attention  :;):

----------


## RunCodePhp

> C'est le panier, ce n'est qu'une page d'essai achat.php. je compte ajouter dans cette page l'affichage du panier aprs l'ajout du produit, mais j'ai un petit problme; aprs la validation (l'ajout dans la base), le formulaire reste afficher alors que je veux afficher 'succs d'ajout' et puis affichage du panier.


Je comprends mieux pourquoi maintenant, du moins j'espre.
En faite ne voyais pas ce qu'un panier devrait normalement contenir.
(si tu pouvais le nommer panier.php, ce serait bien plus simple, plus d'amalgame possible).

Le code actuel prvoit juste d'insrer le et l'unique produit qu'on tente d'ajouter au panier.
Thoriquement a ne va pas, car un panier (du moins la gestion du panier) c'est pour afficher/grer plusieurs produits.
En somme, on doit percevoir une boucle quelque part.
Comme c'est la session ($_SESSION['panier']) qui contient le ou les produits, on devrait voir une boucle sur celle-ci.

C'est aussi en parti pour cela que le formulaire ne devrait pas faire allusion  $_GET['id_produit'], car cette donne vaut l'identifiant du produit qu'on tente d'insrer, et non les ou les produits composant le panier.


Pour quelqu'un qui dbute, je trouve que tu t'attaque  quelque chose assez compliqu tout de mme.
Normalement il faut bien plus que les bases (Php, Base De Donnes) pour faire a, du moins je pense.  :;): 
M'enfin.

Est-ce que les tapes d'avant sont faites, fonctionnelles ?


Si on tente de rcapituler tout a en se basant sur ce qui ce fait en gnral :
- Une page d'accueil contenant un menu : en gnral une liste de catgories de produits (genre : films d'actions, films de science fictions, etc ...).
Un clic sur une des catgories mnera  l'tape suivante (ci-dessous).

- Une page "catgorie" listant tous les produits de la catgorie demande.
Les produits sont lists sous forme de liens.
Chaque lien mne vers le dtail du produit.

- Une page "produit" dtaillant le produit demand.
Un formulaire (mthode POST) est propos afin d'ajouter le produit dans le panier.
(A voir, le formulaire peu inclure le choix de la quantit)

- Une page "panier" permettant de grer tous les produits ajouts au panier.
3 actions sont possible :
-- Modification de la quantit de chaque produit (individuellement)
-- Suppression d'1 des produits
-- Suppression de la totalit des produits (du panier indirectement).
Une liste de formulaires (1 formulaire par produit) sera cr pour grer chaque produit individuellement (boucle sur la session).
(On peu crer 1 seul et unique formulaire pour l'ensemble des produits, mais c'est plus compliqu  mon sens).

Est-ce que tu procdes comme ceci ? (ou plus ou moins)
Si ce n'est pas le cas, qu'est-ce qui diffre ?

----------


## janyoura

> Le code actuel prvoit juste d'insrer le et l'unique produit qu'on tente d'ajouter au panier.
> Thoriquement a ne va pas, car un panier (du moins la gestion du panier) c'est pour afficher/grer plusieurs produits.
> En somme, on doit percevoir une boucle quelque part.
> Comme c'est la session ($_SESSION['panier']) qui contient le ou les produits, on devrait voir une boucle sur celle-ci.


oui je veux faire comme a car un client peut mettre plusieurs produits, mais je ne suis pas encore arrive  bien manipuler $_SESSION['panier'], je ne sais pas d'ailleurs comment :\




> C'est aussi en parti pour cela que le formulaire ne devrait pas faire allusion  $_GET['id_produit'], car cette donne vaut l'identifiant du produit qu'on tente d'insrer, et non les ou les produits composant le panier.


j'ai chang l'action du formulaire par: 

```
<?php $_SERVER['PHP_SELF'] ?>
```

cela enlve t'il lambigut?






> Est-ce que les tapes d'avant sont faites, fonctionnelles ?
> Si ce n'est pas le cas, qu'est-ce qui diffre ?


- Une page de bienvenue pour l'utilisateur connect contenant deux liens: lien vers la liste des film et un lien vers la listes des musiques. 

-A la liste des films on trouve un tableau, dans chaque ligne contient le nom du film et ces details, ainsi qu'un lien 'Ajouter au panier' qui dirigera vers panier.php(code de achat.php). (de meme pour le lien liste des musiques)

enfin, voil le code que je suis entrain de dvelopper pour l'affichage du panier:


```

```

----------


## janyoura

j'ai oubli de dire que dans la gestion du panier il n'y aura que l'ajout d'un produit et l'affichage du panier ensuite un lien pour la validation du panier (commande), je ne ferai pas comme un vrai site d'achat en ligne (modification d'une quantit ou enlvement d'un produit du panier)
Quoi d'autre.. il manque aussi la vrification du stock produit (sa quantit) lors du choix de quantit dans le formulaire

----------


## RunCodePhp

> -A la liste des films on trouve un tableau, dans chaque ligne contient le nom du film et ces details, ainsi qu'un lien 'Ajouter au panier' qui dirigera vers panier.php(code de achat.php). (de meme pour le lien liste des musiques)


Alors pour viter les complications, dans cette page qui contient la liste des film et leur dtail, il faudrait non pas crer un lien, mais un formulaire en POST.
Ceci c'est pour la mme raison qu'auparavant : le panier attend que les donnes soient en POST.
Si c'est en GET, tu vas avoir le mme problme que tout  l'heure.

Il faudra l aussi rajouter l'id_produit dans un champ cach, et ventuellement la quantit (mettre 1 comme valeur par dfaut).

Pour la session, c'est simple : $_SESSION est un tableau comme tous les autres, ni plus ni moins (c'est un peu faux, mais fonctionnellement c'est pareil).
Donc une simple boucle foreach() suffit pour lister son contenu.


Cependant, les produits du paniers sont eux aussi dans la Bdd, et c'est l que les choses se compliquent quand mme.
Faut il se baser uniquement sur ce que contient la Bdd ou uniquement la session ?
Normalement il faudrait synchroniser les 2, mais c'est compliqu.

Vu que tu dbute, je te conseillerais de ne plus enregistrer la panier dans la Bdd, mais les enregistrer uniquement dans la session, ne serait-ce que dans un 1er temps.
Synchroniser les 2 c'est vraiment compliqu, car une session  une dure de vie, un temps d'expiration (par dfaut 24 minutes).
Tu vas avoir invitablement une incohrence entre ce qu'il y aura dans la Bdd et dans la session.
C'est compliqu, a va te prendre beaucoup de temps  le faire.
Te baser uniquement sur la session sera nettement plus simple.
C'est un conseil, videmment.  :;):

----------


## janyoura

> C'est compliqu, a va te prendre beaucoup de temps  le faire.
> Te baser uniquement sur la session sera nettement plus simple.
> C'est un conseil, videmment.


Le problme je ne sais pas pourquoi j'ai tendance  comprendre ce qui est compliqu et non le facile!!!!  ::roll:: 
Merci pour le conseil, je n'ai plus mme le temps de changer la mthode, donc je garderai la gestion avec la base de donne mme s'il'y aura des bugs dans certains cas comme vous m'avez expliqu (je devrai rendre le projet demain et j'ai encore d'autres taches concernant la session, parce que la visite du site et sa manipulation diffre entre un administrateur et un utilisateur)

----------


## RunCodePhp

> je devrai rendre le projet demain ...
> 
> j'ai oubli de dire que dans la gestion du panier il n'y aura que l'ajout d'un produit et l'affichage du panier ensuite un lien pour la validation du panier


Wouu, demain  :8O: 
C'est clair que, quand on a pas le sujet, qu'on ne connait pas le contexte, nous on ne peu que conseiller de faire les choses quelque peu dans les rgles de l'art (si on peu dire).

Et respecte le sujet.
Effectue uniquement l'ajout, le code est thoriquement fait.
Et affiche seulement le contenu du panier, donc dans cette page achat.php ne met pas de formulaire, rien.

S'il faut quand mme une validation et que cela dbouche sur page rcapitulant l'ensemble des produits, commande.php, suffit de crer un simple lien vers commander.php.
Puis faire un copier/coller du mme code dans achat.php qui sert  afficher les produits.
Termin.  :;): 


Quelque chose comme :


```

```

----------


## janyoura

> S'il faut quand mme une validation et que cela dbouche sur page rcapitulant l'ensemble des produits, commande.php, suffit de crer un simple lien vers commander.php.
> Puis faire un copier/coller du mme code dans achat.php qui sert  afficher les produits.
> Termin.


oui c'est ce que j'ai fais comme code dans achat.php(devenu panier.php)
il me reste une petite question: je veux aussi dans le mme code que vous m'avez donn comme exemple compter le prix total des produits, pour ensuite lors du formulaire POST envoy  commande.php je l'affiche.
j'ai fais:


```

```

----------


## RunCodePhp

J'ai un peu complt le code de mon post plus haut.
Rajout l'insertion du produit
Redirection aprs insertion + un message de confirmation
Puis une alternative dans la cas o le panier ne contenait rien.

Ca ne devrait pas tre trop loin.




> comme exemple compter le prix total des produits


Le plus simple c'est de faire une requte  part pour a.
Quelque chose comme :


```

```

Puis faire un simple fectch() (et non fetchAll), car ceci retournera obligatoirement 1 ligne (la somme des prix).


Si ca coince (solution 2 ou plan B), suffit de parcourir le tableau du panier avant affichage et additionner les prix.


```

```

Suffit aprs d'afficher $somme_prix l o tu veux.

----------


## janyoura

```

```

erreur:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1630 FUNCTION projet.SUM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual' in C:\Program Files (x86)\EasyPHP-5.3.8.0\www\projet\panier.php:92 Stack trace: #0 C:\Program Files (x86)\EasyPHP-5.3.8.0\www\projet\panier.php(92): PDO->query('SELECT SUM (f.p...') #1 {main} thrown in C:\Program Files (x86)\EasyPHP-5.3.8.0\www\projet\panier.php on line 92

----------


## RunCodePhp

Supprime l'espace entre le SUM et la parenthse pour voir : SUM(f.prix)


J'ai pens  un autre petit dtail.
Normalement il faudrait rajouter dans la requte l'id_client pour que l'affichage du panier ne concerne que celui du client identifi.
Sinon a sera tous les produits sans exception, donc de tous les clients.

Quelque chose comme :


```

```

----------


## janyoura

> Supprime l'espace entre le SUM et la parenthse pour voir : SUM(f.prix)
> 
> 
> J'ai pens  un autre petit dtail.
> Normalement il faudrait rajouter dans la requte l'id_client pour que l'affichage du panier ne concerne que celui du client identifi.
> Sinon a sera tous les produits sans exception, donc de tous les clients.


a marche maintenant la somme mais je me suis rendu compte que j'ai besoin de la somme  en considrant la quantit de chaque produit.

pour la remarque, oui je compte le faire. Merci pour le rappel  ::):

----------


## RunCodePhp

> maintenant la somme mais je me suis rendu compte que j'ai besoin de la somme en considrant la quantit de chaque produit


Et bien il suffit de rajouter la multiplication sur la quantit :
... SUM(f.prix * p.quantite) ...

----------


## janyoura

Lors de la validation du panier (c'est  dire passage  la commande) je dois dcrmenter la quantit de chaque produit, Comment le faire, j'ai fais un essai de code mais j'ai pas su comment dcrmenter la quantit(valeur de $nvquantite).


```

```

----------


## RunCodePhp

Je ne vois pas trop ce que tu souhaites faire, et surtout  quel moment.

En gnral ce n'est pas ainsi que a se fait.
En gnral (toujours), on ne dcrmente pas au niveau du panier pour la simple raison qu' ce moment il n'y a pas eu d'achat, de paiement, le client n'est pass  la caisse (si on peu dire).
Si on souhaite le faire quand mme c'est un vritable casse tte.

Le dcompte du stock peu avoir lieu une fois que le client a pay la commande, c'est d'ailleurs un des points les plus dlicat d'un site e-commerce.
Cependant, beaucoup de boutiques ne font pas de dcompte  cette tape cause de cela, en faite ils font ce qu'on appel de la vente hors stock.

La gestion du stock se fera sur un autre logiciel aprs importation des donnes (des commandes) : donnes de la boutique vers le logiciel de compta/gestion de stock.

Tout cela c'est juste pour information, comme toujours.  :;): 


Si dans cet exercice on demande de faire un dcompte du stock lors de la commande (ici une simulation), alors il faut faire une soustraction entre quantit en stock et la quantit commande du panier du client identifi :


```

```

(Fait en sorte de mettre une quantit assez leve au niveau des produits (films), sinon au dcompte tu risque d'avoir un nombre ngatif, ceci pourrait tre vu comme un dfaut, voire un bug).

----------

