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'un serait un tableau de valeur. Je veux que cette valeur de la chaîne de requête soit traitée comme un tableau - Je ne veux pas que le tableau soit explosé de sorte qu'il soit impossible de le distinguer des autres variables de la chaîne de requête.

aussi, selon ce post réponse , l'auteur suggère que l'interrogation chaîne de soutien pour les tableaux n'est pas défini. Est-ce exact?

EDIT:

basé sur la réponse de @Alex, il n'y a pas de façon standard de faire cela, donc mon suivi est alors ce qui est un moyen facile de reconnaître que le paramateur que je lis est un tableau à la fois PHP et Javascript ?

serait-il acceptable de nommer multiple params le même nom, et de cette façon, je sais qu'ils appartiennent à un tableau? Exemple:

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

ou est-ce une mauvaise pratique?

254
demandé sur Community 2011-06-05 17:03:27

7 réponses

voilà ce que j'ai compris:

la soumission de champs de formulaires à valeurs multiples, c.-à-d. la soumission de tableaux par L'intermédiaire de GET/POST vars, peut être faite de plusieurs façons différentes, car une norme n'est pas nécessairement énoncée.

trois façons possibles d'envoyer des champs ou des tableaux à valeurs multiples seraient:

  • ?cars[]=Saab&cars[]=Audi (Meilleure façon - PHP lit ceci dans un tableau)
  • ?cars=Saab&cars=Audi (Bad way - PHP enregistrera seulement la dernière valeur)
  • ?cars=Saab,Audi (N'ont pas essayé cela)

Exemples De Formulaires

sur un formulaire, les champs à valeurs multiples pourraient prendre la forme d'un sélectionnez la case" multiple 1519340920":

<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 select) some_name[] , de sorte que la requête résultante vars serait enregistrée comme un tableau par PHP)

... ou comme 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 des valeurs multiples est très mal documentée. Je ne vois aucune mention de cela dans la section sur les clés multi-valeur dans la chaîne de requête - Wikipedia , ou dans le W3C docs traitant des entrées multi-sélections.


mise à jour

comme les commentateurs l'ont souligné, il s'agit d'un cadre très particulier. 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 nœud.js , Wordpress , ASP.net


maintien de l'ordre: Une autre chose à considérer est que si vous avez besoin de maintenir le ordre parmi vos items (i.e. array as an ordered list), vous n'avez vraiment qu'une seule option, qui est de passer une liste délimitée de valeurs, et de la convertir explicitement en un tableau vous-même.

324
répondu Yarin 2016-04-20 17:24:07

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

p1=value1&pN=valueN...

data=[value1,...,valueN]

data={p1:value1,...,pN:valueN}

et puis décoder dans votre code côté serveur.

31
répondu Alex K. 2011-06-05 13:17:28

il n'y a pas de norme.

Chaque environnement web fournit sa propre "norme" pour de telles choses. En outre, l'url est généralement trop courte pour quoi que ce soit (limite de 256 octets sur certains navigateurs). Bien sûr, des tableaux/données plus longs peuvent être envoyés avec des requêtes POST.

cependant, il existe certaines méthodes:

  1. il y a un moyen PHP, qui utilise des crochets ( [ , ] ) dans les requêtes URL. Par exemple, une requête telle que ?array_name[]=item&array_name[]=item_2 est censée fonctionner, bien qu'elle soit 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 objet (par exemple JSON - site officiel , documentation PHP ) peuvent également être utilisés s'ils ont des méthodes de convertissez les variables en et à partir de chaînes comme JSON le fait.

    De plus, un encodeur d'url (disponible pour la plupart des langages de programmation) est requis pour les requêtes HTTP get afin de coder correctement les données de la 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 telles que des classes ou des variables de passage dans les chaînes de requête dans une langue autre que PHP est requis, la méthode JSON est recommandée.

exemple en 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 la page de réception (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
14
répondu Berry Tsakala 2017-05-23 12:18:14

je pense qu'il serait utile pour quelqu'un qui cherche à passer le tableau dans une chaîne de requête à un servlet. J'ai testé sous la chaîne de requête et j'ai pu obtenir les valeurs du tableau en utilisant req.getgetParameterValues (); méthode. Ci-dessous est la chaîne de requête que j'ai passé par le navigateur.

"http://localhost:8080/ServletsTutorials/*.html?myname=abc&initial=xyz&checkbox=a&checkbox=b"
La case à cocher

est mon tableau de paramètres ici.

6
répondu vara 2013-01-08 11:58:21

vous pouvez utiliser http_build_query pour générer une interrogation encodée URL à partir d'un tableau en PHP. Alors que le querystring résultant sera étendu, vous pouvez décider d'un séparateur unique que vous voulez comme paramètre de la méthode http_build_query , donc quand il s'agit de décodage, vous pouvez vérifier quel séparateur a été utilisé. Si c'était l'unique que vous avez choisi, alors ce serait le tableau querystring sinon ce serait les querystrings normaux.

1
répondu keyboardP 2011-06-05 15:51:28

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

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 ayant le même nom.

1
répondu DCShannon 2017-05-23 12:03:06

vérifier la fonction parse_string 151930920" http://php.net/manual/en/function.parse-str.php

il retournera 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
répondu Dan Murfitt 2012-03-03 16:13:02