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

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

La clef dans la table possede est la conbcaténation des clefs des tables mises en relation.

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,unsigned,primary MEDIUMINT,unsigned, 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 entreprise
  • 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 applique la requête avec mysqli_query, le résultat n'est pas affecté à une variable car on attend pas de réponse en retour
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('','$nom')";
//On applique la requête
mysqli_query($link,$req);
//On ferme la connexion en passant l'identifiant de connexion à mysqli_close()
mysqli_close($link);
?>
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 prodesseur avec la commande INSERT
  • on applique la requête avec mysqli_query
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 mysqli_insert_id(), cette méthode renvoie en fait la dernière clé généée dans la table
  • 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 mysqli_query
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('','$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;
?>