Passer des tableaux en tant que paramètre d'URL

115

Quelle est la meilleure façon de transmettre un tableau en tant que paramètre d'URL? Je pensais si cela est possible:

$aValues = array();

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

ou que diriez-vous de ceci:

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

J'ai lu des exemples, mais je trouve cela compliqué:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';
uji
la source
2
Pourquoi ne pouvez-vous pas simplement passer $_POST?
hasard
Cela a vraiment l'air désordonné. Mais pour cette approche, il doit l'être. Une autre approche, peu compliquée est à attribuer query = array('aParam'=> json_encode($arrayOfValues)). Et que vous pouvez passer dans une URL plus agréable avec url_encode(implode('/',$query)). L'URL ressemblera à www.example.com/aParam/[va1,val2,...]. Lors de la réception, vous devez json_decode une valeur de Param dans un tableau.
Vladimir Vukanac

Réponses:

220

Il y a une solution très simple: http_build_query(). Il prend vos paramètres de requête sous forme de tableau associatif:

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

reviendra

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

http_build_query()gère tous les échappements nécessaires pour vous ( %5B=> [et %5D=> ]), donc cette chaîne est égale à aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

Stefan Gehrig
la source
16
Si vous vous demandez comment remettre cela dans un tableau, la réponse est parse_str () .
Typo
1
J'ai utilisé ceci pour mettre l'url dans le tableau mais je ne sais pas comment récupérer les données. J'ai essayé parse_str et je n'ai pas pu le faire fonctionner. Je pense que ce serait une information précieuse
Thomas Williams
2
Pour tous ceux qui rencontrent des problèmes de http_build_queryretour param[]et parfois param[index]. Consultez cet article: stackoverflow.com/questions/11996573/…
stwhite
2
pour récupérer la valeur que vous avez juste à $ data = $ _GET ['aParam'];
dfortun
@dfortun get back est important que vous ayez gagné beaucoup de temps parse_str () n'a pas fonctionné pour moi mais $ data = $ _GET ['aParam']; est la bonne solution
Asesha George
56

Edit: Ne manquez pas la solution de Stefan ci-dessus, qui utilise la http_build_query()fonction très pratique : https://stackoverflow.com/a/1764199/179125

knittl a raison de s'échapper. Cependant, il existe un moyen plus simple de le faire:

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

Si vous voulez faire cela avec un tableau associatif, essayez plutôt ceci:

PHP 5.3+ (fonction 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 (rappel)

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 Running
la source
1
soigné! ce serait bien s'il pouvait également fonctionner avec des tableaux associatifs. +1 quand même
tricot
3
knittl: Nous pouvons le faire avec une fonction de rappel à array_map et en passant les clés et les valeurs séparément. Vérifiez-le.
Jordan Running
mais cela pourrait toujours dépasser la taille maximale du paramètre GET, non? Quelles sont les chances si j'utilise des sessions à la place comme nash mentionné ci-dessous?
uji
Eh bien, vous pouvez stocker une quantité plus ou moins illimitée de données dans une session. Le risque avec les sessions réside dans la rupture des URL lorsque la session expire, ou si l'utilisateur essaie de faire des choses, par exemple dans deux onglets à la fois. Si l'utilisateur marque la page, puis revient après l'expiration de sa session, obtiendra-t-il toujours la page à laquelle il s'attend? Il semble que vous deviez peut-être réfléchir davantage à votre architecture et à la raison pour laquelle vous faites passer des tableaux aussi énormes en premier lieu.
Jordan Running
+1 bonne réponse et travaille pour moi aussi après un an de publication de cette réponse.
Naveed le
10

Le moyen le plus simple serait d'utiliser la serializefonction.

Il sérialise toute variable pour le stockage ou le transfert. Vous pouvez lire à ce sujet dans le manuel php - sérialiser

La variable peut être restaurée en utilisant unserialize

Donc, en passant à l'URL que vous utilisez:

$url = urlencode(serialize($array))

et pour restaurer la variable que vous utilisez

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

Soyez prudent ici cependant. La taille maximale d'une requête GET est limitée à 4 Ko, que vous pouvez facilement dépasser en passant des tableaux dans une URL.

De plus, ce n'est vraiment pas le moyen le plus sûr de transmettre des données! Vous devriez probablement envisager d'utiliser des sessions à la place.

nash
la source
la sérialisation est aussi une bonne façon de le faire, mais alors c'est sous une forme pas si lisible plus
knittl
1
Oui, la sérialisation n'est pas vraiment une façon propre de faire les choses lorsque vous travaillez avec des URL, car elle étend tellement les données. Mieux vaut aller sur mesure.
Kzqai
la taille maximale du paramètre GET était ce qui m'inquiétait, c'est pourquoi j'espérais (bêtement) que l'analyseur ne vous dérangera pas si c'est un tableau qui est passé. Je viens de réaliser que cela ne fonctionnera pas sans toucher la taille maximale. Merci quand même nash, je pense que je vais le faire avec des sessions
uji
4
Vous ne devriez vraiment pas transmettre de données non fiables à unserialize (). Essayez plutôt json_encode () et json_decode ().
Mikko Rantalainen
6

veuillez échapper vos variables lors de la sortie ( urlencode).

et vous ne pouvez pas simplement imprimer un tableau, vous devez construire votre URL en utilisant une boucle d'une certaine manière

$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);
}
tricot
la source
1
Au lieu d'utiliser une "première" variable pour ignorer la première & amp ;, vous pouvez utiliser un tableau temporaire pour stocker vos valeurs et utiliser des post-mots implosés. Juste pour la lisibilité. 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"; donne 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";} et

print $strenc . "\n"; donne

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

Donc, si vous souhaitez transmettre cela $arrayvia l'URL à page_no_2.php,

ex:-

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

Pour revenir au tableau d'origine, il doit être urldecode(), alors unserialize(), comme ceci dans page_no_2.php:

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

donne

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

encore: D

Thusitha Sumanadasa
la source
1

Ce n'est pas une réponse directe car cela a déjà été répondu, mais tout le monde parlait d'envoyer les données, mais personne n'a vraiment dit ce que vous faites une fois arrivé, et il m'a fallu une bonne demi-heure pour le résoudre. Alors j'ai pensé que j'aiderais ici.

Je vais répéter ce peu

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

Évidemment, vous la formateriez mieux que cette www.someurl.com?x=$query

Et pour récupérer les données

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];
Thomas Williams
la source
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
la source
0

dans la page reçue, vous pouvez utiliser:

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

CarlosP
la source
Bienvenue dans Stack Overflow. Lorsque vous ajoutez une réponse à une question vieille de dix ans avec huit autres réponses, il est très important d'indiquer à quel nouvel aspect de la question votre réponse traite. À l'heure actuelle, il semble que vous ayez une réponse de code uniquement qui a déjà été couverte par l'une des autres réponses. Veuillez utiliser le formatage du code pour le code dans les réponses futures.
Jason Aller le
0

C'est une autre façon de résoudre ce problème.

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