Partage
  • Partager sur Facebook
  • Partager sur Twitter

Enregister une Commande dans une bdd

Sujet résolu
    3 août 2018 à 15:12:14

    Bonjour,

    Je suis en train de faire un site, sur lequel la commande d'artivle sera disponible. J'ai déja fais le panier, il fonctionne bien. Je m'attaque maitenant à la partie enregistrement dans la bdd.

    Et c'est la que je me pose pas mal de question. En gros, Comment enregistrer de manière optimale une commande

    J'ai un table users avec (id, email, nom, prenom,....)

    Une table produit (id, prix,....)

    Et la je veux créer la table commande (id, id_user,....)

    La ou je bloque c'est pour construire correctement la partie produit et quantité. je ne sais pas comment faire exactement. Une colone produit_id avec les id des produit commandés et une colonne avec quantité avec toutes leur quantité respective? ça me semble bof, meme tres bof il me faudra ensuite les récupérer en séparant tous ça. Du vrai bidouillages je trouve, et pas pratique ppour visualiser ensuite une commande rapidement.

    Je viens d'avoir une autre idé, ça serait de faire 2 tables. Une table commande (id, date, client, prix_total,...) et une colonne produit commandé (id_commande, id_produits, quantité, sous_total_produit). Mais je ne vois pas quoi mettre comme clé primaire la dedans..

    Mais cette seconde solution me semble bien meilleure

    Qu'en pensez vous??

    Merci a vous

    • Partager sur Facebook
    • Partager sur Twitter
    Le plus souvent la cause du bug est situé devant l'écran ;)
      3 août 2018 à 15:19:06

      Bonjour,

      Ta deuxième solution me paraît plus aboutie. En effet, dans la table `commandes` tu pourrais également mettre des informations sur l'expédition, le statut (payé ou pas), bref des choses qu'il faudrait répéter si tu n'avais qu'une seule table.

      Ta table `produits_commandes`devrait alors comporter l'id_produit, l'id_commande (pas besoin de l'id_client qui sera dans `commandes`) ainsi que la quantité par exemple.

      • Partager sur Facebook
      • Partager sur Twitter
        3 août 2018 à 15:49:23

        Bonjour,

        Si tu utilises une base de données relationnelles (type MySQL), la seule façon de voir les choses consiste à faire 4 tables :

        • client ( id [pk], identifiant, motdepasse, etc. )
        • produit ( id [pk], designation, etc. )
        • commande ( id [pk], id_client [fk], date_creation, statut, etc. )
        • commande_produit ( id_commande [pk][fk], id_produit [pk][fk], quantite, etc. )

        Ton panier est en fait une commande à l'état "Panier", et qui contient les articles/quantités choisis par le client.

        Lorsque le client décide de valider son panier en commande, tu n'as plus qu'à changer le statut de la commande à "Validé" par exemple ...

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          3 août 2018 à 16:11:21

          Merci beaucoup pour vos réponses rapide,

          Je vais partir sur 2 table séparé, ça me parait plus simple dans ma tête et beaucoup plus clair

          Le fait de ne pas avoir de clé primaire sur la table 'produit_commande' c'est trés bof non?  interdit? Dans le pire des cas ajouter un champ id en PRIMARY KEY resoudra mon probleme

          Je pense que ça s'éclaircira aussi en avançant

          Je suis assez surpris puisque j'ai pas trouvé de réponse clair à ma question lors de mes recherches, ça me semble pourtant être une question importante, qui doit revenir assez souvent, e un bon exercise d'entrainement!

          Edit

          Benzouye a écrit:

          • commande_produit ( id_commande [pk][fk], id_produit [pk][fk], quantite, etc. )

          [pk] dfinie bien la primary key, on a le droit d'avoir 2 primary key ? ça vient du fait que une colonne de commande produit et totalement défini lordque que l'on connait le produit et la commande à laquelle il appartient non?


          Par contre pour le statut de la commande, le principe c'est bien de la stocker en valier ou pas (payé ou pas) et dans le cas non valider, de la reproposer à l'utilisateur lorsqu'il se reconnecte? Ceci étant "un cookie avancé" (désolé si c'est pas beau) car l'utilisateur retrouvera sa commande lors de sa connexion, peu importe l'appareil ? Le truc serait donc d'enregistrer la commande lorsqu'on deconnete l'utilisateur (juste avant). (mon panier est fait en $_SESSION['panier']

          -
          Edité par QuentinVidal5 3 août 2018 à 16:27:22

          • Partager sur Facebook
          • Partager sur Twitter
          Le plus souvent la cause du bug est situé devant l'écran ;)
            3 août 2018 à 16:52:01

            QuentinVidal5 a écrit:

            [pk] dfinie bien la primary key, on a le droit d'avoir 2 primary key

            Non, mais on a le droit (et ici le devoir :p ) d'avoir une clé primaire définie sur deux colonnes (clé primaire composite). Cela permet de ne pas avoir deux fois le même produit sur la même commande.

            QuentinVidal5 a écrit:

            pour le statut de la commande, le principe c'est bien de la stocker en valier ou pas (payé ou pas) et dans le cas non valider, de la reproposer à l'utilisateur lorsqu'il se reconnecte? Ceci étant "un cookie avancé"

            Je n'étais pas parti sur le principe d'utiliser un cookie pour le panier, car je m'imaginais que le client était forcément connecté ...

            En revanche si l'on peut constituer son panier sans être connecté, alors il faudra en effet passer par un stockage local (cookie ou autre local storage) pour mémoriser ses choix avant de pouvoir créer la commande ...

            QuentinVidal5 a écrit:

            Je vais partir sur 2 table séparé

            J'espère que 2 tables séparées signifie prendre le modèle que je t'ai suggéré/imposé :p

            -
            Edité par Benzouye 3 août 2018 à 16:53:18

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              6 août 2018 à 8:18:02

              EDIT: Un nouveau probleme pour la creation dna l'edit à la fin du message
              Alors oui bien sur je vais partir sur l'idée suggérer/imposé:p
              Je n'utilise pas de cookie pour la panier, il faut en effet être connecté pour commencer son panier( quoique je crois pas je vais allez vérifier, je suis en train de confondre variable de session et utilisateur connecté)
              Mais pour le cookier je pensais plus au cas ou l'utilisateur commence une commande, là il est interrompu, disons 1h, il est totalement inactif, si je le deconnecte au bout de 30min d'inactivité, son panier sera totalement perdu. Donc je peux à ce moment là, stocker la commande avec un statut en_cours, et faire en sorte de lui proposer de la continuer lorsqu'il se reconnecte.
              Si j'ai bien compris, dans le cas ou je la stocke dans un cookie, la commande est conservé sur son appareil seulement, et non relié à son compte, alors que le stockage en bdd me permet de la relier à son compte
              Plus généralement je n'ai pas encore utilisé les cookies sur mon site et je sais pas si je vais le faire, en tout cas pas tant que ça ne me parrait pas indispensable au bon fonctionnement.
              Encore merci


              EDIT:

              J'ai maitenant un probleme sur la création des foreign key, alors sur les forums ils disent d'aller dans vue relationnelle et de les relier mais ça ne marche pas chez moi.

              1. Je n'ai pas de vue relationnelle quand je suis sur ma table, je dois allez dans la base.

              2. Si en anlglais vue relationelle c'est 'propose table structure' alors je n'ai rien en cliquant dessus depuis ma table

              3. Dans la base, lorsque je clique sur designer, dan sle menu il y a un onlget 'create relation'. 9a à l'air de se jouer ici(fin c'est ici), je selectionne d'abord ma référence_key, et ensuite la foreign key, mais j'ai alors une erreur ' Relational features are disabled'

              Comment les activer?

              Et a y etre je passe en français ;)

              EDIT: Je suis avec MyISAM comme moteur de stockage, il semblerait que ça vienne de la, et qu'il me faudrait passer mes tables en InnoDB

              Je dois recréer toutes mes tables ou il y a un moyen de changer le moteur de stockage?

              Re:edit je crois que j'ai réussi (j'ai trouvé un post qui pourrait parler à certains d'entre vous.. :-°) https://openclassrooms.com/forum/sujet/passer-moteur-de-stockage-mysql-vers-innodb pour la solution

              Par contre je savais pas quoi mettre dans le on delete/update je les ai laissé vide (ya un truc de particulier à mettre ?)

              -
              Edité par QuentinVidal5 6 août 2018 à 9:24:08

              • Partager sur Facebook
              • Partager sur Twitter
              Le plus souvent la cause du bug est situé devant l'écran ;)

              Enregister une Commande dans une bdd

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown