web-dev-qa-db-fra.com

Passer des tableaux en paramètre url

Quel est le meilleur moyen de passer un tableau en tant que paramètre 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';
96
uji

Il existe une solution très simple: http_build_query() . Il prend vos paramètres de requête comme un 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 tout l'échappement nécessaire pour vous (%5B => [ et %5D => ]), donc cette chaîne est égale à aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

197
Stefan Gehrig

Edit: Ne manquez pas la solution de Stefan ci-dessus, qui utilise la très pratique http_build_query() function: 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));
55
Jordan Running

Le moyen le plus simple consiste à utiliser la fonction serialize.

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 demande GET est limitée à 4 Ko, ce que vous pouvez facilement dépasser en passant des tableaux dans une URL.

En outre, 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.

10
nash

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

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

Je le fais avec des données sérialisées base64 codées. Le meilleur et le plus petit moyen, je suppose. urlencode est une perte de temps considérable et vous n’avez que 4k.

3
Viktor
 <?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 voulez transmettre ce $array par l'URL à page_no_2.php

ex:- 

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

Pour revenir au tableau d'origine, il doit s'agir de urldecode(), puis de 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

3

Ce n'est pas une réponse directe, car cela a déjà été répondu, mais tout le monde parlait de l'envoi des données, mais personne n'a vraiment dit ce que vous faites quand cela arrive, et il m'a fallu une bonne demi-heure pour le résoudre. Alors j'ai pensé que je pourrais aider ici.

Je vais répéter ce bit

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

Évidemment, vous le formateriez mieux que celawww.someurl.com?x=$query

Et pour récupérer les données

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