Jak przekazać tablicę w ciągu zapytania?


353

Czy istnieje standardowy sposób przekazywania tablicy przez ciąg zapytania?

Dla jasności mam ciąg zapytania z wieloma wartościami, z których jedna byłaby wartością tablicy. Chcę, aby wartość ciągu zapytania była traktowana jako tablica - nie chcę, aby tablica została rozbita, aby była nierozróżnialna od innych zmiennych ciągu zapytania.

Ponadto, zgodnie z tą odpowiedzią na post , autor sugeruje, że obsługa ciągu zapytań dla tablic nie jest zdefiniowana. Czy to jest dokładne?

EDYTOWAĆ:

W oparciu o odpowiedź @ Alexa nie ma standardowego sposobu na zrobienie tego, więc moje śledzenie jest zatem łatwym sposobem na rozpoznanie, że parametr, który czytam, jest tablicą zarówno w PHP, jak i JavaScript ?

Czy dopuszczalne byłoby nazywanie wielu parametrów tą samą nazwą i w ten sposób wiedziałbym, że należą one do tablicy? Przykład:

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

Czy byłaby to zła praktyka?


Z jakich ram korzystasz? Niektóre frameworki mają metody ułatwiające przekazywanie tablic do kwerend.
— klawiaturaP

@ keyboardP- PHP i JavaScript, w zależności od przypadku użycia
— Yarin

2
Dlaczego chcesz to zrobić, skoro możesz po prostu:? Myarray = wartość1, wartość2,
— wartość3

18
@seroids: co jeśli będzie musiał przekazać przecinki, znaki zapytania, znaki równości i znaki niedrukowalne?
— Berry Tsakala

Odpowiedzi:


429

Oto, co wymyśliłem:

Przesyłanie pól formularza o wielu wartościach, tj. Przesyłanie tablic za pomocą zmiennych GET / POST, można wykonać na kilka różnych sposobów, ponieważ standard nie jest koniecznie określony.

Trzy możliwe sposoby wysyłania pól lub tablic o wielu wartościach to:

  • ?cars[]=Saab&cars[]=Audi (Najlepszy sposób - PHP wczytuje to do tablicy)
  • ?cars=Saab&cars=Audi (Zły sposób - PHP zarejestruje tylko ostatnią wartość)
  • ?cars=Saab,Audi (Nie próbowałem tego)

Przykłady formularzy

W formularzu pola o wielu wartościach mogą przybrać formę pola wyboru ustawionego na wiele :

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

(UWAGA: W tym przypadku byłoby ważne nazwać formant select some_name[], aby wynikowe zmienne żądań zostały zarejestrowane przez PHP jako tablica)

... lub jako wiele ukrytych pól o tej samej nazwie :

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

UWAGA: Używanie field[]wielu wartości jest naprawdę słabo udokumentowane. Nie widzę żadnej wzmianki o tym w sekcji o kluczach wielowartościowych w ciągu zapytania - Wikipedia , ani w dokumentach W3C zajmujących się wejściami wielokrotnego wyboru.


AKTUALIZACJA

Jak zauważyli komentatorzy, jest to bardzo specyficzne dla ram. Kilka przykładów:

Ciąg zapytania:

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

Szyny:

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

Kątowy:

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

( Dyskusja kątowa )

Zobacz komentarze do przykładów w node.js , Wordpress , ASP.net


Utrzymywanie porządku: Jeszcze jedną rzeczą do rozważenia jest to, że jeśli musisz zachować porządek swoich przedmiotów (tj. Tablica jako lista uporządkowana), naprawdę masz tylko jedną opcję, która przekazuje ograniczoną listę wartości i jawnie konwertuje ją na tablica sama.


3
Myślę, że powodem, dla którego ta funkcja nie jest udokumentowana w ogólnych źródłach, takich jak Wiki czy W3C, jest to, że nie jest ona ogólnie obsługiwana przez frameworki internetowe. PHP i myślę, że Railsy automatycznie konwertują wiele parametrów zapytania „key []” na tablicę. Inni nie.
— Carl G

3
Moduł kwerendowy nodejs używa ?cars=Saab&cars=Audiformularza
— SystemParadox

53
W Express (node.js), zarówno ?cars=Saab&cars=Audii ?cars[]=Saab&cars[]=Audisię zamienił tablice. Jednak ?cars=Saabkończy się jako ciąg, ale ?cars[]=Saabjest tablicą z jednym elementem.
— Trevor Dixon

5
Czy możesz ustawić klucze przy użyciu tego podejścia? A co z tablicami wielowymiarowymi?
— Qwerty

5
Wygląda na to, że ASP.NET MVC nie odczytuje formatu ?cars[]=Saab&cars[]=AudiBrak kwadratowych hamulców lub nawiasy kwadratowe wymagają indeksów /
— Mr. Flibble

37

Ciąg zapytania przenosi dane tekstowe, więc nie ma innej opcji, jak tylko rozbić tablicę, zakodować ją poprawnie i przekazać w wybranym przez Ciebie formacie reprezentacyjnym:

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

a następnie zdekoduj go w kodzie serwera.


OK dzięki za wyjaśnienia. Czy widzisz moje poprawione pytanie - czy konieczne jest wykonanie p1 ... pn dla kluczy, czy też mogę po prostu nazwać wiele kluczy „p” i w ten sposób wiedziałbym, że wszystkie należą do tej samej tablicy?
— Yarin

1
Możesz użyć tej samej nazwy; stackoverflow.com/questions/2203430/… lub po prostu p = aa, bb, cc, co jest najbardziej oczywistym sposobem, jak skomentował Serodis.
— Alex K.

bardzo przydatne z JSON.stringifyi JSON.parse!
— charliebrownie

1
Prostym i popularnym formatem reprezentacji jest JSON, w PHP, używając json_encodewtedy rawurlencodei json_decodena drugiej stronie.
— Edward,

20

Nie sądzę, żeby istniał standard.
Każde środowisko sieciowe zapewnia własny „standard” dla takich rzeczy. Poza tym adres URL jest zwykle za krótki na wszystko (limit 256 bajtów w niektórych przeglądarkach). Oczywiście dłuższe tablice / dane można wysyłać za pomocą żądań POST.

Istnieją jednak pewne metody:

  1. Istnieje sposób PHP, który używa nawiasów kwadratowych ( [, ]) w zapytaniach URL. Na przykład zapytanie, o ?array_name[]=item&array_name[]=item_2którym mówi się, że działa, mimo że jest słabo udokumentowane, a PHP automatycznie przekształca je w tablicę. Źródło: https://stackoverflow.com/a/9547490/3787376

  2. Formaty wymiany danych obiektowych (np. JSON - oficjalna strona internetowa , dokumentacja PHP ) mogą być również używane, jeśli mają metody konwersji zmiennych na i z łańcuchów, tak jak robi to JSON.
    Również koder URL (dostępny dla większości języków programowania) jest wymagany do żądania HTTP, aby poprawnie zakodować dane ciągu.

Chociaż „metoda nawiasów kwadratowych” jest prosta i działa, jest ograniczona do PHP i tablic.
Jeśli wymagane są inne typy zmiennych, takie jak klasy lub przekazywanie zmiennych w ciągach zapytań w języku innym niż PHP, zalecana jest metoda JSON.

Przykład w PHP metody JSON (metoda 2):

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

Kod do odbioru strony (PHP):

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

1
Express.js obsługuje również notację w nawiasach kwadratowych, testowaną na 4.13.4.
— Steve Kehlet

7

Myślę, że byłoby to pomocne dla kogoś, kto szuka przekazania tablicy w ciągu zapytania do serwletu. Przetestowałem poniżej ciągu zapytania i byłem w stanie uzyskać wartości tablic za pomocą req.getgetParameterValues ​​(); metoda. Poniżej znajduje się ciąg zapytania, który przeszedłem przez przeglądarkę.

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

pole wyboru to moja tablica parametrów tutaj.


5

To działa dla mnie:

W linku atrybut ma wartość:

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

Route poradzi sobie z tym:

path="/filter/:arr"

W przypadku wielu tablic:

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

Trasa pozostaje taka sama.

ZRZUT EKRANU

wprowadź opis zdjęcia tutaj


2

W swoim pytaniu wspominasz o PHP i JavaScript, ale nie w tagach. Doszedłem do tego pytania z zamiarem przekazania tablicy do akcji MVC.Net.

Znalazłem odpowiedź na moje pytanie tutaj : oczekiwany format to ten, który zaproponowałeś w swoim pytaniu, z wieloma parametrami o tej samej nazwie.


2
Chociaż ten link może odpowiedzieć na pytanie, lepiej dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
— Andrew

@Andrew To nie jest tylko odpowiedź na link. „Oczekiwany format to ten, który zaproponowałeś w swoim pytaniu, z wieloma parametrami o tej samej nazwie”.
— DCShannon

2

Używam React i Rails. Zrobiłem:

js

  let params = {
    filter_array: ['A', 'B', 'C']
  }

  ...

  //transform params in URI

  Object.keys(params).map(key => {
    if (Array.isArray(params[key])) {
      return params[key].map((value) => `${key}[]=${value}`).join('&')
    }
  }
  //filter_array[]=A&filter_array[]=B&filter_array[]=C

1

Możesz użyć http_build_query, aby wygenerować kwerendę zakodowaną w adresie URL z tablicy w PHP. Chociaż powstałe kwerendowanie zostanie rozszerzone, możesz wybrać unikalny separator, który chcesz jako parametr http_build_querymetody, więc jeśli chodzi o dekodowanie, możesz sprawdzić, który separator został użyty. Jeśli byłby to jedyny wybrany przez ciebie, to byłby to querystring tablicy, w przeciwnym razie byłoby to normalne querystring.


1

Chociaż nie ma standardu w części adresu URL, istnieje jeden standard dla JavaScript. Jeśli przekażesz obiekty zawierające tablice URLSearchParamsi wywołasz toString()je, przekształci je ona w listę elementów oddzieloną przecinkami:

let data = {
  str: 'abc',
  arr: ['abc', 123]
}

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123

0

Sprawdź parse_stringfunkcję http://php.net/manual/en/function.parse-str.php

Zwróci wszystkie zmienne z ciągu zapytania, w tym tablice.

Przykład z 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

?>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.