8795 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je dois développer une petite interface web permettant de réserver des petits pains auprès d'une boulangerie. Le système est le suivant :

L'utilisateur accède à une liste de différentes sortes de petits pain (chocolat, amandes...) A côté de chaque intitulé, il renseigne la quantité souhaitée. Il valide sa réservation et on stocke sa commande en base de données pour que le boulanger puisse l'afficher dans son back-office.

Ma question : comment stocker dans la base chaque produit et sa quantité associée ?
Je pensais faire une table "commande" comprenant un id, le client, la date de commande et les produits. Mais comment stocker les données correctement pour pouvoir afficher plus tard qu'il y a 3 petits pains au chocolat, 2 au amandes etc... et pouvoir faire le total des produits commandés ?

Merci d'avance Smiley smile
C'est une table de type n-m, à savoir que chaque commande peut avoir plusieurs produits et chaque produit peut être dans plusieurs commandes.

A partir de là, il faudrait idéalement 3 tables, minimum 2 (et dans ce cas il te faudra une table PHP).

Table 1 "commande", comme tu l'as pensé:
- id
- client
- date (sous-entendu de commande)

id est une clé primaire avec auto-increment (critère d'unicité)

Table 2 "produits" elle peut être faite en table php voire en fichier .txt si la personne qui doit mettre à jour comprend rien au code, dans un fichier que tu incluras autant coté front que coté back-end
- id
- nom du produit
id est une clé primaire avec auto-increment (unicité)

Table 3 "commande-produit" c'est celle qui fera la jonction
- idCommande
- idProduit
- quantité


Ca c'est pour la structure.

Remplissage :
La table "produits" doit être remplie avant et elle donnera des trucs genre :
1-pain au chocolat
2-croissant aux amandes
3-croissant au beurre
...

Les 2 autres tables doivent être fait en back-end avec les réponses du formulaire. Les query vont donner un truc genre :
$rq1="insert id,client,date values ('',$client,$date)";
mysqli_query($rq1,$link);
$idCommande=mysqli_insert_id ($link);
$rq2="insert idCommande, idProduit,quantite values ($idCommande,$produit,$qte);

$produit est en fait l'id du produit; $qte, la quantité de tel produit.



Pour la récupération de la commande, il va falloir faire une jointure de type :
select * from commande as c 
left join commande-produit as cp on cp.idCommande=c.id
order by c.date


Et dans le php, un while, une vérification pour savoir si t'es toujours sur la même commande ou sur la suivante, et tu lies idProduits avec la table 2.


Voilà, je te laisse bidouiller avec tout ça. Si tu as du mal, tu reviens nous voir Smiley cligne
@Javert67 tu n'abordes pas le sujet de la sécurité. S'agit il d'une appli locale ou grand public accessible via le Web par exemple ?
Commencer par savoir faire la structure, la sécurité on en parle après ^^

Pour la sécurité, avec ma structure, il ne transmet que des chiffres, donc filter_var avec la filtre de validation suffit largement : FILTER_VALIDATE_INT.

Et pour la page qui lit les commandes, un simple htaccess avec htpassword, pas de données sensibles.
Bonjour et merci à vous pour vos réponses.

Concernant la sécurité, effectivement ce n'est pas encore le problème puisque pour l'instant je cherche simplement à comprendre la structure, la logique de fonctionnement. Mais pour répondre à ta question je vais un peu compléter le projet :

Il s'agit d'une boulangerie qui dispose de clients professionnels (des usines du coin) qui passent des commandes de petits pains tous les jours pour leurs salariés. L'idée c'est que chaque usine dispose d'un login et puisse choisir les petits pains (avec quantité respective) à commander pour le lendemain matin. Donc le "grand public" ne peut pas accéder à cette partie, uniquement les clients fidèles. Comme je ne suis pas expert en développement mais que j'ai quelques bonnes notions en PHP/SQL je cherche dans un premier temps à savoir comment créer mes bases de données puis comment effectuer les requêtes pour que la boulangerie puisse afficher dans son tableau de bord, les commandes passées par ses clients avec chaque produit, sa quantité et son prix.
J'ai l'intention de créer toutes les tables dans phpMyAdmin (pas de fichier txt)

Voici ma structure :

Table clients : id_client (clé primaire), nom_client, adresse, nombre_commandes
Table commandes : id_commande (clé primaire), id_client, date_commande
Table produits : id_produit (clé primaire), nom_produit, prix_unitaire, categorie_produit
Table detailscommandes : id_details (clé primaire), id_commande, id_produit, quantite

Pour commencer, est-ce que cette structure de BDD est correcte pour effectuer les traitements que je souhaite ?
Ensuite, quand je vais créer ces tables dans phpMyAdmin, est-ce qu'il faut lui dire qu'il y a des clés étrangères dans certaines tables ? Si oui, que faut-il mettre à la place de PRIMARY ?

Merci d'avance.
Pour la 4ème table, la clé primaire (et le champ qui va avec) que tu crées n'a aucun intérêt. C'est une simple table de jonction, elle n'a pas besoin d'un id propre.

Il vaut mieux une clé primaire composée sur id_commande, id_produit (et donc tu pourras avoir les couples 1-1, 1-2, 2-1, mais pas 2 couples 1-1), de surcroît, ça accélère la recherche, vu que tes where (ou tes "on" dans les join seront sur l'un de ses deux champs).

La clé étrangère est une clé primaire rapportée sur une autre table (c'est plus clair ici ) et il les faudra sur :
id_client (primaire en table client, étrangère en table commande)
id_commande (primaire en commande, étrangère table detailcommande)
id_produit (primaire en table produits, étrangère detailcommande)


et la structure est correcte, même si j'ignore à quoi correspondent les champs : nombre_commandes (je suppose un champs qui s'incrémente à chaque commande ?) et categorie_produit (viennoiserie, pain, sandwich fourré ?)

et en détail dans l'ordre :

id_client, id_commande,id_produit : int (et variété), autoincrement, unsigned
quantite : int (enfin plutôt tiny ou small int), unsigned
prix_unitaire : float (ou alors int et tu divises par 100 à l'affichage) unsigned
nom_client, adresse,nom_produit : varchar
categorie_produit : enum (je suppose que la liste est fixée)
date_commande : au choix un int et tu stockes un timestamp ou une date
Modifié par Lothindil (28 Feb 2014 - 14:14)
Merci pour ta réponse, je comprend bien maintenant.
Voilà une capture d'écran de mon diagramme, est-ce correct (surtout en ce qui concerne les liens entre les tables) ?

upload/39151-diagram.png
Maintenant ma question, si ma base est correcte bien sûr, c'est comment insérer une commande (et ses détails) dans la base de données ? Voici ce que j'ai essayé de faire, ma première requête fonctionne, j'ai bien une nouvelle ligne dans ma table. Par contre pour la deuxième, il ne se passe rien. De plus, je ne comprend pas trop comment faire pour lier tout ça ensemble (avec les clés...)


//On ajoute la commande dans la base
$requete = $base->prepare('INSERT INTO commandes (date_commande, clients_id_clients) VALUES(NOW(), :id_client)');
$requete->execute(array(
	'id_client' => 1
));
		
//On ajoute le détail de la commande dans la base
$requete2 = $base->prepare('INSERT INTO detailscommande (commandes_id_commande, produits_id_produit, quantite) VALUES(:id_commande, :id_produit, :quantite)');
$requete2->execute(array(
	'id_commande' => 1,
	'id_produit' => 2,
	'quantite' => $quantite
));


Merci d'avance.