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

时间:2010-11-21 08:50:40

标签: php arrays hidden

这里是我的代码

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

7 个答案:

答案 0 :(得分:42)

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

序列化数组

serialize,您只需使用一个隐藏字段。如果您的数组包含非标量数据,这是一种有用的技术。

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

当此值返回时,您需要unserialize才能恢复此阵列。虽然很简单,但我不推荐这个,除非你有一些额外的机制来防止篡改,比如安全哈希,否则任何人都可以注入他们喜欢的任何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 encode / decode函数会更合适。

多个隐藏字段

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

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

 }

这样做的好处就是PHP会为你automatically recreate this as an array

因为你的数组是二维的,要使用这种技术,你需要一个第二维的内环。为读者练习....

使用会话

也许这三个中最容易的......

session_start();

$_SESSION['order']=$order;

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

答案 1 :(得分:10)

序列化到单个字段的替代解决方案是序列化为多个隐藏字段。我写了一个通用函数来做到这一点。此功能和示例正在GistHub's Gist service进行管理。检查那里的最新版本,但为了方便起见,这里复制。

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

Go Crazy

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

将输出:

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

答案 2 :(得分:8)

尝试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">

并将其取回,json_decode

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

此解决方案的好处是,您可以使用JavaScript轻松地在客户端操作阵列。

但你为什么要那样做?

如果不是为了在客户端操纵您的数据,则会创建一个不必要的数据往返行程,您可以使用PHP sessions轻松保留在服务器端。

答案 3 :(得分:4)

如果您有非标量值,则应序列化并反序列化它们。您有多种选择:

  1. PHP的serializeunserialize
  2. JSON encodedecode
  3. 作为一般规则,如果您在HTML中添加任何值,则需要encode其HTML特殊字符。

    用例:

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

答案 4 :(得分:1)

这个表单在哪里以及为什么需要将多维数组作为表单的一部分传递?

您将如何执行此操作取决于您是否控制接收表单的页面。如果你这样做,你有几个选择:

1)使用PHP的serialize函数将数组序列化为字符串,然后unserialize $ _POST ['order']将数组序列化为原始数组

2)将其传递给您必须生成的表单字段数组

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

如果您不控制表单,那么您提交的任何内容可能都需要hdnOrder中特定的内容......它是什么?

答案 5 :(得分:0)

对于Java Servlet

arr={"Apple","Bannana","Cherry","Dragan"};
for(int i=0;i<4;i++)
    out.println("<input type=hidden name=fruits value="+arr[i]+">");

答案 6 :(得分:-1)

根据它的声音,您只想将数据从表单的一个页面传递到另一个页面。如果是这样,请使用PHP会话。它更容易实现,更高效,更安全。