PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 02-03-2011 17:14:41

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Organiser plusieurs tables

Bonjour,
Je suis nouveau ici, aussi j'espère ne pas faire de boulettes pour mon premier post. Si j'en fais, je promets que je m'améliorerai très vite. C'est le site Alsacreations qui suggère de venir ici pour poser des questions de débutants, et justement j'en ai une belle...
Je travaille donc sur un énième site de cuisine. Le but n'est pas de révolutionner le genre (encore que j'ai deux ou trois idées originales) mais d'apprendre. Je suis passé par le HTML, le CSS, le jQuery/JavaScript et donc maintenant le PHP/MySQL. Et j'ai une question con-con.

J'ai un formulaire de proposition de recettes que l'auteur envoie (via une pré-validation par un admin, quand même, histoire de limiter les âneries). L'utilisateur a un tas de champs possibles à remplir. Mon interrogation concerne les champs avancés. Je m'explique : pour plusieurs champs (notamment ingrédients, ou étapes de préparation) il y aura fatalement plein d'éléments entrés : par exemple 5 ingrédients et 10 étapes.
Je me demandais quelle était le meilleur moyen de stockage. Pas seulement le plus simple, mais également le plus efficace.
Vaut-il mieux stocker tous les ingrédients (ou étapes) dans une seule colonne de la table recette, séparés par des signes ";" puis redécouper tout ça lors de l'affichage de la page de la recette ?
Ou bien vaut-il mieux préparer une autre table mise en relation avec l'ID de la recette détaillant champ après champ les ingrédients, une autre pour les étapes, etc ?
Ou y a-t-il une autre voie préférable ?
Merci pour vos conseils.

Hors ligne

#2 02-03-2011 18:17:44

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Organiser plusieurs tables

Saluton,
Pour être très affirmatifs, il nous faudrait savoir si les ingrédients font partie d'une nomenclature éventuellement enrichissable ou si l'auteur de la recette peut en sortir autant qu'il veut de son chapeau.
Quoi qu'il en soit, pour être en troisième forme normale les ingrédients et les étapes qui sont en liaison un-à-plusieurs, voire plusieurs-à-plusieurs, avec la table recettes doivent se trouver dans des tables distinctes où l'identifiant de la recette sera une clé étrangère.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 15-03-2011 15:49:13

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Bonjour, et merci pour cette réponse. J'avance un brin dans toute cette pagaille. Certains points se clarifient, d'autres s'obscurcissent. La dure vie de l'apprenti ^^
Bref : j'ai trois questions en tête.

1- Mon utilisateur a donc un formulaire conséquent à remplir : notamment le nom de la recette, les ingrédients, les ustensiles et les étapes. Je vois plutôt bien le principe de dire dans la table "recettes" que cette recette utilise tel ingrédient de la table "ingredients", pareil pour les ustensiles. Toutefois, quand je traite mon formulaire, j'aimerais lui dire via une requête que :
"tu sélectionnes dans la table ingredients la ligne qui correspond à la valeur ingredient du formulaire ; si tu n'as pas de résultat, tu l'insères dans la table ingredients et tu récupères son ingredient_id (qui servira ensuite dans la table "recettes") ; si tu as un résultat, tu ignores l'insertion mais tu récupères quand même l'ingredient_id de celui que tu as repéré dans la table (pareil, pour l'utiliser ensuite dans la table "recettes")."
J'atteins avec ce code les limites actuelles de mes connaissances en php, surtout pour la dernière partie "on ignore la valeur du formulaire et on récupère à la place l'id déjà présent dans les tables". Si quelqu'un peut m'orienter, j'apprécierais énormément.

2- Fort heureusement, toutes les recettes n'ont pas 15 ingrédients et 10 ustensiles, ou 15 étapes. Quel est le moyen le plus simple de dire au code php de ne pas prendre en compte tous les champs vides ?

3- Ce principe que je viens de décrire, je dois l'appliquer à plein de champs nommés "ingredient1" à "ingredient15" et "ustensile1" à ustensile10". Y a-t-il moyen de boucler simplement plutôt que de faire 25 fois le code des questions 1 et 2 ? Avec un "for ($i=1;$i=10;$i++)" ? Et un "$ingredient.'$i'" ?

Merci !

EDIT (question bonus) : je suis en train de tester des boucles, ça semble prometteur mais je lutte avec les apostrophes et/ou les quotes quand plusieurs doivent s'enchainer.
Quelle est la bonne écriture sur des lignes de ce type où on doit enchainer plusieurs de ces signes à la suite ?

for ($i=1;$i=15;$i++)
    {
        ${'sqlIngredient'.$i} = "SELECT ingredient_nom FROM ingredients_enattente WHERE ingredient_nom = "${'formrecetteingredient'.$i}"";
        }

Dernière modification par Mendoza (15-03-2011 17:28:23)

Hors ligne

#4 15-03-2011 19:02:56

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Organiser plusieurs tables

Salut,
donne le même nom a tes champs wink
ce sera un tableau wink

a++

Hors ligne

#5 15-03-2011 19:36:47

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Organiser plusieurs tables

Saluton,
Ce que veux dire Pierrot c'est nomme tes champs comme ceci name="ingredient[]" ou name="ustensile[]"


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 15-03-2011 19:44:55

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Une toute nouvelle voie à explorer, merci !
Et euh sans vouloir demander la réponse totale, pourriez-vous s'il vous plait me détailler un peu plus la suite logique de cette voie ?

Hors ligne

#7 16-03-2011 11:46:58

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Bonjour !
Comme pour l'instant je n'ai pas trop compris la démarche du tableau que vous suggérez, je me suis permis de continuer un peu sur mes boucles, et j'arrive à un résultat fonctionnel.
Pourriez-vous me dire si c'est une voie intéressante d'un point de vue programmation ? Ou si au contraire c'est du mauvais code qu'il faut éviter ? Si oui, pourquoi ? (ouais je pose plein de questions naïves, désolé ^^')

Voilà le code qui fonctionne :
Préambule : je crée dans un premier temps pour ce test 15 variables $formrecette_ingredient1 à 15 nommés "element1" à "element14" (je laisse le 15 vide pour le test), et j'entre dans ma table "ingredients_enattente" 4 éléments nommés "element1", 2, 4 et 12.)


$i=1;
while($i < 16 && !empty(${'formrecette_ingredient'.$i}))
     {
        ${'sqlIngredient'.$i} = "SELECT ingredient_nom FROM ingredients_enattente WHERE ingredient_nom = '${'formrecette_ingredient'.$i}'";
  ${'reqIngredient'.$i} = mysql_query(${'sqlIngredient'.$i}) or die('Erreur SQL !'.${'sqlIngredient'.$i}.'<br>'.mysql_error());
  ${'resIngredient'.$i} = mysql_fetch_array(${'reqIngredient'.$i});
   
    //s'il y a déjà un enregistrement avec le même nom
    if (${'resIngredient'.$i}!=0)
    {
      ${'formrecette_ingredient'.$i} = ${'resIngredient'.$i}['ingredient_nom'];
      echo 'tirés de la bdd '.${'formrecette_ingredient'.$i}.'<br>';
    }
       
    else
    {
      echo 'tirés du formulaire '.${'formrecette_ingredient'.$i}.'<br>';
    }
     
$i++;
}
 

Hors ligne

#8 16-03-2011 12:16:55

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Organiser plusieurs tables

Pourriez-vous me dire si c'est une voie intéressante d'un point de vue programmation ?
non
Ou si au contraire c'est du mauvais code qu'il faut éviter ?
oui

ce code est quasi illisible wink
a++

Hors ligne

#9 16-03-2011 12:22:37

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Argh, je vais me pendre ^^
Je continue, du coup, avec mes questions naïves : le fait qu'il soit jugé "illisible" est-il gênant en soi ? Dans la mesure où je suis censé être le seul à le lire et que j'arrive avec de l'organisation à l'écrire et donc à le lire ? Est-ce qu'il est inefficace et lent, en plus d'être illisible ?

-----------------
Bon du coup, quelqu'un pourrait m'expliquer un peu mieux la méthode à utiliser avec cette histoire de tableau ?

Hors ligne

#10 16-03-2011 12:52:58

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Organiser plusieurs tables

>>le fait qu'il soit jugé "illisible" est-il gênant en soi ?
réponse : sky hfdksjdhfsjdk hfskj

il n'y a pas que le code qui est illisible wink
l'algo aussi wink

a++

Hors ligne

#11 16-03-2011 13:30:10

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Bon OK. Quand j'aurai fini de verser toutes les larmes de mon corps, j'essaierai la démarche suivante. 'Fin sauf si vous me dites que c'est tout aussi naze.

- dans le code HTML je refais mon formulaire en renommant les champs en "ustensile[]", ingredient[], etape[], etc. Cette partie me va plutôt bien, d'autant que je pourrai réutiliser les fonctions clone() de jQuery, ce sera plus simple que de prévoir le bon nombre de champs. Et je garderai la version avec les 120 champs renommés pour ceux qui ont désactivé JS. J'aurai donc 3 tableaux.

- dans le code PHP de traitement du formulaire, je traite successivement ces trois tableaux avec un foreach ligne par ligne, lui demandant dans le cas des ingredients et des ustensiles de les insérer dans leur table respective si ils n'existent pas encore. Pour les étapes, elles sont juste insérées dans la table recettes, vu que chacune est unique.

Ce serait mieux comme ça ?

Hors ligne

#12 17-03-2011 16:20:59

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Bon je floode mon propre topic...

J'ai quelques questions à propos de la gestion des données du formulaire en tableau :
- comment contrôler la saisie utilisateur ? Les techniques habituelles de html_special_char et autres ne fonctionnent pas.
- comment faire réapparaitre la saisie au bon endroit ? Si mon utilisateur fait une erreur, je veux faire en sorte qu'il n'ait pas tout à retaper, et donc qu'il revienne sur la page formulaire avec les champs qu'il a déjà remplis. Les champs traités "normalement" fonctionnent bien, mais pour les données en array, il indique "Array". Je dois encore faire une erreur de parenthèses, crochets ou autres apostrophes...

Il y en aura d'autres plus tard wink

Hors ligne

#13 17-03-2011 18:01:16

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Organiser plusieurs tables

jquery sais très bien faire ça wink
a++

Hors ligne

#14 17-03-2011 18:07:19

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Excellent, Pierrot, tu parles par énigmes, ça me met la tête en ébullition pour une journée, après ^^..."Qu'a-t-il bien pu vouloir dire ?"

EDIT : bon j'ai un nouveau souci (mais jQuery m'aidera sans doute tongue)

Dans ma requête sql, comment désigner le champ - par exemple - ingredient$i pour y mettre la valeur $i tirée du array ingredient du formulaire ?

Dernière modification par Mendoza (17-03-2011 18:19:51)

Hors ligne

#15 06-04-2011 13:18:23

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Bonjour,
Je viens de me rendre compte d'un bug en faisant des tests. L'insertion via des valeurs de formulaires mises en array se passe bien, merci pour votre aide.
Mais :
Pour chaque ingrédient proposé par l'utilisateur, j'ai un champ checkbox qui demande si l'ingrédient est facultatif ou pas. La valeur est correctement traitée mais mal insérée, et je n'ai pas encore les connaissances nécessaires pour formuler correctement la requête. Il compte bien le nombre de checkboxs checkées et insère le bon nombre dans la table, mais pas au bon endroit. Il les met systématiquement dans les colonnes correspondantes 0 1 2 3 etc au lieu de les mettre là où le numéro de l'ingrédient correspond effectivement. Pour plus de clarté, un exemple : sur un test avec 6 ingrédients nommé ing0 à ing5 dont un sur deux checké, il insère 'F' dans les colonnes "ingredientFacultatif0" 1 et 2, et I (pour Indispensable) dans les colonnes 3 4 5, au lieu de mettre F I F I F I.

Pour l'instant, ma requête ressemble à ça :


//5 Les Ingredients
//On compte le nombre d'ingrédients
  for ($i = 0, $c = count($form_recette_ingredient); $i < $c; $i++)
  {  
          //Si l'ingrédient est facultatif, on met le nom de l'ingrédient et F
    if (isset($form_recette_ingFacul[$i])){
    $insertIng = "UPDATE recettes_enattente SET recette_ingredient$i = '$form_recette_ingredient[$i]', recette_ingFacul$i = 'F' WHERE recette_nom = '$recette_nom' ";
    $inser_exec_ing = mysql_query($insertIng) or die(mysql_error());         
    }
                //Sinon, on met le nom de l'ingrédient et I
    else
    {
      $insertIng = "UPDATE recettes_enattente SET recette_ingredient$i = '$form_recette_ingredient[$i]', recette_ingFacul$i = 'I' WHERE recette_nom = '$recette_nom' ";
    $inser_exec_ing = mysql_query($insertIng) or die(mysql_error());
    }
  }
 

Quelqu'un pourrait-il m'éclairer sur l'origine du problème et le moyen de le résoudre ? Merci.

Hors ligne

#16 06-04-2011 15:55:55

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Organiser plusieurs tables

Ah si la table était en formes normales, que de difficultés et tracas évités !


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#17 06-04-2011 16:08:25

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Ah mais je suis à fond pour éviter tous les tracas. J'ai voulu commencer ce site pour appliquer progressivement la masse d'information que j'ingurgite depuis des mois en programmation, et plus je le développe, plus je m'y noie, surtout sur le php.
Bon pour revenir à cette réponse, cher Maljuna Kris, que vouliez-vous dire exactement ? Comment organiser la table pour que cela fonctionne ?

Hors ligne

#18 06-04-2011 16:25:32

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Organiser plusieurs tables

Je t'avais déjà signalé cela le 03 mars dernier


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#19 12-04-2011 11:19:24

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Organiser plusieurs tables

Bonjour,
J'ai réorganisé mes tables d'une façon plus logique, il faut bien l'admettre, et ça marche plus simplement au niveau des requêtes. Merci, notamment à Maljuna Kris pour ces précieux conseils.
Toutefois, le dernier bug mentionné reste présent :
Prenons un exemple : les 5 premiers ingrédient sont indispensables, le 6ème est facultatif. L'utilisateur coche une petite case pour indiquer le caractère facultatif de l'ingrédient 6. Tous les champs sont nommés ingredient[] et facultatif[]. Quand j'affiche ligne par ligne les valeurs des deux arrays ingredient[] et facultatif[], les ingrédients sont bien nommés un à un dans l'ordre. Par contre, pour facultatif, le 0 a le caractère facultatif (F), et les autres ne l'ont pas. Alors que ça devrait être l'inverse.
Je pense que le problème vient du fait qu'il faudrait qu'à chaque ligne d'ingrédient (ie ingredient + facultatif) le champ facultatif[] ait une valeur dans tous les cas, que l'auteur de la recette coche la case ou non. Ainsi on garderait une cohérence entre l'ingrédient 0 et le facultatif 0, entre le 1 et le 1, etc.
Le truc, c'est que je ne sais pas comment faire ça. Comment donner une valeur par défaut cachée à un champ, notamment une checkbox ? Ou est ce que ça peut être effectivement réglé par une table ? Si oui je ne vois pas comment. Merci de bien vouloir m'éclairer.

Dernière modification par Mendoza (12-04-2011 11:40:02)

Hors ligne

Pied de page des forums