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

ppp*_*ppp 19 php arrays hidden

我的代码

$order[$j][0]="Euclidean Geomethiyil Kodpagugal";
$order[$j][1]=$q16;
$j++;
Run Code Online (Sandbox Code Playgroud)

隐藏的领域 -

<input type="hidden" name="hdnTotal" value="<?php echo $gtot; ?>">
<input type="hidden" name="hdnOrder" value="<?php echo $order; ?>">
<input type="submit" value="Place Order">
Run Code Online (Sandbox Code Playgroud)

hdnTotal价值即将出现在下一页但hdnOrder不是.print($_POST['hdnOrder'])Array在屏幕上打印.

Pau*_*xon 43

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

序列化数组

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

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

当此值返回时,您需要对其进行反序列化以使阵列退出.虽然很简单,但我不推荐这个,除非你有一些额外的机制来防止篡改,比如安全哈希,否则任何人都可以注入他们喜欢的任何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.'">';
Run Code Online (Sandbox Code Playgroud)

现在,当数据返回时,在反序列化之前,再次生成哈希并检查它是否与表单中的哈希值匹配.如果不匹配,有人篡改了数据.如果匹配,那么你知道生成数据的任何东西都知道你的秘密字符串.哪个应该只是你!

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

多个隐藏字段

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

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

 }
Run Code Online (Sandbox Code Playgroud)

这样做的好处是PHP会自动为您重新创建一个数组.

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

使用会话

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

session_start();

$_SESSION['order']=$order;
Run Code Online (Sandbox Code Playgroud)

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


Eri*_*son 10

序列化为单个字段的替代解决方案是序列化为多个隐藏字段.我写了一个通用函数来做到这一点.此功能和示例正在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 }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是一些示例用法:

基本关联数组

echo array_to_input(array('foo' => 'bar', 'cat' => 'dog'));
Run Code Online (Sandbox Code Playgroud)

将输出:

<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">
Run Code Online (Sandbox Code Playgroud)

具有嵌套索引数组的关联数组

echo array_to_input(array('foo' => 'bar', 'cat' => 'dog', 'list' => array('a', 'b', 'c')));
Run Code Online (Sandbox Code Playgroud)

将输出:

<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">
Run Code Online (Sandbox Code Playgroud)

具有嵌套关联数组的关联数组

echo array_to_input(array('foo' => array('bar' => 'baz', 'a' => 'b'), 'cat' => 'dog'));
Run Code Online (Sandbox Code Playgroud)

将输出:

<input type="hidden" value="baz" name="foo[bar]">
<input type="hidden" value="b" name="foo[a]">
<input type="hidden" value="dog" name="cat">
Run Code Online (Sandbox Code Playgroud)

疯了

echo array_to_input(array('a' => array('b' => array('c' => array('d' => 'e')))));
Run Code Online (Sandbox Code Playgroud)

将输出:

<input type="hidden" value="e" name="a[b][c][d]">
Run Code Online (Sandbox Code Playgroud)


Pas*_*Qyy 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">
Run Code Online (Sandbox Code Playgroud)

为了得到它,json_decode:

print(json_decode($_POST['hdnOrder']));
Run Code Online (Sandbox Code Playgroud)

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

但是你为什么要那样做呢?

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


Ali*_*aru 5

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

  1. PHP 的序列化和反序列化
  2. JSON编码解码

作为一般规则,如果在 HTML 中放置任何值,则需要对其 HTML 特殊字符进行编码

用例:

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