Passaggio di array come parametro URL


115

Qual è il modo migliore per passare un array come parametro URL? Stavo pensando se questo è possibile:

$aValues = array();

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

o che ne dici di questo:

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

Ho letto esempi, ma lo trovo disordinato:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';

2
Perché non puoi semplicemente passare $_POST?
casuale

Sembra davvero disordinato. Ma per quell'approccio deve esserlo. Un altro approccio, poco complicato, è quello di assegnare query = array('aParam'=> json_encode($arrayOfValues)). E che puoi passare un URL più bello con url_encode(implode('/',$query)). L'URL sarà simile www.example.com/aParam/[va1,val2,...]. Quando si riceve devi json_decode aParam value in array.
Vladimir Vukanac

Risposte:


220

C'è una soluzione molto semplice: http_build_query(). Accetta i parametri della query come un array associativo:

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

sarà di ritorno

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

http_build_query()gestisce tutti gli escape necessari per te ( %5B=> [e %5D=> ]), quindi questa stringa è uguale a aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.


16
Se ti stai chiedendo come riportarlo in un array, la risposta è parse_str () .
Errore di battitura

1
L'ho usato per inserire l'URL nell'array ma non so come recuperare i dati. Ho provato parse_str e non sono riuscito a farlo funzionare. Penso che questa sarebbe un'informazione preziosa
Thomas Williams

2
Per chiunque abbia problemi con il http_build_queryritorno param[]e alcune volte param[index]. Dai un'occhiata a questo messaggio: stackoverflow.com/questions/11996573/...
stwhite

2
per recuperare il valore devi solo $ data = $ _GET ['aParam'];
sfortunato

@dfortun tornare indietro è importante che tu abbia risparmiato un sacco di tempo parse_str () non ha funzionato per me ma $ data = $ _GET ['aParam']; è la soluzione corretta
Asesha George

56

Modifica: non perdere la soluzione di Stefan sopra, che utilizza la http_build_query()funzione molto utile : https://stackoverflow.com/a/1764199/179125

Knittl ha ragione riguardo alla fuga. Tuttavia, c'è un modo più semplice per farlo:

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

Se vuoi farlo con un array associativo, prova invece questo:

PHP 5.3+ (funzione lambda)

$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 (richiamata)

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));

1
! pulito sarebbe bello se potesse funzionare anche con gli array associativi. +1 comunque
maglia

3
knittl: Possiamo farlo con una funzione di callback a array_map e passando le chiavi e i valori separatamente. Controlla.
Jordan in esecuzione il

ma questo potrebbe comunque superare la dimensione massima del parametro GET giusto? quali sono le probabilità se utilizzo le sessioni invece come nash menzionato di seguito?
uji

Bene, puoi memorizzare una quantità più o meno illimitata di dati in una sessione. Il rischio con le sessioni è che gli URL si interrompano quando la sessione scade o se l'utente cerca di fare cose, ad esempio, in due schede contemporaneamente. Se l'utente aggiunge la pagina ai segnalibri, quindi torna dopo la scadenza della sessione, riceverà comunque la pagina prevista? Sembra che potresti dover pensare più attentamente alla tua architettura e al motivo per cui stai passando intorno a array così enormi in primo luogo.
Jordan in esecuzione il

+1 buona risposta e funziona per me anche dopo un anno di pubblicazione di questa risposta.
Navata il

10

Il modo più semplice sarebbe usare la serializefunzione.

Serializza qualsiasi variabile per l'archiviazione o il trasferimento. Puoi leggere a riguardo nel manuale php - serialize

La variabile può essere ripristinata utilizzando unserialize

Quindi, passando all'URL che usi:

$url = urlencode(serialize($array))

e per ripristinare la variabile che utilizzi

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

Stai attento qui però. La dimensione massima di una richiesta GET è limitata a 4k, che puoi facilmente superare passando gli array in un URL.

Inoltre, non è proprio il modo più sicuro per passare i dati! Probabilmente dovresti invece considerare l'utilizzo delle sessioni.


Anche la serializzazione è un bel modo per farlo, ma poi è in una forma non più leggibile
knittl

1
Sì, serializzare non è davvero un modo pulito di fare le cose quando lavori con gli URL, perché espande così tanto i dati. Meglio andare su misura.
Kzqai

la dimensione massima del parametro GET era ciò di cui ero preoccupato, ecco perché stavo (stupidamente) sperando che al parser non importasse se è un array che viene passato. Mi sono reso conto solo ora che non funzionerà senza toccare la dimensione massima. Grazie comunque nash, penso che lo farò con le sessioni
uji

4
Non dovresti davvero passare dati non attendibili a unserialize (). Prova invece json_encode () e json_decode ().
Mikko Rantalainen

6

si prega di sfuggire alle variabili durante l'output (urlencode ).

e non puoi semplicemente stampare un array, devi costruire il tuo URL usando un ciclo in qualche modo

$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);
}

1
Invece di utilizzare una "prima" variabile per saltare la prima & amp;, puoi utilizzare un array temporaneo per memorizzare i tuoi valori e utilizzare implode afterwords. Solo per leggibilità. 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";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";} e

print $strenc . "\n";

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

Quindi, se vuoi passare questo $arraytramite URL apage_no_2.php ,

ex:-

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

Per tornare all'array originale, deve essere urldecode(), quindi unserialize(), in questo modo in page_no_2.php:

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

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

ancora: D



1

Questa non è una risposta diretta in quanto è già stata data una risposta, ma tutti parlavano di inviare i dati, ma nessuno ha detto davvero cosa fare quando arriva e mi ci è voluta una buona mezz'ora per risolverlo. Quindi ho pensato di dare una mano qui.

Ripeterò questo pezzo

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

Ovviamente lo formatteresti meglio di questo www.someurl.com?x=$query

E per recuperare i dati

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];

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'];

0

nella pagina ricevuta puoi usare:

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


Benvenuto in Stack Overflow. Quando si aggiunge una risposta a una domanda vecchia di dieci anni con altre otto risposte, è molto importante sottolineare il nuovo aspetto della domanda a cui si rivolge la risposta. In questo momento sembra che tu abbia una risposta solo codice che è già stata coperta da una delle altre risposte. Si prega di utilizzare la formattazione del codice per il codice nelle risposte future.
Jason Aller

0

Questo è un altro modo per risolvere questo problema.

$data = array(
              1,
              4,
             'a' => 'b',
             'c' => 'd'
              );
$query = http_build_query(array('aParam' => $data));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.