IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Dois-je enregistrer mes données dans 2 tables ? [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Cuisinier
    Inscrit en
    Août 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Cuisinier

    Informations forums :
    Inscription : Août 2017
    Messages : 51
    Par défaut Dois-je enregistrer mes données dans 2 tables ?
    Bonjour,

    J'ai suivi avec patience, visionnage et re-visionnage ... la formation "La POO en PHP" sur le site Grafikart.

    Nom : dbcuisine.png
Affichages : 400
Taille : 29,4 Ko

    Je travaille sur cette page :

    Nom : Capture du 2017-09-25 13-07-41.png
Affichages : 302
Taille : 24,5 Ko

    Avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <?php
    $recetteTable = App::getInstance()->getTable('Recette');
    if (!empty($_POST)) {
      $result = $recetteTable->create([
        'categories_id' => $_POST['categories_id'],
        'recettes' => $_POST['recettes'],
        'nbpersonnes' => $_POST['nbpersonnes'],
        'marge' => $_POST['marge'],
        'observations' => $_POST['observations']
      ]);
      if ($result) {
        header('Location: index.php?p=recette.add&id=' . App::getInstance()->getDb()->lastInsertId());
      }
    }
    $categories = App::getInstance()->getTable('Categorie')->extract('id', 'categories');
    $familles = App::getInstance()->getTable('Famille')->extract('id', 'familles');
    $ingredients = App::getInstance()->getTable('Ingredient')->extract('id', 'ingredients');
    $form = new \Core\HTML\BootstrapForm($_POST);
    ?>
    J'arrive à enregistrer les données saisies dans la partie gauche du formulaire.

    Je bloque pour enregistrer également les données saisies dans la partie droite.

    A la création de mon application, pour exemple, j'avais entrée dans ma base de données 2 recettes dans ma table composition_recettes (1 ligne pour 1 ingrédient).

    J'imagine qu'il faudrait que je fasse de même dans mon code afin de pouvoir enregistrer 'ingredients' et 'quantites', mais comme j'indique déjà 'Recette', je ne sais pas comment faire !

    Donc si vous avez des idées, je vous remercie !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu te mélanges entre la présentation de ton formulaire et la structure de la base de données.
    Les deux n'ont rien à voir.

    La structure de la base de données doit répondre au besoin de relation des données entre elles : par exemple "une recette va contenir plusieurs ingrédients" => il faut une table recette, une table ingrédients et une table de liaison pour indiquer les ingrédients des recettes.
    Donc savoir si tu dois enregistrer tes données dans deux tables, cela dépend de tes données, pas du fait que tu aies deux formulaires.
    Cette étape devrait même être faite en premier lieu, sans aucune considération pour l'interface et le langage de programmation qui exploiteront les données ensuite.

    Mais ta question ne serait-elle pas plutôt sur ton interface que sur le nombre de tables ?
    Actuellement tu as en même temps la création de la recette et l'ajout des ingrédients.
    Il serait plus simple de d'abord créer la recette puis lui ajouter des ingrédients.
    Si tu veux les deux en même temps, fais un seul formulaire evidemment.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Homme Profil pro
    Cuisinier
    Inscrit en
    Août 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Cuisinier

    Informations forums :
    Inscription : Août 2017
    Messages : 51
    Par défaut
    Citation Envoyé par sabotage Voir le message
    La structure de la base de données doit répondre au besoin de relation des données entre elles : par exemple "une recette va contenir plusieurs ingrédients" => il faut une table recette, une table ingrédients et une table de liaison pour indiquer les ingrédients des recettes.
    C'est ce que mon modèle présente !

    Citation Envoyé par sabotage Voir le message
    Actuellement tu as en même temps la création de la recette et l'ajout des ingrédients.
    Tout à fait, je pensais que ça allait ensemble dans ma réflexion !

    Cela m'embête un peu de faire 1 manipulation pour créer la recette et 1 manipulation pour ajouter les ingrédients de la recette ensuite.

    Dans mon esprit de cuisinier, je me dis que j'ai besoin d'une recette qui est composée de tels et tels ingrédients. Donc tout faire en même temps me paraissait "normal".

    Mais j'ai l'impression que tout faire en 1 seul formulaire, je vais me heurter au même problème.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Et quel est ce problème exactement en fait ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1/ OK pour la STRUCTURE de tes tables en Bdd.
    Ca, c'est bon.

    2/ Quant à la question... quelle est la question, au fait ?

    ...Je bloque pour enregistrer également les données saisies dans la partie droite...
    As-tu bien UN SEUL formulaire ?
    C'est-à-dire une seule balise <form> </form> ?

    Auquel cas, pas de problème pour TOUT récupérer, recette et ingrédients.

    Ensuite, pour une création de recette, il suffit *:
    • d'enregistrer (INSERT) la recette en BdD dans la table "recettes"
    • récupérer l'id_recette créé (last_insert_id)
    • d'enregistrer (INSERT) chaque id_ingrédient et quantité dans la table de liaison, avec comme id_recette celui récupéré ci-dessus

    Pour une modification de recette :
    • on a déjà l'id_recette
    • on UPDATE la table "recettes"
    • on supprime (DELETE) les anciennes liaisons enregistrés dans la table de liaison (cette étape évite de se casser la tête à savoir si un ingrédient était déjà présent ou pas... : on efface et on recommence, c'est plus simple)
    • on en recrée (INSERT) pour les nouveaux ingrédients

    Donc : pas de difficulté majeure à l'horizon...

    * d'après ce que je comprends du bout de code que tu donnes (sans le moindre commentaire...), j'ai l'impression que c'est déjà ce que tu fais (ou essaie de faire) ...
    Il manque juste la 2ème partie.

    Mais comme tu ne montres pas non plus le code du formulaire, ni le mode de fonctionnement de l'ajout d'ingrédients (je vois un bouton "+"...)
    Dernière modification par Invité ; 28/09/2017 à 10h07.

  6. #6
    Membre averti
    Homme Profil pro
    Cuisinier
    Inscrit en
    Août 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Cuisinier

    Informations forums :
    Inscription : Août 2017
    Messages : 51
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    * d'après ce que je comprends du bout de code que tu donnes (sans le moindre commentaire...), j'ai l'impression que c'est déjà ce que tu fais (ou essaie de faire) ...
    Il manque juste la 2ème partie.
    Voilà ... pour moi c'est exactement ça !

    Pour les explications, voici ma page complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?php
    $recetteTable = App::getInstance()->getTable('Recette');    <-- je me connecte à la table Recette
    if (!empty($_POST)) {
      $result = $recetteTable->create([
        'categories_id' => $_POST['categories_id'],
        'recettes' => $_POST['recettes'],
        'nbpersonnes' => $_POST['nbpersonnes'],
        'marge' => $_POST['marge'],
        'observations' => $_POST['observations']
      ]);
      if ($result) {
        header('Location: index.php?p=recette.add&id=' . App::getInstance()->getDb()->lastInsertId());   <-- je récupère l'id de la recette
      }
    }
    $categories = App::getInstance()->getTable('Categorie')->extract('id', 'categories');   <-- je me connecte à la table Catégories et je récupère le tout pour le SELECT
    $ingredients = App::getInstance()->getTable('Ingredient')->extract('id', 'ingredients');    <-- je me connecte à la table Ingrégients et je récupère le tout pour le SELECT
    $form = new \Core\HTML\BootstrapForm($_POST);   <-- je fais appel à ma class pour mettre en forme le formulaire
    ?>
     
      <!-- Content Wrapper. Contains page content -->
      <div class="content-wrapper">
        <!-- Content Header (Page header) -->
        <section class="content-header">
          <h1>
            Recettes
            <small>Control Panel</small>
          </h1>
          <ol class="breadcrumb">
            <li><a href="index.php?p=home"><i class="fa fa-dashboard"></i> Home</a></li>
            <li class="active"><a href="index.php?p=ingredients">Recettes</a></li>
            <li class="active">Ajouter</li>
          </ol>
        </section>
     
        <!-- Main content -->
        <section class="content">
     
     
        <div class="row">  
          <div class="col-md-12">
     
              <div class="box box-danger">
                <div class="box-header">
                  <h3 class="box-title">Création de la recette</h3>
                </div>
                <div class="box-body">
     
                <form method="POST">
                  <div class="col-md-6">
     
                    <!-- Catégories -->
                    <?= $form->select('categories_id', 'Catégorie', $categories); ?>
                    <!-- /.form group -->
     
                    <!-- Nom de la recette -->
                    <?= $form->input('recettes', 'Choisir le nom de la recette'); ?>
                    <!-- /.form group -->
     
                    <!-- Nombre de personnes -->
                    <?= $form->input('nbpersonnes', 'Nombre de personnes'); ?>
                    <!-- /.form group -->
     
                    <!-- Marge -->
                    <?= $form->input('marge', 'Marge'); ?>
                    <!-- /.form group -->
     
                    <!-- Prix -->
                    <?= $form->input('observations', 'Observations', ['type'=>'textarea']); ?>
                    <!-- /.form group -->
     
                    <button id="add" class="btn btn-block submit">Valider</button>
                  </div>
     
                  <div class="col-md-6">
     
                    <div class="col-md-7">
                      <!-- Ingrédient -->
                      <?= $form->select('ingredients', 'Ingrédients', $ingredients); ?>
                      <!-- /.form group -->
                    </div>
     
                    <div class="col-md-3">
                      <!-- Quantités -->
                      <?= $form->input('quantites', 'Quantité'); ?>
                      <!-- /.form group -->
                    </div>
     
                    <div class="col-md-2">
                      <label>Action</label>
                      <button class="btn btn-success" type="button"  onclick="ingredient_fields();"> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> </button>
                    </div>
     
                  </div>
                </form>
                <!-- /.form -->
     
                </div>
                <!-- /.box-body -->
     
              </div>
              <!-- /.box -->
     
          </div>
     
        </div>
     
        </section>
        <!-- /.content -->
     
      </div>
      <!-- /.content-wrapper -->
    Citation Envoyé par jreaux62 Voir le message
    Mais comme tu ne montres pas non plus le code du formulaire, ni le mode de fonctionnement de l'ajout d'ingrédients (je vois un bouton "+"...)
    Pour le bouton '+', c'est ce que j'aimerais faire. Lorsque je clique dessus, j'aimerais que cela ajoute une ligne pour pouvoir enregistrer un 2ème ingrédient et sa quantité ... et ainsi de suite !
    Il n'est pas en fonction pour le moment, car je voulais voir si l'enregistrement d'un seul champ 'ingredient' et 'quantite' fonctionnait déjà avant d'aller plus loin.
    Et je ne savais pas encore de quelle manière j'allais présenter le choix des ingrédients !!!

    Citation Envoyé par jreaux62 Voir le message
    d'enregistrer (INSERT) chaque id_ingrédient et quantité dans la table de liaison, avec comme id_recette celui récupéré ci-dessus
    C'est cette partie que je n'arrive pas à intégrer dans mon code, sachant qu'en effet cela fait appel à la table de liaison 'composition_recette'.

    A moins de rajouter un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App::getInstance()->getTable('CompositionRecette');
    quelque part pour remplir les champs de la base 'recettes_id', 'ingredients_id' et 'quantites'.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Enregistrement da données dans une table Mysql
    Par xunil2003 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/03/2010, 17h27
  2. Réponses: 0
    Dernier message: 07/11/2009, 10h21
  3. utiliser formulaire pour enregistrer des données dans différentes tables
    Par silue fignigue siaka dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 11/04/2009, 13h53
  4. Réponses: 10
    Dernier message: 06/02/2008, 09h35
  5. Enregistrer des données dans une table à partir du code
    Par Ragnarok85 dans le forum Access
    Réponses: 4
    Dernier message: 24/01/2007, 13h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo