如何通过隐藏字段传递数组

2022-08-30 18:46:31

这是我的代码

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

隐藏字段-

<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值出现在下一页,但不是。 仅在屏幕上打印。hdnOrderprint($_POST['hdnOrder'])Array


答案 1

您可以序列化数组,也可以使用大量隐藏字段。或者,将其存储在会话中。

序列化数组

若要进行序列化,只需使用一个隐藏字段。如果您的数组包含非标量数据,这是一种有用的技术。

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

当此值返回时,您需要取消序列化它以使数组恢复。虽然很容易,但我不建议这样做,除非你有一些额外的机制来防止篡改,比如安全哈希,否则任何人都可以注入任何他们喜欢的PHP数据结构!

哈希可以像这样完成:

 $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.'">';

现在,当数据返回时,在取消序列化之前,再次生成哈希并检查它是否与表单中的哈希值匹配。如果不匹配,则有人篡改了数据。如果它确实匹配,那么您知道无论生成什么数据,也知道您的秘密字符串。这应该只是你!

最后,如果Javascript理解数组数据有用,那么使用PHP的JSON编码/解码函数将更合适。

多个隐藏字段

假设一个由标量值组成的简单数组,您可以使用许多隐藏字段

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

 }

这样做的好处是,PHP 会自动将其重新创建为数组

由于数组是 2 维的,因此要使用此技术,您需要为第二维创建一个内部循环。给读者的练习....

使用会话

也许是三者中最简单的....

session_start();

$_SESSION['order']=$order;

设置后,数组在调用 session_start() 后可用。这样做的好处是它永远不会离开服务器,但当然会在一段时间不活动后消失(默认值为24分钟)。


答案 2

序列化为单个字段的另一种解决方案是序列化为多个隐藏字段。我写了一个通用函数来做到这一点。此函数和示例在 GistHub 的 Gist 服务中进行管理。检查那里的最新版本,但为方便起见,请在此处复制。

<?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 }
    }
  }
}

下面是一些用法示例:

基本关联数组

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

将输出:

<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')));

将输出:

<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'));

将输出:

<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')))));

将输出:

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