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.
Vous pouvez soit sérialiser la baie, soit utiliser de nombreux champs masqués. Alternativement, stockez-le dans une session.
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é.
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 ....
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)
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:
echo array_to_input(array('foo' => 'bar', 'cat' => 'dog'));
Sortira:
<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">
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">
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">
echo array_to_input(array('a' => array('b' => array('c' => array('d' => 'e')))));
Sortira:
<input type="hidden" value="e" name="a[b][c][d]">
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 .
Si vous avez des valeurs non scalaires, vous devez les sérialiser et les désérialiser. Vous avez plusieurs options:
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)); ?>" />
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?