562 Stimmen

Wie kann man ein Array in einer Abfragezeichenfolge übergeben?

Gibt es eine Standardmethode zur Übergabe eines Arrays durch eine Abfragezeichenfolge?

Um klar zu sein, habe ich eine Abfragezeichenfolge mit mehreren Werten, von denen einer ein Array-Wert sein würde. Ich möchte, dass Abfragezeichenfolge Wert als ein Array behandelt werden - ich möchte nicht, dass das Array aufgelöst werden, so dass es ununterscheidbar von den anderen Abfragezeichenfolge Variablen ist.

Außerdem, so heißt es hier Antwort abschicken schlägt der Autor vor, dass die Unterstützung von Abfragezeichenfolgen für Arrays nicht definiert ist. Ist dies richtig?

EDITAR:

Ausgehend von der Antwort von @Alex gibt es keine Standardmethode, um dies zu tun, also lautet meine nächste Frage: Wie kann man auf einfache Weise erkennen dass der Parameter, den ich lese, in beiden Fällen ein Array ist PHP y Javascript ?

Wäre es akzeptabel, mehrere Parameter mit dem gleichen Namen zu benennen, und auf diese Weise würde ich wissen, dass sie zu einem Array gehören? Beispiel:

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

Oder wäre dies eine schlechte Praxis?

0 Stimmen

Welches Framework verwenden Sie? Einige Frameworks haben Methoden, die helfen, Arrays an Querystrings zu übergeben.

0 Stimmen

@keyboardP- PHP und Javascript, je nach Anwendungsfall

2 Stimmen

Warum sollten Sie das tun, wenn Sie einfach sagen könnten:?myarray=value1,value2,value3

619voto

Yarin Punkte 157128

Ich habe Folgendes herausgefunden:

Die Übermittlung von mehrwertigen Formularfeldern, d.h. die Übermittlung von Arrays durch GET/POST-Vars, kann auf verschiedene Weise erfolgen, da ein Standard nicht unbedingt vorgeschrieben ist.

Es gibt drei Möglichkeiten, um mehrwertige Felder oder Arrays zu senden:

  • ?cars[]=Saab&cars[]=Audi (Der beste Weg - PHP liest dies in ein Array)
  • ?cars=Saab&cars=Audi (Schlechter Weg - PHP wird nur den letzten Wert registrieren)
  • ?cars=Saab,Audi (Habe ich nicht ausprobiert)

Beispiele für Formulare

In einem Formular können mehrwertige Felder die Form eines Auswahlbox auf mehrere eingestellt :

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

_(HINWEIS: In diesem Fall wäre es wichtig, das Select-Control zu benennen some_name[] , so dass die resultierenden Request-Vars von PHP als Array registriert werden)_

... oder als mehrere versteckte Felder mit demselben Namen :

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

HINWEIS: Verwendung von field[] für mehrere Werte ist wirklich schlecht dokumentiert. Ich sehe keine Erwähnung davon im Abschnitt über mehrwertige Schlüssel in Abfragezeichenfolge - Wikipedia oder in der W3C-Dokumente Umgang mit Mehrfachauswahleingaben.


UPDATE

Wie in den Kommentaren hervorgehoben wurde, ist dies sehr stark rahmenspezifisch. Einige Beispiele:

Abfrage-String:

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

Geländer:

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

Winklig:

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

(Eckig Diskussion )

Siehe Kommentare für Beispiele in node.js , Wordpress , ASP.net


Aufrechterhaltung der Ordnung: Ein weiterer Punkt, der zu beachten ist, ist, dass Sie, wenn Sie die Bestellung Ihrer Elemente (d.h. Array als geordnete Liste), haben Sie wirklich nur eine Option, nämlich die Übergabe einer begrenzten Liste von Werten und deren explizite Konvertierung in ein Array selbst.

3 Stimmen

Ich denke, der Grund dafür, dass diese Funktionalität nicht in allgemeinen Quellen wie Wiki oder W3C dokumentiert ist, liegt darin, dass sie nicht allgemein von Web-Frameworks unterstützt wird. PHP und ich glaube Rails konvertieren automatisch mehrere "key[]" Abfrageparameter in ein Array. Andere tun das nicht.

4 Stimmen

Das Modul nodejs querystring verwendet die ?cars=Saab&cars=Audi Formular

96 Stimmen

In express (node.js) werden beide ?cars=Saab&cars=Audi y ?cars[]=Saab&cars[]=Audi werden in Arrays umgewandelt. Wie auch immer, ?cars=Saab endet als Zeichenkette, aber ?cars[]=Saab ist ein Array mit einem einzigen Element.

47voto

Alex K. Punkte 165323

Eine Abfragezeichenfolge enthält Textdaten, so dass es keine andere Möglichkeit gibt, als das Array zu explodieren, es korrekt zu kodieren und es in einem Darstellungsformat Ihrer Wahl zu übergeben:

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

und dekodieren ihn dann in Ihrem serverseitigen Code.

0 Stimmen

OK, danke für die Klarstellung. Können Sie meine überarbeitete Frage sehen - ist es notwendig, p1...pn, für Schlüssel zu tun, oder kann ich einfach mehrere Schlüssel "p" nennen, und auf diese Weise würde ich wissen, dass sie alle zum gleichen Array gehören?

1 Stimmen

Sie können denselben Namen verwenden; stackoverflow.com/questions/2203430/ oder einfach p=aa,bb,cc, was die naheliegendste Möglichkeit ist, wie Serodis bemerkte.

0 Stimmen

Sehr nützlich bei JSON.stringify y JSON.parse !

28voto

Berry Tsakala Punkte 13033

Ich glaube nicht, dass es eine Norm gibt.
Jede Web-Umgebung bietet ihren eigenen "Standard" für solche Dinge. Außerdem ist die URL in der Regel zu kurz für irgendetwas (bei einigen Browsern ist die Grenze bei 256 Byte). Natürlich können längere Arrays/Daten mit POST-Anfragen gesendet werden.

Es gibt jedoch einige Methoden:

  1. Es gibt eine PHP-Methode, die eckige Klammern verwendet ( [ , ] ) in URL-Abfragen. Zum Beispiel eine Abfrage wie ?array_name[]=item&array_name[]=item_2 funktioniert, obwohl es schlecht dokumentiert ist, da PHP es automatisch in ein Array umwandelt. Quelle: https://stackoverflow.com/a/9547490/3787376

  2. Formate für den Austausch von Objektdaten (z. B. JSON - offizielle Website , PHP-Dokumentation ) können ebenfalls verwendet werden, wenn sie über Methoden zur Konvertierung von Variablen in und aus Strings verfügen, wie es bei JSON der Fall ist.
    Außerdem ist für HTTP-Get-Anfragen ein Url-Encoder (der für die meisten Programmiersprachen verfügbar ist) erforderlich, um die String-Daten korrekt zu kodieren.

Die "Methode der eckigen Klammern" ist zwar einfach und funktioniert, aber sie ist auf PHP und Arrays beschränkt.
Wenn andere Variablentypen wie Klassen oder die Übergabe von Variablen innerhalb von Abfrage-Strings in einer anderen Sprache als PHP erforderlich sind, wird die JSON-Methode empfohlen.

Beispiel in PHP für die JSON-Methode (Methode 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 für die Empfangsseite (PHP):

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

2 Stimmen

Express.js unterstützt auch die Notation in eckigen Klammern, getestet mit 4.13.4.

0 Stimmen

Wenn Sie json_encode verwenden werden, ist es gut, base64_encode und dekodieren die Zeichenfolge, wenn es als Get-Parameter übergeben

24voto

Alia Anis Punkte 1160

Das funktioniert bei mir:

Im Link hat das Attribut to einen Wert:

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

Die Route kann dies bewältigen:

path="/filter/:arr"

Für mehrere Arrays:

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

Die Route bleibt gleich.

SCREENSHOT

enter image description here

UPDATE: Um diese Stringstruktur zu erreichen, Abfrage-Zeichenfolge ist das beste Paket.

Zum Beispiel:

import { stringify, parse } from 'query-string';

const queryParams={
   fruits:['apple','banana'],
   vegetables:['potato','onion']
}
//arrayFormat can be bracket or comma 
stringify(queryParams, { arrayFormat: 'bracket' });

19voto

João Haas Punkte 1343

Es gibt zwar keinen Standard für den URL-Teil, aber für JavaScript gibt es mehr oder weniger einen Standard.

El Array.toString Methode gibt eine durch Komma getrennte Zeichenkette von Elementen zurück.

Wenn Sie daher Objekte, die Arrays enthalten, an URLSearchParams und rufen Sie toString() auf, so ruft es seinerseits toString auf jeden Wert, was in etwa so aussieht:

let data = {
  name: 'abc',
  values: ['abc', 123]
}

new URLSearchParams(data).toString();
// ?name=abc&values=abc,123 (with escaped comma characters)

Dieses Format ist wirklich einfach auf dem Frontend zu serialisieren und auf jedem Server zu parsen, außerdem ist es unabhängig vom Kontext leicht zu verstehen, so dass es in der Regel mein bevorzugtes Format ist, um Array-Daten in URLs zu senden.

1 Stimmen

Das Ergebnis ist ein entgangener Gewinn: "str=abc&arr=abc%2C123"

1 Stimmen

In der Tat, ich werde den Code aktualisieren, um dies anzuzeigen. Der Punkt ist immer noch die gleiche tho, die ist, dass der "Standard" für js ist mit Kommas in Arrays.

0 Stimmen

Ist das Komma getrennt besser/kompatibler als das arr=abc&arra=123 ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X