Übergeben von Arrays als URL-Parameter

115

Wie kann ich ein Array am besten als URL-Parameter übergeben? Ich dachte, ob das möglich ist:

$aValues = array();

$url = 'http://www.example.com?aParam='.$aValues;

oder wie wäre es damit:

$url = 'http://www.example.com?aParam[]='.$aValues;

Ich habe Beispiele gelesen, aber ich finde es chaotisch:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';
uji
quelle
2
Warum kannst du nicht einfach vorbeikommen $_POST?
zufällig
Das sieht wirklich chaotisch aus. Aber für diesen Ansatz muss es sein. Ein anderer Ansatz, der wenig kompliziert ist, ist zuzuweisen query = array('aParam'=> json_encode($arrayOfValues)). Und das kannst du mit schönerer URL weitergeben url_encode(implode('/',$query)). URL wird so aussehen www.example.com/aParam/[va1,val2,...]. Beim Empfang müssen Sie den aParam-Wert json_decode in das Array eingeben.
Vladimir Vukanac

Antworten:

219

Es gibt eine sehr einfache Lösung : http_build_query(). Ihre Abfrageparameter werden als assoziatives Array verwendet:

$data = array(
    1,
    4,
    'a' => 'b',
    'c' => 'd'
);
$query = http_build_query(array('aParam' => $data));

wird zurückkehren

string(63) "aParam%5B0%5D=1&aParam%5B1%5D=4&aParam%5Ba%5D=b&aParam%5Bc%5D=d"

http_build_query()behandelt alle notwendigen Escape-Aktionen für Sie ( %5B=> [und %5D=> ]), sodass diese Zeichenfolge gleich ist aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

Stefan Gehrig
quelle
16
Wenn Sie sich fragen, wie Sie dies wieder in ein Array integrieren können, lautet die Antwort parse_str () .
Tippfehler
1
Ich habe dies verwendet, um die URL in das Array einzufügen, weiß aber nicht, wie ich die Daten zurückbekomme. Ich habe parse_str ausprobiert und konnte es nicht zum Laufen bringen. Ich denke, das wäre eine wertvolle Information
Thomas Williams
2
Für alle, die Probleme mit der http_build_queryRückkehr param[]und manchmal haben param[index]. Schauen Sie sich diesen Beitrag an: stackoverflow.com/questions/11996573/…
stwhite
2
Um den Wert zurückzugewinnen, müssen Sie nur $ data = $ _GET ['aParam'];
dfortun
@dfortun zurück ist wichtig ist, dass du viel Zeit gespart hast parse_str () hat bei mir nicht funktioniert, aber $ data = $ _GET ['aParam']; ist die richtige Lösung
Asesha George
56

Bearbeiten: Verpassen Sie nicht die obige Lösung von Stefan, die die sehr praktische http_build_query()Funktion verwendet: https://stackoverflow.com/a/1764199/179125

Knittl hat Recht mit der Flucht. Es gibt jedoch einen einfacheren Weg, dies zu tun:

$url = 'http://example.com/index.php?';
$url .= 'aValues[]=' . implode('&aValues[]=', array_map('urlencode', $aValues));

Wenn Sie dies mit einem assoziativen Array tun möchten, versuchen Sie stattdessen Folgendes:

PHP 5.3+ (Lambda-Funktion)

$url = 'http://example.com/index.php?';
$url .= implode('&', array_map(function($key, $val) {
    return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
  },
  array_keys($aValues), $aValues)
);

PHP <5.3 (Rückruf)

function urlify($key, $val) {
  return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
}

$url = 'http://example.com/index.php?';
$url .= implode('&amp;', array_map('urlify', array_keys($aValues), $aValues));
Jordan läuft
quelle
1
ordentlich! wäre schön, wenn es auch mit assoziativen Arrays funktionieren könnte. +1 sowieso
knittl
3
knittl: Wir können das mit einer Rückruffunktion an array_map tun und die Schlüssel und Werte separat übergeben. Hör zu.
Jordan läuft
aber dies könnte immer noch die maximale Größe des GET-Parameters überschreiten, oder? Was sind die Chancen, wenn ich stattdessen Sitzungen wie den unten genannten Nash verwende?
Uji
Nun, Sie können eine mehr oder weniger unbegrenzte Datenmenge in einer Sitzung speichern. Das Risiko bei Sitzungen besteht darin, dass URLs nach Ablauf der Sitzung unterbrochen werden oder wenn der Benutzer versucht, Dinge zu tun, z. B. auf zwei Registerkarten gleichzeitig. Wenn der Benutzer die Seite mit einem Lesezeichen versehen und nach Ablauf der Sitzung wieder zurückkommt, erhält er dann immer noch die Seite, die er erwartet? Es hört sich so an, als müssten Sie sich möglicherweise mehr Gedanken über Ihre Architektur machen und darüber, warum Sie überhaupt so große Arrays herumreichen.
Jordan läuft
+1 gute Antwort und Arbeit für mich auch nach einem Jahr der Veröffentlichung dieser Antwort.
Naveed
10

Am einfachsten wäre es, die serializeFunktion zu nutzen .

Es serialisiert jede Variable zur Speicherung oder Übertragung. Sie können darüber im PHP-Handbuch lesen - serialisieren

Die Variable kann mithilfe von wiederhergestellt werden unserialize

Bei der Übergabe an die URL verwenden Sie also:

$url = urlencode(serialize($array))

und um die von Ihnen verwendete Variable wiederherzustellen

$var = unserialize(urldecode($_GET['array']))

Sei hier aber vorsichtig. Die maximale Größe einer GET-Anforderung ist auf 4 KB begrenzt, die Sie leicht überschreiten können, indem Sie Arrays in einer URL übergeben.

Außerdem ist es nicht ganz der sicherste Weg, Daten weiterzugeben! Sie sollten wahrscheinlich stattdessen Sitzungen verwenden.

Nash
quelle
Serialisierung ist auch eine gute Möglichkeit, aber dann ist es in einer nicht mehr so ​​lesbaren Form
gestrickt
1
Ja, Serialisieren ist keine saubere Methode, wenn Sie mit URLs arbeiten, da es die Daten so stark erweitert. Besser nach Maß gehen.
Kzqai
Die maximale Größe des GET-Parameters war das, worüber ich mir Sorgen machte. Deshalb hoffte ich (dumm), dass es dem Parser nichts ausmacht, wenn es sich um ein Array handelt, das übergeben wird. Ich habe gerade festgestellt, dass es nicht funktioniert, ohne die maximale Größe zu berühren. Trotzdem danke nash, ich denke ich werde es mit Sessions machen
uji
4
Sie sollten wirklich nicht vertrauenswürdige Daten nicht an unserialize () übergeben. Versuchen Sie stattdessen json_encode () und json_decode ().
Mikko Rantalainen
6

Bitte entkommen Sie Ihren Variablen bei der Ausgabe von ( urlencode).

und Sie können nicht einfach ein Array drucken, sondern müssen Ihre URL mithilfe einer Schleife erstellen

$url = 'http://example.com/index.php?'
$first = true;
foreach($aValues as $key => $value) {
  if(!$first) $url .= '&amp';
  else $first = false;
  $url .= 'aValues['.urlencode($key).']='.urlencode($value);
}
stricken
quelle
1
Anstatt eine "erste" Variable zum Überspringen der ersten & amp; zu verwenden, können Sie ein temporäres Array zum Speichern Ihrer Werte und implodierte Nachwörter verwenden. Nur zur besseren Lesbarkeit. php.net/implode
nash
5
 <?php
$array["a"] = "Thusitha";
$array["b"] = "Sumanadasa";
$array["c"] = "Lakmal";
$array["d"] = "Nanayakkara";

$str = serialize($array);
$strenc = urlencode($str);
print $str . "\n";
print $strenc . "\n";
?> 

print $str . "\n"; gibt a:4:{s:1:"a";s:8:"Thusitha";s:1:"b";s:10:"Sumanadasa";s:1:"c";s:6:"Lakmal";s:1:"d";s:11:"Nanayakkara";} und

print $strenc . "\n"; gibt

a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A8%3A%22Thusitha%22%3Bs%3A1%3A%22b%22%3Bs%3A10%3A%22Sumanadasa%22%3Bs%3A1%3A%22c%22%3Bs%3A6%3A%22Lakmal%22%3Bs%3A1%3A%22d%22%3Bs%3A11%3A%22Nanayakkara%22%3B%7D

Wenn Sie dies also $arrayüber die URL an weiterleiten möchten page_no_2.php,

Ex:-

$url ='http://page_no_2.php?data=".$strenc."';

Um zum ursprünglichen Array zurückzukehren, muss es urldecode()dann unserialize()wie folgt in page_no_2.php sein:

    <?php
    $strenc2= $_GET['data'];
    $arr = unserialize(urldecode($strenc2));
    var_dump($arr);
    ?>

gibt

 array(4) {
  ["a"]=>
  string(8) "Thusitha"
  ["b"]=>
  string(10) "Sumanadasa"
  ["c"]=>
  string(6) "Lakmal"
  ["d"]=>
  string(11) "Nanayakkara"
}

nochmal: D.

Thusitha Sumanadasa
quelle
1

Dies ist keine direkte Antwort, da dies bereits beantwortet wurde, aber alle sprachen über das Senden der Daten, aber niemand sagte wirklich, was Sie tun, wenn sie dort ankommen, und ich brauchte gut eine halbe Stunde, um sie auszuarbeiten. Also dachte ich, ich würde hier helfen.

Ich werde dieses Bit wiederholen

$data = array(
'cat' => 'moggy',
'dog' => 'mutt'
);
$query = http_build_query(array('mydata' => $data));
$query=urlencode($query);

Natürlich würden Sie es besser formatieren als diese www.someurl.com?x=$query

Und um die Daten zurückzubekommen

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];
Thomas Williams
quelle
0
**in create url page**

$data = array(
        'car' => 'Suzuki',
        'Model' => '1976'
        );
$query = http_build_query(array('myArray' => $data));
$url=urlencode($query); 

echo" <p><a href=\"index2.php?data=".$url."\"> Send </a><br /> </p>";

**in received page**

parse_str($_GET['data']);
echo $myArray['car'];
echo '<br/>';
echo $myArray['model'];
user2638158
quelle
0

Auf der empfangenen Seite können Sie Folgendes verwenden:

parse_str ($ str, $ array); var_dump ($ array);

CarlosP
quelle
Willkommen bei Stack Overflow. Wenn Sie einer zehn Jahre alten Frage eine Antwort mit acht weiteren Antworten hinzufügen, ist es sehr wichtig, darauf hinzuweisen, welchen neuen Aspekt der Frage Ihre Antwort anspricht. Im Moment sieht es so aus, als hätten Sie nur eine Code-Antwort, die bereits von einer der anderen Antworten abgedeckt wurde. Bitte verwenden Sie die Code-Formatierung für Code in zukünftigen Antworten.
Jason Aller