132 votes

Une option dans une balise Select peut-elle avoir plusieurs valeurs ?

J'ai une balise select avec quelques options dans un formulaire HTML :
(les données seront collectées et traitées en utilisant PHP)

Test :

<select name="Testing">  
  <option value="1"> One  
  <option value="2"> Two  
  <option value="3"> Three
</select>

Est-il possible pour une option d'avoir plusieurs valeurs, par exemple lorsqu'un utilisateur sélectionne "Un", alors quelques autres valeurs liées à cette option seront écrites dans la base de données.

Comment dois-je concevoir le select de manière à ce que chacune des options puisse porter plusieurs valeurs, comme ceci :

<select name="Testing">  
  <option value="1" value="2010"> One  
  <option value="2" value="2122"> Two  
  <option value="3" value="0"> Three
</select>

1 votes

Utilisez-vous php comme serveur script pour le traitement.

1 votes

Je suis juste curieux de savoir pourquoi vous avez besoin de ça ?

2 votes

@Salil. Par curiosité, s'il est possible de le faire

192voto

Robusto Points 17430

Une façon de le faire, d'abord un tableau, puis un objet :

    <select name="">
        <option value='{"num_sequence":[0,1,2,3]}'>Option one</option>
        <option value='{"foo":"bar","one":"two"}'>Option two</option>
    </select>

Modifié (3 ans après la réponse) pour mettre les deux valeurs en format JSON (en utilisant JSON.stringify() ) en raison d'une plainte selon laquelle ma réponse de type "proof-of-concept" "pourrait dérouter un développeur débutant".

10 votes

+1 pour une solution élégante. N.B. Si vous utilisez la deuxième option, je vous recommande d'utiliser $.parseJSON($(this).val()) dans l'événement de changement pour obtenir un objet javascript, en supposant que vous ayez besoin d'obtenir chaque valeur séparément.

2 votes

-1 car cette réponse induit le PO à avoir un gros problème de sécurité dans son code lors de l'évaluation de l'entrée. La meilleure façon d'éviter cela est d'utiliser JSON, comme suggéré par @DavidHoerster, car l'entrée est mieux gérée.

6 votes

@fotanus : Mon deuxième exemple est un objet JSON littéral ne diffère pas de ce que propose l'autre question. Quant au tableau, c'est juste un exemple. C'est la responsabilité du code côté serveur d'assainir les valeurs d'entrée de toute façon.

63voto

Nedra Points 51

Je me posais cette question aujourd'hui, et j'y suis parvenu en utilisant la fonction php explode, comme ceci :

Formulaire HTML (dans un fichier que j'ai nommé 'doublevalue.php') :

    <form name="car_form" method="post" action="doublevalue_action.php">
            <select name="car" id="car">
                    <option value="">Select Car</option>
                    <option value="BMW|Red">Red BMW</option>
                    <option value="Mercedes|Black">Black Mercedes</option>
            </select>
            <input type="submit" name="submit" id="submit" value="submit">
    </form>

Action PHP (dans un fichier que j'ai nommé doublevalue_action.php)

    <?php
            $result = $_POST['car'];
            $result_explode = explode('|', $result);
            echo "Model: ". $result_explode[0]."<br />";
            echo "Colour: ". $result_explode[1]."<br />";
    ?>

Comme vous pouvez le voir dans le premier morceau de code, nous créons une boîte de sélection HTML standard, avec 2 options. Chaque option a une valeur, qui a un séparateur (dans ce cas, '|') pour séparer les valeurs (dans ce cas, modèle et couleur).

Sur la page d'action, j'explose les résultats dans un tableau, puis j'appelle chacun d'eux. Comme vous pouvez le voir, je les ai séparés et étiquetés pour que vous puissiez voir l'effet que cela produit.

J'espère que cela aidera quelqu'un :)

1 votes

Je trouve cette méthode très simple et très utile, mais je me demande si cette méthode est prise en charge par tous les navigateurs ?

0 votes

Semble très simple et efficace. Merci

0 votes

Brillant, étonnant, superbe un bijou de classe.

16voto

Haim Evgi Points 40786

Une option est de mettre plusieurs valeurs séparées par des virgules.

comme

value ="123,1234"

et du côté du serveur, séparez-les

0 votes

Comment les séparer côté serveur ? (en php)

0 votes

Comme la fonction exploser

5voto

David Hoerster Points 18815

Si votre objectif est d'écrire ces informations dans la base de données, alors pourquoi avoir besoin d'une valeur primaire et de valeurs "liées" dans le champ de données de la base de données ? value attribut ? Pourquoi ne pas simplement envoyer la valeur primaire à la base de données et laisser la nature relationnelle de la base de données s'occuper du reste.

Si vous devez avoir plusieurs valeurs dans votre OPTION essayez un délimiteur qui n'est pas très courant :

<OPTION VALUE="1|2010">One</OPTION>

...

ou ajouter un objet littéral (format JSON) :

<OPTION VALUE="{'primary':'1','secondary':'2010'}">One</OPTION>

...

Cela dépend vraiment de ce que vous essayez de faire.

5voto

Jaison Justus Points 1269

Mettez des valeurs pour chaque option comme

<SELECT NAME="val">
   <OPTION VALUE="1" value="1:2:3:4"> 1-4  
   <OPTION VALUE="2" value="5:6:7:8"> 5-8  
   <OPTION VALUE="3" value="9:10:11:12"> 9-12
</SELECT>

côté serveur, dans le cas de php, utilisez des fonctions comme explode. [array] = explode([delimeter], [posted value]) ;

$values = explode(':',$_POST['val']

le code ci-dessus renvoie un tableau où seuls les chiffres et les " :" sont supprimés.

0 votes

La VALEUR et la valeur n'entrent-elles pas en conflit ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X