Vous n'êtes pas identifié(e).
Pages :: 1
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
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
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
Salut,
donne le même nom a tes champs
ce sera un tableau
a++
Hors ligne
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
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
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.)
Hors ligne
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
a++
Hors ligne
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
>>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
l'algo aussi
a++
Hors ligne
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
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
Hors ligne
jquery sais très bien faire ça
a++
Hors ligne
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 )
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
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 :
Quelqu'un pourrait-il m'éclairer sur l'origine du problème et le moyen de le résoudre ? Merci.
Hors ligne
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
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
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
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
Pages :: 1