diff --git a/Requete.html b/Requete.html
index bf7bfb1de102dcf2141c4436ea2cba7c88daa5bf..a1cc8888e8e8b2817772072fabf45f0e7b53f8dd 100644
--- a/Requete.html
+++ b/Requete.html
@@ -3,20 +3,33 @@
     <head>
         <title>Requete</title>
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-        <?php include("install.php"); ?>
         <script type="text/javascript" src="suggestion.js"> </script>
     </head>
 
     <body>
         <form method="post" id="form">
-        <fieldset>
-            Entrez votre recherche : 
+        <fieldset id="fieldset">
+            <!--
+            Entrez votre recherche :
             <input list='listeNoms' type="text" id="requete" onkeyup="afficherSuggestionsRecettes()"/>
+            -->
+            Sélectionner : 
+
+            <select name='categorie' id='categorie' onclick="optionsCategorie()" >
+                <option value='Aliment'></option>
+                <option value='Aliment'>Aliment</option>
+            </select>
+            
+            <button type="button" onclick="remettreAZero()">Remise à zéro</button>
 
             <br/>
         </fieldset>
         </form>
+        <div id="infos">
+
+        </div>
+
+        <div id="recettes"></div>
 
-        <div id="infos"></div>
     </body>
 </html>
\ No newline at end of file
diff --git a/Service.php b/Service.php
index 590253b39dd511cde25086632e19cf35c525be8d..ecfd3f47439c2f67a2e3462543c561c030db6c99 100644
--- a/Service.php
+++ b/Service.php
@@ -4,7 +4,7 @@
  * Se charge d'effectuer les requêtes et retourne un json
  */
 function queryDBB(string $str){
-	$mysqli= new mysqli('127.0.0.1', 'root', '', 'Cocktails') or die("Erreur : tables inaccessibles");
+	$mysqli= new mysqli('127.0.0.1', 'root', '', 'Boissons') or die("Erreur : tables inaccessibles");
 	$res = $mysqli->query($str);
 
 	$recettes = $res->fetch_all(MYSQLI_ASSOC);
@@ -16,9 +16,52 @@ function chercheTitres (string $nom){
     $requete = "SELECT titre FROM recettes WHERE titre LIKE '{$nom}%'";
 	echo queryDBB($requete);
 }
+
+/**
+ * Récupère les sous catégories
+ */
+function getCategorie (string $req){
+	$requete = "SELECT sous_nom FROM hierarchie WHERE super_nom = '{$req}'";
+	echo queryDBB($requete);
+}
+
+/**
+ * Récupères les recettes 
+ */
+function grabRecettes (string $req){
+	$requete = "SELECT DISTINCT r.id, r.titre, r.ingredients, r.preparation FROM recettes r, ingredientsderecettes ing WHERE ing.idBoisson = r.id AND ing.nomIngredient LIKE '{$req}'";
+	echo queryDBB($requete);
+}
  
- $in = file_get_contents('php://input');
- $decoded = json_decode($in, true);
- chercheTitres($decoded['requete']);
+$in = file_get_contents('php://input');
+$decoded = json_decode($in, true);
 
+if (isset($decoded['requete'])){
+	chercheTitres($decoded['requete']);
+	unset($decoded['requete']);
+
+}
+if (isset($decoded['hierarchie'])){
+	getCategorie ($decoded['hierarchie']);
+	unset($decoded['hierarchie']);
+
+}
+if (isset($decoded['recettes'])){
+	grabRecettes ($decoded['recettes']);
+	unset($decoded['recettes']);
+}
+if (isset($decoded['images'])){
+	$nom = $decoded['images'];
+	$nom = str_replace(" ", "_", $nom);
+	$nom = str_replace("'", "", $nom);
+
+	$accents = array('è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ñ'=>'n');
+	$nom = strtr( $nom, $accents );
+	foreach (array_filter(glob('Photos/*.jpg'), 'is_file') as $file){
+		if ('Photos/'.$nom.'.jpg' == $file){
+			echo '<img src="data:image/jpg;base64,'.base64_encode(file_get_contents($file)).'">';
+		}
+	}
+	unset($decoded['images']);
+}
 ?>
\ No newline at end of file
diff --git a/install.php b/install.php
index a40b47060c6cfa17c844d2dfbdeb4a0b54276e14..63ae6b00eca74ed7cd28f21d4b5a86e672e239f4 100644
--- a/install.php
+++ b/install.php
@@ -22,19 +22,8 @@ function loadDB(){
 	}
 
 	$cmpt = 0;
-	$str;
+	$str ="";
 
-	foreach($tabRecettes as $colonne){
-		$titre = mysqli_real_escape_string($mysqli, $colonne['titre']);
-		$ingred = mysqli_real_escape_string($mysqli, $colonne['ingredients']);
-		$prep = mysqli_real_escape_string($mysqli, $colonne['preparation']);
-		if (count($tabRecettes)-1 === $cmpt){
-			$str .= "INSERT INTO recettes VALUES (".$cmpt.", '".$titre."', '".$ingred."', '".$prep."')";
-		}else{
-			$str .= "INSERT INTO recettes VALUES (".$cmpt.", '".$titre."', '".$ingred."', '".$prep."');  ";
-
-		}
-	}
 
 	// Parcours de tous les aliments pour les ajouter à la base de donnée
 	while (current($tabHierarchie)){
@@ -51,15 +40,35 @@ function loadDB(){
 		while ($alim = current($souscat)){
 			$prep = mysqli_real_escape_string($mysqli, key($tabHierarchie));
 			$fils = mysqli_real_escape_string($mysqli, $alim);
-
 			$str .= "INSERT INTO hierarchie(super_nom, sous_nom) VALUES ('".$prep."', '".$fils."');  ";
-
-
 			next($souscat);
 		}
 		next($tabHierarchie);
 	}
 
+	$valeur = 1;
+
+	// Parcours des recettes et génération des éléments correspondants dans leurs tables
+	foreach($tabRecettes as $colonne){
+		$titre = mysqli_real_escape_string($mysqli, $colonne['titre']);
+		$ingred = mysqli_real_escape_string($mysqli, $colonne['ingredients']);
+		$prep = mysqli_real_escape_string($mysqli, $colonne['preparation']);
+		if (count($tabRecettes)-1 === $cmpt){
+			$str .= "INSERT INTO recettes VALUES (".$cmpt.", '".$titre."', '".$ingred."', '".$prep."')";
+		}else{
+			$str .= "INSERT INTO recettes VALUES (".$cmpt.", '".$titre."', '".$ingred."', '".$prep."');  ";
+		}
+
+		while ($ingred = current($colonne['index'])){
+			$prep = mysqli_real_escape_string($mysqli, $ingred);
+			$str .= "INSERT INTO ingredientsderecettes VALUES (".$cmpt.", '".$valeur."', '".$prep."');  ";
+			next($colonne['index']);
+		}
+		$valeur++;
+	}
+
+
+
 
 	$base="Boissons";
 	$Sql="
@@ -95,6 +104,14 @@ function loadDB(){
 				FOREIGN KEY (super_nom) REFERENCES aliments(alim_nom) ON DELETE CASCADE, 
 				FOREIGN KEY (sous_nom) REFERENCES aliments(alim_nom) ON DELETE CASCADE
 			);  
+
+			CREATE TABLE IF NOT EXISTS ingredientsderecettes (
+				id INT AUTO_INCREMENT PRIMARY KEY, 
+				idBoisson INT NOT NULL,
+				nomIngredient VARCHAR(255) NOT NULL,
+				FOREIGN KEY (idBoisson) REFERENCES recettes(id) ON DELETE CASCADE, 
+				FOREIGN KEY (nomIngredient) REFERENCES aliments(alim_nom) ON DELETE CASCADE
+			);  
 			".$str;
 
 
diff --git a/suggestion.js b/suggestion.js
index 85a672faacfac445560243ace0f83c18dfa4020c..3520c0520bda5253c26645b4f41a9a9d42c94a94 100644
--- a/suggestion.js
+++ b/suggestion.js
@@ -20,6 +20,85 @@ function genereSuggestions(res){
     textbox.appendChild(list);
 }
 
+// Affiche les recettes
+function afficheRecettes(recette){
+    // Récupère l'élément qui va afficher les recettes
+    let div = document.getElementById("recettes");
+
+    // parcours de toutes les recettes contenu dans l'objet
+    for (var i = 0; i<recette.length; i++){
+        // Création des éléments titre / paragraphe / liste
+        let image = document.createElement('img');
+        let titre = document.createElement('h2');
+        let paragraph = document.createElement('p');
+        var liste = document.createElement('ul');
+        liste.innerHTML += "Ingrédients :";
+
+        // Récupération du contenu    
+        titre.textContent = recette[i].titre;
+        paragraph.textContent = recette[i].preparation;
+        let ingredients = recette[i].ingredients.split("|");
+        for (var j = 0; j<ingredients.length; j++){
+            liste.innerHTML += "<li>"+ingredients[j]+"</li>";
+        }
+
+        const search = recette[i].titre;
+        const input = {
+            images : search
+        };
+
+        // Ajout à la div de recettes
+        div.append(titre);
+        div.append(image);
+        div.append(paragraph);
+        div.append(liste);
+    }
+    
+}
+
+/**
+ * Génère options à partir des résultats de la table hiérarchie
+ * @param {} res 
+ */
+function genereOptions(res){
+    // Ajoute les options
+    var select = document.getElementById('categorie');
+    var recettes = document.getElementById('recettes');
+    recettes.innerHTML = "";
+    select.innerHTML = "";
+
+    //console.log(res);
+    for (const objet of res){
+        var opt = document.createElement("option");
+        opt.textContent = objet.sous_nom;
+        opt.value = objet.sous_nom;
+        select.appendChild(opt);
+
+        // Effectue la requête
+        const input = {
+            recettes: objet.sous_nom
+        };
+
+        const xhr = new XMLHttpRequest();
+        xhr.open("POST", "Service.php", true);
+        xhr.setRequestHeader("Content-Type", "application/json ; charset=UTF-8");
+
+        // Vérification des résultats
+        xhr.onreadystatechange = function(){
+            if (xhr.readyState == 4 && xhr.status == 200){
+                // Si le retour n'est pas vide, on affiche les titres
+                if (this.response != null){
+                    const recipes = JSON.parse(xhr.response);
+                    if (recipes.length > 0){ // On ignore au moins
+                        afficheRecettes(recipes);
+                    }
+                }
+            }
+        } 
+        xhr.send(JSON.stringify(input));
+    }
+}
+
 
 /**
  * Affiche une liste de cocktails
@@ -54,8 +133,66 @@ function genereSuggestions(res){
                 genereSuggestions(resultat);
             }
         }
-    } 
+    }
+    xhr.send(JSON.stringify(input));
+}
+
+
+/**
+ * Affiche les options de catégories
+ */
+ function optionsCategorie(){
+    // Empeche le rechargement de la page quand on valide 
+    document.getElementById("form").addEventListener("submit", function (e) {
+        e.preventDefault();
+        return false;
+    });
+
+    // Récupère la position à laquelle on veut afficher des informations
+
+    var zone = document.getElementById("categorie");
+    var infos = document.getElementById("infos");
+    
+    // Création d'un objet contenant la requêtes
+    var val = zone.value;
+    infos.innerHTML += " > " + val;
+    var input = {
+        hierarchie: val
+    };
+
+    // Demande au serveur php (donc à la db) les noms de
+    const xhr = new XMLHttpRequest();
+    xhr.open("POST", "Service.php", true);
+    xhr.setRequestHeader("Content-Type", "application/json ; charset=UTF-8");
 
+    // Vérification des résultats
+    xhr.onreadystatechange = function(){
+        if (xhr.readyState == 4 && xhr.status == 200){
+            // Si le retour n'est pas vide, on affiche les titres
+            if (this.response != null){
+                var resultat = JSON.parse(xhr.response);
+                genereOptions(resultat);
+            }
+        }
+    } 
     xhr.send(JSON.stringify(input));
+}
+
+// Permet de recharger le contenu de la page sans recharger la page
+function remettreAZero(){
+    document.getElementById("recettes").innerHTML = "";
+    document.getElementById("infos").innerHTML = "";
+    var select = document.getElementById("categorie");
+    console.log(select.value);
+    select.innerHTML = "";
+    var opt, opt2;
+    opt = document.createElement("option");
+    opt2 = document.createElement("option");
 
+    opt.textContent = '';
+    opt.value = 'Aliment';
+    opt2.textContent = 'Aliment';
+    opt2.value = 'Aliment';
+    select.appendChild(opt);
+    select.appendChild(opt2);
 }