web-dev-qa-db-fra.com

comment passer un tableau dans GET en PHP?

$idArray = array(1,2,3,4);

puis-je écrire cette ligne en HTML?

<form method='POST' action='{$_SERVER['PHP_SELF']}?arr={$idArray}'>

ou devrais-je écrire:

<form method='POST' action='{$_SERVER['PHP_SELF']}?arr[]={$idArray}'>

comment sera-t-il passé?

comment dois-je le gérer dans la page appelée?

merci !! 

19
Yoni

Si vous souhaitez passer un tableau en tant que paramètre, vous devez ajouter un paramètre pour chaque élément. Votre chaîne de requête deviendrait:

?arr[]=1&arr[]=2&arr[]=3&arr[]=4

Comme d'autres l'ont écrit, vous pouvez également sérialiser et désérialiser le tableau.

Mais devez-vous vraiment renvoyer les données au client? Il semble que vous ayez simplement besoin d'un moyen de conserver les données entre les requêtes

Dans ce cas, il vaut mieux utiliser sessions(docs) . Ceci est également plus sécurisé, sinon le client pourrait modifier les données.

42
Felix Kling

Utilisez la fonction serialize et unserialize PHP . Cette fonction vous donne la version stockable (chaîne) du type tableau . Pour plus d'informations sur l'utilisation, lisez http://php.net/ manual/fr/function.serialize.php et http://www.php.net/manual/en/function.unserialize.php

7
Svisstack

Une autre option (même jolie, dirais-je):

<form method='POST'>
  <input type="hidden" name="idArray[]" value="1" />
  <input type="hidden" name="idArray[]" value="2" />
  <input type="hidden" name="idArray[]" value="3" />
  <input type="hidden" name="idArray[]" value="4" />
</form>

Mais bien sûr, il est envoyé en tant que POST. Je ne recommanderais pas de l'envoyer avec serialize car la sortie de cette fonction peut devenir assez grosse et la longueur ou l'URL est limitée.

3
Czechnology

Vous pouvez utiliser serialize et & serialize avec urlencode Par exemple.

En envoyant, vous pouvez les envoyer comme ceci:

<?php
$array1 = Array(["key1"]=>"value1",["key2"]=>"value2");
$array2 = Array(["key1"]=>"value1",["key2"]=>"value2");
$data1="textdata";

$urlPortion= '&array1='.urlencode(serialize($array1)).
             '&array2='.urlencode(serialize($array2)).
             '&data1='.urlencode(serialize($data1));
//Full URL:
$fullUrl='http://localhost/?somevariable=somevalue'.$urlPortion
?>

Lors de la réception, vous pouvez y accéder en tant que:

<?php
$destArray1=unserialize($_GET['array1']);
$destArray2=unserialize($_GET['array2']);
$destData1=unserialize($_GET['data1']);
?>

Et voila, vous pouvez attacher cette URL sur une requête ajax ou une page de navigateur normale.

3
mukulu

Utilisez simplement explode() et transmettez sa valeur. Vous pouvez récupérer le tableau en utilisant implode () .

Remarque: Choisissez le délimiteur en fonction du type de contenu qui n'existe pas dans votre tableau. Pour par exemple. Si vous êtes sûr qu'il n'y aura pas de virgules (,) dans votre tableau, choisissez ensuite une virgule comme séparateur.

3
Abhishek Saini

Utiliser la fonction parse_str

$str = "first=value&arr[]=foo+bar&arr[]=baz"; 
parse_str($str); 
echo $first;  
2
nixis

http://snipplr.com/view/4444/passing-an-array-through-get-request/

$str=serialize($idArray);
<form method='POST' action='{$_SERVER['PHP_SELF']}?arr=$str'>

Pour obtenir les données dans la page de réception, vous devez d’abord:

<?PHP 
 $idArray = unserialize($_GET["arr"]); 
?>
1
Stofke

serialize() votre tableau en premier et passez-le. Ensuite, appelez unserialize() dessus. http://ie.php.net/serialize

0
David Gillen

Une session est un moyen beaucoup plus sûr et plus propre de le faire. Commencez votre session avec:

session_start();

Ajoutez ensuite votre tableau sérialisé en tant que variable de session comme ceci:

$_SESSION["venue"] = serialize($venue);

Appelez simplement la variable de session quand vous en avez besoin.

0
Mhaddy

La réponse de Felix répond à la question magnifiquement, mais manque les exemples à mon avis.

Cette réponse est motivée par le commentaire sur la réponse de Felix.

pouvez-vous spécifier les clés en utilisant cette méthode? - Qwerty 27 avr. 14 à 0:05

Tout d'abord, pour illustrer la réponse de Felix:

<input type="hidden" name="array[]" value="val1" />
<input type="hidden" name="array[]" value="val2" />
<input type="hidden" name="array[]" value="val3" />

Lorsque la demande est envoyée au serveur, elle est du type Array.

Voici un exemple avec des clés. Cela vous donnera un tableau avec deux clés, deux valeurs chacune. 

<input type="hidden" name="array['first']" value="val1" />
<input type="hidden" name="array['first']" value="val2" />
<input type="hidden" name="array['second']" value="val3" />
<input type="hidden" name="array['second']" value="val4" />

Enfin, voici un exemple avec VueJS, qui correspond à ce que j’utilisais au moment d’écrire, ce qui m’a amené à cette question.

<input v-for="(value, key) in data" type="hidden" :name="'array[' + key + ']'" :value="value">

J'espère que cela sera utile à tous les passants.

0
Linus Juhlin

Dans le cas particulier que vous avez mentionné, j'imploserais le tableau en une chaîne, puis je l'exploserais lorsque vous posteriez le formulaire.

$str = rawurlencode(implode(",",$idArray));

<form method='POST' action='{$_SERVER['PHP_SELF']}?arr={$str}'>

et ensuite sur le post-traitement:

 $idArray = explode(",",rawurldecode($_POST['arr']));
0
Oliver