Informatique


Ajouter un enregistrement (1-n)(1-n)

Le cas pratique

Dans phpMyAdmin créer la BD "personnel".

  • Créer la table "professeur" regroupant les informations suivantes: nom, prénom, date de naissance et code postal de résidence
  • Créer la table "diplome" regroupant les intitulés des diplômes

On précise qu'un professeur peut avoir plusieurs diplômes et au moins 1, un diplôme peut concerner 0 ou plusieurs professeurs.

  • Réaliser les MCD, MLD, MPD
  • Créer les tables "professeur" et "diplome".
  • Etablir les formulaires permettant d'enrgistrer des professeurs et des diplômes.


Les MCD, MLD et MPD

La relation entre les 2 entités du MCD est de type (1-1)(1-n), dans ce cas, pour le MLD et le MPD, la relation disparaît et la clé du côté (1-n) est dupliquée du côté (1-1).

Le MCD de l'application

Le MLD de l'application

Pour passer du MCD au MCD l'association persiste, elle est matérialisée par une table dont la clé est la concaténation des clefs mises en relation.

professeur: id_pro, nom_pro, preno_pro, daten_pro
diplome: id_dip, nom_dip
possede: id_pro, id_dip

Le MPD de l'application

Voici l'aperçu de la structure des 3 tables.

Structure de la table professeur

id_pro nom_pro preno_pro daten_pro
TINY,unsigned,
primary,AI
VARCHAR(60) VARCHAR(30) DATE

Structure de la table diplome

id_dip nom_dip
MEDIUMINT,unsigned,primary,AI VARCHAR(100)

Structure de la table possede

id_pro id_dip
TINY,primary MEDIUMINT, primary


Création et exécution de la requête sql

Dans quel ordre allons-nous procéder?

2 fichiers sont nécessaires, un pour la table diplome et un pour les tables professeur et possede.

On va d'abord remplir la table diplome, ensuite on remplira les tables professeur et possede.

Dans le formulaire permettant de remplir les tables professeur et possede on placera une liste déroulante permettant de choisir les diplômes des professeurs, cette liste sera remplie dynamiquement à partir de la table diplome.

Remplir la table diplome
Nous allons éviter le test de première ouverture pour ne pas encombrer le code.
  • on récupère le tableau $_POST
  • connexion à MySQL et à la base de données personnel
  • on établit la requête d'insertion avec la commande INSERT, cette requête est une simple chaîne de caractères affectée à une variable
  • on exécute la requête avec exec(), le résultat est affecté à une variable, celle-ci sera affectée avec true ou false.
Exemple
<h2>Enregistrer un diplôme</h2>

<form action="indip.php" method="post">
	Intitulé  : <input type="text" name="nom"><br>
	<input type="submit" value="Enregistrer">
</form>
<?php
//Récupération du formulaire
$nom=$_POST['nom'];
//Connexion à MySQL et à la BD
$base="1-n-1-n";
include("connexion.php");
//On établt la requête
$req="insert into diplome(id_dip,nom_dip)values(NULL,'$nom')";
//On applique la requête
$reqex=$con->exec($req);
//On ferme la connexion en affectant NULL à l'identifiant de connexion
$con=NULL;
?>
Remplir les tables "professeur" et "possede"
Nous allons éviter le test de première ouverture pour ne pas encombrer le code.
  • on utilise la table diplome pour remplir dynamiquement une liste déroulante permettant de choisir le ou les diplômes du professeur que l'on encode
  • on récupère le tableau $_POST
  • connexion à MySQL et à la base de données personnel
  • on établit la requête d'insertion du professeur avec la commande INSERT
  • on exécute la requête avec exec(), le résultat est affecté à une variable, celle-ci sera affectée avec true ou false.
Pour remplir la table possede il faut récupérer la clé du professeur enregistré et les clés de ses diplômes.
  • on récupère la clé du professeur avec la méthode lastInsertId(), cette méthode renvoie la dernière clé générée à partir de l'identifiant de connexion
  • on fait une boucle for sur le tableau contenant les diplômes du dernier professeur inséré
  • à l'intérieur de la boucle on génère une requête insert vers la table possede et on applique la requête avec exec()
Exemple
<h2>Enregistrer un professeur et une ligne dans la table possede</h2>

<form action="inprof.php" method="post">
Nom  : <input type="text" name="nom"><br>
Prénom : <input type="text" name="preno"><br>
Date de naissance : <input type="date" name="daten"><br>
<?php
 $base="1-n-1-n";
 include("connexion.php");
 $req="select * from diplome";
 $reqex=$con->query($req);
?>
<select name="diplo[]" multiple>	
<?php 
 while($ligne=$reqex->fetch(PDO::FETCH_ASSOC))	{
  echo("<option value=$ligne[id_dip]>$ligne[nom_dip]</option>");
 }
?>
</select>	
	<input type="submit" value="Enregistrer">
</form>

<?php 
 $nom=$_POST['nom'];
 $preno=$_POST['preno'];
 $daten=$_POST['daten'];
 $diplo=$_POST['diplo'];
 
 $req="insert into professeur(id_pro,nom_pro,preno_pro,daten_pro)values(NULL,'$nom','$preno','$daten')";
 $reqex=$con->exec($req);
 $derni=$con->lastInsertId();
 
 for($cpt=0;$cpt<count($diplo);$cpt++)    {

    //on établit la requête d'insertion dans la table possede

    $req="insert into possede (id_pro,id_dip) values('$derni','$diplo[$cpt]')";

    $reqex=$con->exec($req);

}
$con=NULL;
?>