8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je suis débutant et me suis mis en tête de développer une petite application-Web
perso pour gérer les repas de la famille pour la semaine.
J'en suis au stade où la page recette.php affiche au travers d'un formulaire composé
de 20 select des ingrédients en provenance d'une table aliment : sa fonctionne !

Le problème que je rencontre est l'enregistrement dudit formulaire et du contenu des
éventuels select renseignés : je parviens bien à afficher (echo) chaque aliment mais pour ce qui
est de la syntaxe à utiliser pour les stocker dans un enregistrement recette, je sèche.

Je préfère ne pas utiliser un serialize car je veux pouvoir ensuite (et de façon simple)
bloquer la suppression d'un aliment qui serait employé dans une recette.

Voici pour l'instant mon code qui me permet de tester que le formulaire est bien récupéré :



<?php
$recette_nom = $_POST['recette_nom'];
echo $recette_nom . '<br />';
$recette_temps = $_POST['recette_temps'];
echo $recette_temps . '<br />';

for ($i=1; $i <=20; $i++) {
	$ingredient[$i] = $_POST['ingredient' . $i];
	if ($ingredient[$i]!="null") {		
		$quantite[$i]=$_POST['quantite' . $i];
		$unite[$i] = $_POST['unite' . $i];	
		echo $ingredient[$i] . '&nbsp' . $quantite[$i] . '&nbsp' . $unite[$i] . '<br />';
	}
}

$realisation = $_POST['realisation'];
echo $realisation . '<br />';


?>

Modifié par etienne69 (22 Sep 2014 - 14:22)
Bonjour,

Tout d'abord pourquoi ne pas avoir adapté votre formulaire aux 20 ingrédients ? Vous auriez pu créer un simple select multiple plutot que 20 select qui ne seront pas forcément renseignés...

Pour votre problème il suffit de créer une table d'association entre recette et aliments qui contiendra vos ID aliment et ID recette. Il faudra donc faire un insert pour vos 20 select s'ils sont saisis correctement ou faire une boucle dans le cas d'un select multiple.

Bonne continuation.
Merci mini-truc pour la réponse rapide et les suggestions...

Je n'avais pas pensé utiliser un select multiple effectivement. Mais je pense que dans
mon appli, ce n'est pas possible. En effet, l'utilisateur doit renseigner dans le formulaire
un ingrédient qui à une quantité et qui a une unité :
Exemple :
Filet de truite / 100 / gr mais aussi, il est possible d'avoir :
Filet de truite / 1 / pièce


Les données dont les select ne seront pas renseignés seront ignorées.

Ma table "recette" est composée effectivement des champs suivants :
recette_id, recette_nom, recette_temps

(et ma table ingredients :
id, recette_id, aliment_id, quantite, unite)

En fait, je recherche la syntaxe pour faire une boucle qui enregistre mes 20 selects (s'ils
sont remplis) + les 20 quantités + 20 unités...
Tout va dépendre des noms de tes select (et input je suppose pour la saisie des autres infos)

Si tu construit tes select avec des name tel que "select_ing_1" "select_ing_2' etc ; tu peux faire une boucle for de 1 à 20 :

for($i=1; $i<=20; $i++){
   if(isset($_POST['select_ing_'.$i]) && !empty($_POST['select_ing_'.$i]) {[ et autres tests de validité ]} ){
      $ing = $_POST['select_ing_'.$i];
      //insertion sql
   }
}
Merci...

La ligne qui m’intéresse c'est justement celle que tu as mis en commentaire :
//insertion sql
Mais je crois avoir compris mon erreur dans l'idée même que je me faisais de
l'enregistrement des éléments de la recette !

En fait, je pensais faire un enregistrement pour les éventuels 20 aliments mais c'est impossible
de savoir à l'avance si une recette va contenir 1, 5 ou 18 aliments !
La requête d'insertion que je dois faire est obligatoirement fermée à chaque fin de boucle...
Je dois donc générer des enregistrements courts de ce type

id=1
recette_id= 5
aliment_id=287
quantite=100
unite=gr

id=2
recette_id= 5
aliment_id=29
quantite=3
unite=piece

Etc...



J'avais par ailleurs utilisé :

if ($ingredient[$i]!="null") {	


Je pense que ton code est plus pro(pre) :

if(isset($_POST['select_ing_'.$i]) && !empty($_POST['select_ing_'.$i])

Modifié par etienne69 (22 Sep 2014 - 17:42)
Bonjour,

Oui il est un peu plus propre mais il manque encore des petites choses (dans le if) :
- tester si tu obtiens bien un entier (étant donné que tu attends un ID produit)
- tester la même chose sur les autres valeurs (quantité, unité)
- et surtout tester si l'aliment existe bien.

L'intérêt c'est de protéger un maximum ton code sur des intrusions externes ; et de limiter le champs d'action à ce que tu attends réellement Smiley smile .

Voila et bonne continuation !