IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[PHP-JS] Récupérer plusieurs valeurs "<input>" dans un même champ (bdd)


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club Avatar de Pepito2030
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 36
    Points
    36
    Par défaut [PHP-JS] Récupérer plusieurs valeurs "<input>" dans un même champ (bdd)


    J'ai plusieurs case à cocher dans un formulaire et j'aimerais arriver à tout mettre dans un même champ en séparant chaque valeur par une "," ou autre caractere.

    Voici un exemple :




    Admettons que dans ma base de données, j'ai une table "membres" ou figure le champ "style" et dedans j'aimerais arriver à rentrer les valeurs cochées du formulaire :

    Quand il s'agit de rentrer une seule case à cocher ça va je sais faire mais quand il y en a plusieurs je bloque...

    Dans mon formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <input name="style" value="bcbg" type="checkbox">bcbg
    <input name="style" value="classique" type="checkbox">classique
    <input name="style" value="branchée" type="checkbox">branchée
    <input name="style" value="business" type="checkbox">business
    <input name="style" value="décontracté" type="checkbox">décontracté
    <input name="style" value="sportif" type="checkbox">sportif
    J'ai un bouton submit tout à la fin de mon formulaire (ça envoie les données sur une page de traitement en php).

    Page PHP qui traite mon formulaire (pour une seule case à cocher) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Je récupère la donnée d'une case à cocher
    $style = $_POST['style'];
     
    // J'insère la valeur dans la table, dans le champ "style"
    mysql_query("INSERT INTO membres (style) VALUES ('".$style."')");
    Quelqu'un pourrait il m'éclairer sur la technique à employer pour insérer plusieurs valeurs (de case à cocher) dans un même champ?

    Voila j'espère que j'ai été assez clair dans mon exemple

    Bonne soirée et merci aux personnes qui m'aideront.

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Donne des noms diférents a chacune de tes cases a cochés... sinon, je pense que c au salon javascript que tu trouveras la solution...
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  3. #3
    Nouveau membre du Club Avatar de Pepito2030
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Si je donne un nom à chaque case à cocher je serai obligé de créer autant de champs dans ma table que de cases à cocher?

  4. #4
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    salut,
    J'ai pas testé, mais est ce que tu as essayé de faire un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $myStr = '';
    for ($i=0;$i<count($style);$i++){
    <div style="margin-left:40px">$myStr .= $style[$i].',';</div>}

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Si tu te pose ce genre de question, c'est que ta BDD est mal construite ou ne correspond pas a ton interface.

    Petite leçon sur les MCD :

    un article peut avoir une ou plusieurs catégories. Dans ce cas, on ne crée pas de relation CIF (contrainte d'integrité fonctionnelle, ou relation parent, c-a-d mettre un champs categorie dans ta table article), mais on créé une table intermédiaire que tu appelera par exemple "appartient". Appartient n'as pas de clé primire, et juste 2 champs de même type que les clés primaires de articles et catégorie. Pour chaque association catégorie-articles, tu ajoute une entrée dans cette table avec le code catégorie et le code article.
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  6. #6
    Nouveau membre du Club Avatar de Pepito2030
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par gloubi
    Si tu te pose ce genre de question, c'est que ta BDD est mal construite ou ne correspond pas a ton interface.
    je suis débutant j'aurais peut être du le préciser au début

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    y'a pas de mal à être débutant ^^

    revois juste la structure de ta base avant de poursuivre. Je t'avous qu'a l'époque ou j'étais en 1er année d'info, j'ai moi aussi fait cette erreur ^^

    Si tu es maxi débutant, tu comptais peut être même écrire en dur le mot "classique" dans ta table article (j'ai dit article, mais vu l'exemple, ça serait plutot la table 'user' ^^), ce que je t'encourage a ne surtout pas faire.

    Si c'est le cas, dis le moi, je te ferai un topo rapide sur la façon de structurer tout ça.
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  8. #8
    Nouveau membre du Club Avatar de Pepito2030
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Dans mon exemple,

    J'ai 6 cases à cocher...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <input name="style" value="bcbg" type="checkbox">bcbg
    <input name="style" value="classique" type="checkbox">classique
    <input name="style" value="branchée" type="checkbox">branchée
    <input name="style" value="business" type="checkbox">business
    <input name="style" value="décontracté" type="checkbox">décontracté
    <input name="style" value="sportif" type="checkbox">sportif
    Admettons que la personne coche deux cases... "bcbg" et "classique"

    Donc dans le champ "style" dans ma base données j'aurais bcbg,classique ou bcbg|classique.

    J'ai le droit de faire comme ça?

    Et plutard si j'ai envie d'afficher le champ "style" pour une personne j'utiliserai explode()

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    SURTOUT PAS

    non non non, il faut surtout pas faire comme ça... acorde moi 15-20min, je te fait un topo la dessus.
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Il y a une règle élémentaire dans toute base de données qui se respecte, ON NE FAIT PAS DE DOUBLONS (tout comme on ne stock jamais dans une BDD une valeure calculée à partir d'autre valeurs de la bdd).

    Je vais être concret : admettons que tu sois en train d'associer a des gens des styles (bcbg, classique etc...).

    La vrai façon de faire, la seule avec tu ne te cassera pas les dents, c'est de créer plusieurs tables.

    Si une personne ne peut avoir qu'un et un seul style, il te faudra 2 tables.
    La table "user" (qui a un identifiant unique, appelé clé primaire, et tous les champs que tu veux qui sont en rapport direct avec la personne, comme nom, prenom, adresse, cp, ville etc...) et une table "style".
    La table style sera constitué de 2 champs qui seront par exemple id_style (clé primaire, identifiant de façon unique chaque style) et nom_style.
    Ta table sera alors renseigné dans ton cas comme suit :

    style(id_style (entier), nom_style(chaine de caractere))
    1, bcbg
    2, classique
    3, branché
    4, etc...

    ainsi, tu feras ton association en ajoutant dans ta table 'user' une "clé étrangère", qui fera référence a l'un des enregistrements de la table style. Tu me suis ?
    concrétement, il faudra que tu ajoute dans ta table 'user' un champs style_user (de meme type que id_style, donc un entier).
    Ainsi, dans ta table user, le style sera identifié par un numéro, et tu pourras changer/ajouter des styles directement dans la table style sans pourrir toute ta base de donnée.

    Ensuite, si tu veux savoir de quel style est une personne, tu feras une requete sql qui ressemblera à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     
    select * from user, style where user.id_user = 124 and style.id_style = user.style_user;
    tu récupéreras ainsi directement toutes les information sur l'utilisateur, et son style en toute lettre tel qu'il est stocké en BDD AU MOMENT OU TU FAIS LA REQUETE.

    Bon, je fais une pause clope, et je t'explique ensuite comment on fait quand on veut associer plusieurs style a une personne (car la, c'est le cas 1 et 1 seul style / personne).
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  11. #11
    Nouveau membre du Club Avatar de Pepito2030
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    J'ai un ami qui m'a dit que je pouvais faire comme ça

    Donc en fait j'étais mal parti

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    j'ajouterais qu'avec la méthode précédemment décrite, tu peux construire ton formulaire DYNAMIQUEMENT, c-a-d qu'a chaque fois qu'un style est ajouté dans la table style, tu peux le proposer en option sur ta page SANS MODIFIER LE CODE !

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     
    <form method="POST" action="associer_style.php">
    <input type="hidden" value="<?php echo $id_user; ?>"> <!-- en admettant que ton utilisateur soit deja enregistré et identifié par le le numero contenu dans la variable $id_user-->
    <select name="style">
    <?php
    $req = mysql_query('select * from style order by nom_style'); // ordre alphabétique
    while($res = mysql_fetch_array($req))
       echo '<option value="'.$res[id_style].'">'.$res['nom_style'].'</option>';
    ?>
    </select>
    </form>
    Il suffit alors dans la page associer_style.php de faire figurer le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    $id_user = $_POST['id_suer'];
    $style = $_POST['style'];
    if(is_numeric($id_user) && is_numeric($style))
        mysql_query('update user set style_user = '.$style.' where id_user = '.$id_user);
    et si tu veux afficher une liste des gens avec leur style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     
    <?php
     
    $req = mysql_query('select * from user, style where style.id_style = user.style_user');
    while($res = mysql_fetch_array($req))
         echo strtoupper($res['nom_user']).' '.$res['prenom_user'].' : '.$res['nom_style'];
    ?>
    ok, maintenant, vais faire le topo une personne plusieurs styles...
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Maintenant, admettons qu'une personne puise avoir plusieurs style... l'erreur a ne pas faire est de mettre plusieurs champs style dans ta table user.

    Pour ça, on va utiliser ce qu'on appel une "relation".

    Une relation est une table intermédiaire, sans clé primaire et ne possédant (le plus souvent) que des clés étrangère. Cela permet d'associer 0 a n style a une personne et de 0 a n personnes a chaque style.

    Dans notre exemple, on ne sait précisément pas combien de style aura chaque personne.

    La première chose a faire va être de supprimer de ta table 'user' ton champs "style_user".

    Ensuite, tu créé une nouvelle table, qui s'appel "relation_style_user" (par exemple).
    Dans cette table, 2 colonnes : id_style (du meme type que la clé primaire de ta table style) et id_user (du meme type que ta clé primaire de la table user).

    A chaque fois que tu voudras associer un style a un utilisateur, tu ajoutera un enresitrement contenant la clé primaire de l'utilisateur, et celle du style.
    Pour effacer un style, tu efface tout simplement l'enregistrement correspondant.

    Ainsi, pour connaitre tous les styles associés à un utilisateur, on ecriras le script suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    <?php
    $id_utilisateur = 178; // on va dire que tu veux connaitre les styles de l'utilisateur n°178
    $req = mysql_query('select * from relation_style_user, style where relation_style_user.id_user = '.$id_user.' and style.id_style = relation_style_user.id_style');
     
    while($res = mysql_fetch_array($req))
    {
         echo $res['nom_style'].'<br>';
    }
    ?>
    voilà voilà, je t'encourage vivement a rechercher sur google MCD (modèle conceptuel des données) et MERISE, ou on t'expliquera tout ça en détail.

    Dans tous les cas, si tu continus sur la voie sur laquelle tu es parti, ton sites sera forcément boiteu à un moment ou un autre.
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Citation Envoyé par Pepito2030
    J'ai un ami qui m'a dit que je pouvais faire comme ça
    Oh, tu peux, mais vraiment tu vas te faire chier, et je t'explique pas a quel point la maintenance de ton site vas être ignoble... sans parler de la lourdeur des script qui vont en découler, etc...

    Dans tous les cas, ton ami est à coté de la plaque !
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  15. #15
    Nouveau membre du Club Avatar de Pepito2030
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par gloubi
    voilà voilà, je t'encourage vivement a rechercher sur google MCD (modèle conceptuel des données) et MERISE, ou on t'expliquera tout ça en détail.

    Dans tous les cas, si tu continus sur la voie sur laquelle tu es parti, ton sites sera forcément boiteu à un moment ou un autre.
    Ok merci pour tes explications précises et pour le temps passé à me répondre. MCD et MERISE j'ai déja entendu parler de ça en cours d'informatique en BTS (mais je n'étais pas en bts informatique).

    Mais par exemple, dans un formulaire d'inscription d'un site de rencontres il y a plein de catégories et de choix possibles par exemple :

    Hobbies : lecture, cinéma, sport...
    Style : bcbg, décontracté, sportif...

    Je dois utiliser le mcd pour faire ça? ça va me faire beaucoup de tables à la fin

  16. #16
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    oui, MCD et beacoup de table. Mais t'inquiète pas, c'est LA bonne méthode.

    Dis toi juste qu'il ne doit JAMAIS y avoir redondance de l'information dans une bdd. C'est une regle universel pour les SGBDR (système de gestion de base de données relationnelles).
    en l'occurence, avec la méthode précedemment décrite, le mot "BCBG" par exemple n'apparaitra qu'une seule dans TOUTE la base (ce qui constitue en soit egalment une optimisation en terme de stockage).
    De la même manière, en modifiant l'orthographe de BCBG, les répercussion seront imédiate sur TOUS les utilisateur, déja inscrit, en cours d'inscription et a venir.
    Tu verras également que c'est une optimisation pour les traitement, car rechercher un numéro dans une BDD (surtout si tu index tes tables) est une opération bien plus légère qu'extraire un tableau pour chaque utilisateur puis de le comparer à un terme en dur. Et je t'explique pas si t'as changé l'orthographe du mot en cours d'exploitation... entre les gens qui l'ont orthographié de l'ancienne façon, ou de la nouvelle... ça compte aussi pour les sites multilingues ^^
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  17. #17
    Nouveau membre du Club Avatar de Pepito2030
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Merci beaucoup pour le temps passer à me répondre, c'est clair comme de l'eau de roche maintenant !!

    Je vais me coucher moins bête.

    Mon problème est je vais me remettre au boulot dès demain.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Input et select dans un même champ ?
    Par Lazarey dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 22/09/2008, 14h59
  2. récupérer la valeur d'un input file
    Par july dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/11/2007, 11h17
  3. récupérer plusieurs valeurs dans un champ hidden
    Par karimphp dans le forum Langage
    Réponses: 3
    Dernier message: 07/12/2006, 17h13
  4. [SQL] Récupérer plusieurs valeurs
    Par bogsy15 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 09/08/2006, 10h46
  5. [PHP-JS] Récupérer les valeurs des checkbox
    Par jamirokoi dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2006, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo