122 votes

Passage de tableaux en tant que paramètre d'URL

Quelle est la meilleure façon de passer un tableau en tant que paramètre d'URL? Je pensais si c'était 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 désordonné:

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

2 votes

Pourquoi ne pouvez-vous pas simplement transmettre $_POST ?

0 votes

Cela semble vraiment désordonné. Mais pour cette approche, cela doit être ainsi. Une autre approche, un peu plus compliquée, consiste à attribuer query = array('aParam'=> json_encode($arrayOfValues)). Et vous pouvez le passer dans une URL plus jolie avec url_encode(implode('/',$query)). L'URL ressemblera à www.example.com/aParam/[va1,val2,...]. Lors de la réception, vous devez décoder la valeur aParam en JSON dans un tableau.

227voto

Stefan Gehrig Points 47227

Il existe une solution très simple: http_build_query(). Elle 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));

retournera

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 équivalente à aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

20 votes

Si vous vous demandez comment remettre cela dans un tableau, la réponse est parse_str().

1 votes

J'ai utilisé ceci pour mettre l'URL dans le tableau mais je ne sais pas comment obtenir les données. J'ai essayé parse_str et n'ai pas réussi à le faire fonctionner. Je pense que ce serait une information précieuse

2 votes

Pour toute personne rencontrant des problèmes avec http_build_query renvoyant param[] et parfois param[index]. Consultez ce post : stackoverflow.com/questions/11996573/…

56voto

Jordan Points 26741

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

knittl a raison en matière d'échappement. Cependant, il y a une manière plus simple de le faire:

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

Si vous voulez le faire avec un tableau associatif, essayez ceci à la place:

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 (fonction de rappel)

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

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

1 votes

Génial! Ce serait bien si cela pouvait fonctionner avec des tableaux associatifs aussi. +1 de toute façon

3 votes

Knittl: Nous pouvons faire cela avec une fonction de rappel à array_map et en passant les clés et les valeurs séparément. Vérifiez-le.

0 votes

Mais cela pourrait encore dépasser la taille maximale du paramètre GET, n'est-ce pas? Quelles sont les chances si j'utilise des sessions comme l'a mentionné Nash ci-dessous?

11voto

nash Points 1644

Le moyen le plus simple serait d'utiliser la fonction serialize.

Il sérialise n'importe quelle variable pour le stockage ou le transfert. Vous pouvez en savoir plus dans le manuel de php - serialize

La variable peut être restaurée en utilisant unserialize

Donc pour passer à l'URL, vous utilisez:

$url = urlencode(serialize($array))

et pour restaurer la variable vous utilisez

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

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

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

0 votes

Sérialiser est également une bonne façon de le faire, mais alors cela devient dans une forme peu lisible

1 votes

Oui, la sérialisation n'est pas vraiment une façon propre de faire les choses lorsque vous travaillez avec des URL, car elle expanse tellement les données. Il vaut mieux faire du sur-mesure.

0 votes

La taille maximale du paramètre GET était ce qui me préoccupait, c'est pourquoi j'espérais (stupidement) que le parseur ne s'en soucierait pas si c'était un tableau qui était 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 le ferai avec des sessions

6voto

knittl Points 64110

Veuillez échapper vos variables lors de l'affichage (urlencode).

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

$url = 'http://example.com/index.php?'
$first = true;
foreach($aValues as $key => $value) {
  if(!$first) $url .= '&';
  else $first = false;
  $url .= 'aValues['.urlencode($key).']='.urlencode($value);
}

1 votes

Au lieu d'utiliser une variable "first" pour sauter le premier &, vous pouvez utiliser un tableau temporaire pour stocker vos valeurs, et utiliser implode par la suite. Juste pour la lisibilité. php.net/implode

3voto

Viktor Points 133

Je fais cela avec des données sérialisées codées en base64. Meilleure et plus petite façon, je suppose. urlencode utilise trop d'espace et vous n'avez que 4 ko.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X