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)
因为你的数组是二维的,要使用这种技术,你需要一个第二维的内环.为读者练习....
也许三个中最容易的......
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)
试试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会话轻松地保留在服务器端.