web-dev-qa-db-fra.com

comment passer un tableau à travers un champ caché

ici mon code

$order[$j][0]="Euclidean Geomethiyil Kodpagugal";
$order[$j][1]=$q16;
$j++;

champ caché

<input type="hidden" name="hdnTotal" value="<?php echo $gtot; ?>">
<input type="hidden" name="hdnOrder" value="<?php echo $order; ?>">
<input type="submit" value="Place Order">

hdnTotal la valeur arrive dans la page suivante mais hdnOrder ne l'est pas. print($_POST['hdnOrder']) imprimer uniquement Array à l'écran.

19
ppp

Vous pouvez soit sérialiser la baie, soit utiliser de nombreux champs masqués. Alternativement, stockez-le dans une session.

Sérialisation de la baie

Pour sérialiser , vous utiliserez un seul champ masqué. Il s'agit d'une technique utile si votre tableau contient des données non scalaires.

 $data=serialize($order); 
 $encoded=htmlentities($data);
 echo '<input type="hidden" name="order" value="'.$encoded.'">';

Lorsque cette valeur revient, vous devez désérialiser pour récupérer votre tableau. Bien que facile, je ne le recommanderais pas à moins d'avoir un mécanisme supplémentaire pour empêcher la falsification, comme un hachage de sécurité, sinon n'importe qui peut injecter la structure de données PHP qu'ils aiment!

Un hachage peut être fait comme ceci:

 $data=serialize($order); 
 $encoded=htmlentities($data);
 $hash=md5($encoded.'SecretStringHere');
 echo '<input type="hidden" name="order" value="'.$encoded.'">';
 echo '<input type="hidden" name="order_hash" value="'.$hash.'">';

Maintenant, lorsque les données reviennent, avant de désérialiser, vous générez à nouveau le hachage et vérifiez qu'il correspond à la valeur de hachage du formulaire. Si cela ne correspond pas, quelqu'un a trafiqué les données. Si cela correspond, vous savez que tout ce qui a généré les données connaît également votre chaîne secrète. Qui devrait être juste toi!

Enfin, s'il est utile pour Javascript de comprendre les données du tableau, alors utiliser JSON encoder / décoder les fonctions de PHP serait plus approprié.

Plusieurs champs cachés

En supposant un tableau simple composé de valeurs scalaires, vous pouvez utiliser de nombreux champs masqués

 foreach($order as $idx=>$value)
 {
      $name=htmlentities('order['.$idx.']');
      $value=htmlentities($val);
      echo '<input type="hidden" name="'.$name.'" value="'.$value.'">';

 }

Cela a l'avantage que PHP va recréer automatiquement cela comme un tablea pour vous.

Parce que votre tableau est bidimensionnel, pour utiliser cette technique, vous aurez besoin d'une boucle intérieure pour la deuxième dimension. Un exercice pour le lecteur ....

Utiliser une session

Peut-être le plus simple des trois ...

session_start();

$_SESSION['order']=$order;

Une fois défini, le tableau est disponible après avoir appelé session_start (). Cela a l'avantage de ne jamais quitter le serveur, mais disparaîtra bien sûr après une période d'inactivité (24 minutes par défaut)

42
Paul Dixon

Une solution alternative à la sérialisation vers un seul champ consiste à sérialiser vers plusieurs champs masqués. J'ai écrit une fonction générique pour ce faire. Cette fonction et les exemples sont gérés sur service Gist de GistHub . Vérifiez la dernière version mais copiée ici pour plus de commodité.

<?php
# https://Gist.github.com/eric1234/5802030

function array_to_input($array, $prefix='') {
  if( (bool)count(array_filter(array_keys($array), 'is_string')) ) {
    foreach($array as $key => $value) {
      if( empty($prefix) ) {
        $name = $key;
      } else {
        $name = $prefix.'['.$key.']';
      }
      if( is_array($value) ) {
        array_to_input($value, $name);
      } else { ?>
        <input type="hidden" value="<?php echo $value ?>" name="<?php echo $name?>">
      <?php }
    }
  } else {
    foreach($array as $item) {
      if( is_array($item) ) {
        array_to_input($item, $prefix.'[]');
      } else { ?>
        <input type="hidden" name="<?php echo $prefix ?>[]" value="<?php echo $item ?>">
      <?php }
    }
  }
}

Voici un exemple d'utilisation:

Tableau associatif de base

echo array_to_input(array('foo' => 'bar', 'cat' => 'dog'));

Sortira:

<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">

Tableau associatif avec tableau indexé imbriqué

echo array_to_input(array('foo' => 'bar', 'cat' => 'dog', 'list' => array('a', 'b', 'c')));

Sortira:

<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">
<input type="hidden" name="list[]" value="a">
<input type="hidden" name="list[]" value="b">
<input type="hidden" name="list[]" value="c">

Tableau associatif avec tableau associatif imbriqué

echo array_to_input(array('foo' => array('bar' => 'baz', 'a' => 'b'), 'cat' => 'dog'));

Sortira:

<input type="hidden" value="baz" name="foo[bar]">
<input type="hidden" value="b" name="foo[a]">
<input type="hidden" value="dog" name="cat">

Devenir fou

echo array_to_input(array('a' => array('b' => array('c' => array('d' => 'e')))));

Sortira:

<input type="hidden" value="e" name="a[b][c][d]">
10
Eric Anderson

Essayez json_encode :

<input type="hidden" name="hdnTotal" value="<?php echo htmlspecialchars(json_encode($gtot)); ?>">
<input type="hidden" name="hdnOrder" value="<?php echo htmlspecialchars(json_encode($order)); ?>">
<input type="submit" value="Place Order">

et pour le récupérer, json_decode :

print(json_decode($_POST['hdnOrder']));

Le bonus de cette solution est que vous pourrez facilement manipuler votre tableau côté client avec JavaScript.

Mais pourquoi voulez-vous faire ça?

Si ce n'est pas pour manipuler vos données côté client, vous créez un aller-retour inutile de vos données, que vous pouvez facilement conserver côté serveur avec sessions PHP .

8
Pascal Qyy

Si vous avez des valeurs non scalaires, vous devez les sérialiser et les désérialiser. Vous avez plusieurs options:

  1. PHP's sérialiser et désérialiser
  2. JSON encoder et décoder

En règle générale, si vous mettez une valeur en HTML, vous devez encoder ses caractères HTML spéciaux.

Cas d'utilisation:

<?php
$arr = unserialize($_REQUEST['arr']);
?>
<input type="hidden" name="arr" value="<?php echo htmlentities(serialize($arr)); ?>" />
4
Alin Purcaru

Où va ce formulaire et pourquoi a-t-il besoin d'un tableau multidimensionnel pour être transmis dans le cadre du formulaire?

La façon dont vous allez procéder dépend du contrôle de la page recevant le formulaire. Si vous le faites, vous avez deux options:

1) Sérialiser le tableau dans une chaîne avec la fonction serialize de PHP, puis unserialize $ _POST ['order'] pour récupérer le tableau d'origine

2) Passez-le à travers un tableau de champs de formulaire que vous devrez générer

<input type="hidden" name="hdnOrder[0][0]" value="Something" />
<input type="hidden" name="hdnOrder[0][1]" value="Something else" />

Si vous ne contrôlez pas le formulaire, tout ce que vous soumettez attend probablement quelque chose de spécifique dans hdnOrder ... qu'est-ce que c'est?

1
Dan Grossman