web-dev-qa-db-fra.com

Comment passer un tableau dans une chaîne de requête?

Existe-t-il un moyen standard de passer un tableau à travers une chaîne de requête?

Pour être clair, j'ai une chaîne de requête avec plusieurs valeurs, dont l'une serait une valeur de tableau. Je veux que cette valeur de chaîne de requête soit traitée comme un tableau. Je ne veux pas que le tableau soit éclaté de manière à ce qu'il soit impossible de le distinguer des autres variables de chaîne de requête.

En outre, selon ce post réponse , l'auteur suggère que la prise en charge des chaînes de requête pour les tableaux ne soit pas définie. Est-ce exact?

EDIT:

Sur la base de la réponse de @ Alex, il n'y a pas de moyen standard de le faire. Mon suivi est donc un moyen facile de reconnaître que le paramètre que je lis est un tableau. dans les deux PHP et Javascript ?

Serait-il acceptable de nommer plusieurs params du même nom, et ainsi je saurais qu'ils appartiennent à un tableau? Exemple:

?myarray=value1&myarray=value2&myarray=value3...

Ou serait-ce une mauvaise pratique?

309
Yarin

Voici ce que j'ai compris:

La soumission de champs de formulaire à valeurs multiples, c’est-à-dire la soumission de tableaux à l’aide de vars GET/POST, peut être effectuée de différentes manières, puisqu’un standard n’est pas nécessairement précisé.

Il existe trois manières d'envoyer des champs ou des tableaux à valeurs multiples:

  • ?cars[]=Saab&cars[]=Audi (Le meilleur moyen - PHP lit ceci dans un tableau)
  • ?cars=Saab&cars=Audi (Mauvaise façon- PHP n'enregistrera que la dernière valeur)
  • ?cars=Saab,Audi (je n'ai pas essayé cela)

Exemples de formulaire

Sur un formulaire, les champs à valeurs multiples peuvent prendre la forme d'une zone de sélection définie sur multiple :

<form> 
    <select multiple="multiple" name="cars[]"> 
        <option>Volvo</option> 
        <option>Saab</option> 
        <option>Mercedes</option> 
    </select>
</form>

(NOTE: Dans ce cas, il serait important de nommer le contrôle de sélection some_name[], afin que les vars de requête résultants soient enregistrés sous forme de tableau par PHP)

... ou en tant que plusieurs champs cachés avec le même nom :

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

NOTE: L'utilisation de field[] pour plusieurs valeurs est vraiment mal documentée. Je ne vois aucune mention de cela dans la section sur les clés à valeurs multiples dans Chaîne de requête - Wikipedia , ou dans le docs W3C traitant des entrées à sélection multiple.


UPDATE

Comme l'ont souligné les commentateurs, il s'agit en grande partie d'un cadre spécifique. Quelques exemples:

Chaîne de requête:

?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3

Rails:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"

Angulaire:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"

(Angulaire discussion )

Voir les commentaires pour des exemples dans node.js , Wordpress , ASP.net


Maintien de l'ordre: Une dernière chose à considérer est que si vous devez conserver l'ordre de vos articles (c’est-à-dire un tableau sous forme de liste ordonnée), vous n’avez en réalité qu’une option, qui consiste à transmettre une liste de valeurs délimitée et à la convertir explicitement en tableau.

380
Yarin

Une chaîne de requête contient des données textuelles, il n'y a donc pas d'autre option que d'exploser le tableau, de le coder correctement et de le transmettre dans un format de représentation de votre choix:

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

puis décodez-le dans votre code côté serveur.

36
Alex K.

Je ne pense pas qu'il existe une norme.
Chaque environnement Web fournit son propre "standard" pour de telles choses. En outre, l'URL est généralement trop courte (limite de 256 octets sur certains navigateurs). Bien sûr, des tableaux/données plus longs peuvent être envoyés avec POST demandes.

Cependant, il existe quelques méthodes:

  1. Il existe un moyen PHP, qui utilise des crochets ([, ]) dans les requêtes d'URL. Par exemple, une requête telle que ?array_name[]=item&array_name[]=item_2 fonctionne, bien que mal documentée, avec PHP la convertissant automatiquement en tableau. Source: https://stackoverflow.com/a/9547490/3787376

  2. Les formats d’échange de données d’objet (par exemple, JSON - site officiel , documentation PHP ) peuvent également être utilisés s’ils disposent de méthodes de conversion de variables en tant que chaînes, comme JSON.
    Un encodeur url (disponible pour la plupart des langages de programmation) est également requis pour les requêtes d’obtention HTTP afin de coder correctement les données de chaîne.

Bien que la "méthode des crochets" soit simple et fonctionne, elle est limitée à PHP et aux tableaux.
Si d'autres types de variables, tels que des classes ou des variables de transmission dans des chaînes de requête dans une langue autre que PHP, sont requis, la méthode JSON est recommandée.

Exemple dans PHP de la méthode JSON (méthode 2):

$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.

Code pour recevoir la page (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
19
Berry Tsakala

Je pense que cela serait utile pour quelqu'un qui cherche à passer le tableau d'une chaîne de requête à une servlet. J'ai testé la chaîne de requête ci-dessous et j'ai pu obtenir les valeurs du tableau en utilisant req.getgetParameterValues ​​(); méthode. Vous trouverez ci-dessous la chaîne de requête que j'ai transmise au navigateur.

  http://localhost:8080/ServletsTutorials/*.html? 
  myname=abc&initial=xyz&checkbox=a&checkbox=b

case à cocher est mon tableau de paramètres ici.

7
vara

Vous mentionnez PHP et Javascript dans votre question, mais pas dans les balises. J'ai atteint cette question avec l'intention de passer un tableau à une action MVC.Net.

J'ai trouvé la réponse à ma question ici : le format attendu est celui que vous avez proposé dans votre question, avec plusieurs paramètres portant le même nom.

2
DCShannon

Cela fonctionne pour moi:

En lien, attribuer a valeur:

to="/filter/arr?fruits=Apple&fruits=banana"

Route peut gérer ceci:

path="/filter/:arr"

Pour plusieurs tableaux:

to="filter/arr?fruits=Apple&fruits=banana&vegetables=potato&vegetables=onion"

La route reste la même.

CAPTURE D'ÉCRAN

enter image description here

1
alia

Vous pouvez utiliser http_build_query pour générer une chaîne de requête codée en URL à partir d'un tableau en PHP. Alors que la chaîne de requête résultante sera étendue, vous pouvez choisir un séparateur unique en tant que paramètre de la méthode http_build_query. Ainsi, lorsqu'il s'agit de décoder, vous pouvez vérifier quel séparateur a été utilisé. S'il s'agissait de l'unique que vous avez choisi, il s'agirait de la chaîne de requêtes du tableau, sinon des chaînes de requêtes normales.

1
keyboardP

Vérifiez la fonction parse_stringhttp://php.net/manual/en/function.parse-str.php

Il renverra toutes les variables d'une chaîne de requête, y compris les tableaux.

Exemple de php.net:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

?>
0
Dan Murfitt