这里是我的代码
$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
。
答案 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">
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)
如果您有非标量值,则应序列化并反序列化它们。您有多种选择:
作为一般规则,如果您在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会话。它更容易实现,更高效,更安全。