Jak przekazać tablicę w ciągu zapytania?

Czy istnieje standardowy sposób przekazywania tablicy przez łańcuch zapytania?

Aby było jasne, 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 była eksplodowana tak, że jest nie do odróżnienia od innych zmiennych ciągu zapytania.

Ponadto, zgodnie z tą post answer , autor sugeruje, że obsługa łańcuchów zapytań dla tablic nie jest zdefiniowana. Czy to dokładnie?

EDIT:

Bazując na odpowiedzi @Alex, nie ma standardowego sposobu na zrobienie tego, więc moja kontynuacja brzmi: jaki jest łatwy sposób na rozpoznanie że paramater, który czytam, jest tablicą w PHP i Javascript ?

Czy byłoby dopuszczalne nazwanie wielu paramó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 to byłaby zła praktyka?
Author: Community, 2011-06-05

7 answers

Oto co wymyśliłem:

Przesyłanie wielowartościowych pól formularzy, tj. przesyłanie tablic za pomocą zmiennych GET/POST, można wykonać na kilka różnych sposobów, ponieważ standard niekoniecznie jest zapisywany.

Trzy możliwe sposoby wysyłania pól wielowartościowych lub tablic to:

  • ?cars[]=Saab&cars[]=Audi (najlepszy sposób-PHP odczytuje to do tablicy)
  • ?cars=Saab&cars=Audi (zły sposób-PHP zarejestruje tylko ostatnią wartość)
  • ?cars=Saab,Audi (nie próbowałem this)

Przykłady Formularzy

W formularzu pola wielowartościowe mogą mieć postać pola wyboru ustawionego na wielokrotność :

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

(uwaga: w tym przypadku ważne byłoby nazwanie kontrolki select some_name[], tak aby wynikowe zmienne zapytań zostały zarejestrowane jako tablica przez PHP)

... 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życie {[9] } dla wielu wartości jest naprawdę słabo udokumentowane. Nie widzę żadnej wzmianki o tym w sekcji dotyczącej kluczy wielowartościowych w Query string-Wikipedia, ani w W3C docs zajmującej się wejściami wielokrotnego wyboru.


UPDATE

Jak zauważyli komentatorzy, jest to bardzo specyficzne dla RAM. Niektóre przykłady:

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ątowe:

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

(Angular dyskusja )

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


Utrzymanie porządku: Jeszcze jedną rzeczą do rozważenia jest to, że jeśli chcesz zachować kolejność swoich elementów (tj. tablicę jako listę uporządkowaną), tak naprawdę masz tylko jedną opcję, która jest przekazaniem rozdzielonej listy wartości i jawną konwersją jej do tablicy samodzielnie.

 324
Author: Yarin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 17:24:07

Ciąg zapytania zawiera dane tekstowe, więc nie ma opcji, jak tylko eksplodować tablicę, zakodować ją poprawnie i przekazać w wybranym formacie reprezentacyjnym:

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

A następnie odszyfrować go w kodzie po stronie serwera.

 31
Author: Alex K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 13:17:28

Nie sądzę, żeby był jakiś standard.
Każde środowisko internetowe zapewnia swój własny "standard" dla takich rzeczy. Poza tym adres url jest zwykle zbyt krótki na cokolwiek (limit 256 bajtów w niektórych przeglądarkach). Oczywiście dłuższe tablice / dane mogą być wysyłane z żądaniami POST.

Istnieją jednak pewne metody:

  1. Jest sposób PHP, który używa nawiasów kwadratowych([,]) w zapytaniach URL. Na przykład zapytanie takie jak ?array_name[]=item&array_name[]=item_2 zostało powiedziane, że działa, mimo że jest słabo udokumentowane, z PHP automatycznie konwertuje go do tablicy. Źródło: https://stackoverflow.com/a/9547490/3787376

  2. Formaty wymiany danych obiektowych (np. JSON - Oficjalna strona, dokumentacja PHP ) może być również używana, jeśli mają metody konwersji zmiennych do i z łańcuchów, jak robi to JSON.
    Również koder url (Dostępny dla większości języków programowania) jest wymagany dla żądań HTTP get do zakodowania danych ciągów prawidłowo.

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 łańcuchach 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.
 14
Author: Berry Tsakala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:14

Uważam, że byłoby to pomocne dla kogoś, kto szuka przekazania tablicy w łańcuchu zapytań do servletu. Przetestowałem poniżej ciąg zapytania i udało mi się uzyskać wartości tablicy za pomocą req.metoda getgetParameterValues ();. Poniżej znajduje się ciąg zapytania, który przepuściłem przez przeglądarkę.

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

Checkbox to moja tablica parametrów tutaj.

 6
Author: vara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-08 11:58:21

Możesz użyć http_build_query do wygenerowania zapytania zakodowanego URL z tablicy w PHP. Podczas gdy wynikowy querystring zostanie rozszerzony, możesz zdecydować się na unikalny separator, który chcesz jako parametr do metody http_build_query, więc jeśli chodzi o dekodowanie, możesz sprawdzić, który separator został użyty. JeĹ "li byĹ' o to unikalne, ktĂłre wybraĺ 'eĹ", To byĹ 'oby to zapytanie array, w przeciwnym razie byĹ' oby to normalne zapytanie.

 1
Author: keyboardP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 15:51:28

Wspominasz PHP i Javascript w swoim pytaniu, ale nie w tagach. Dotarłem do tego pytania z zamiarem przekazania tablicy do MVC.Net akcja.

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.

 1
Author: DCShannon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:06

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

Zwróci wszystkie zmienne z łańcucha zapytania, łącznie z tablicami.

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

?>
 0
Author: Dan Murfitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-03 16:13:02