让一个新的PHP页面知道一个新的POST值是一个数组吗?

时间:2010-03-24 16:32:55

标签: php arrays input foreach hidden

我有一个创建关联数组的页面,然后将其作为隐藏值传递给新的PHP页面。我有一个foreach循环等待迭代它但它咳出一个“无效参数”错误,好像页面不知道它正在使用的值是一个数组(尽管“print”显示简单的“数组”)。这基本上就是我所拥有的:

//Hidden input to be passed to the next page
print "<input type=\"hidden\" name=\"price_list\" value=\"$item_list\">


//Code on the second page for the foreach loop
extract($_POST);
foreach($price_list as $name=>$price) {
...
}

但我只是简单地给出了“警告:在第17行的/home/cut/mg299/public_html/PHP/invoice.php中为foreach()提供的参数无效”。数组工作正常,因为我可以在上一页上进行迭代,其他值可以很好地解析到第二页。

我是否需要'重新初始化'此数组值?

3 个答案:

答案 0 :(得分:3)

使用serialize()base64_encode()

print '<input type="hidden" name="price_list" value="' . base64_encode(serialize($item_list)) . '">'

unserialize()以及base64_decode()

//Code on the second page for the foreach loop

$price_list = unserialize(base64_decode($_POST['price_list']));
foreach($price_list as $name=>$price) {
...
}

serialize()将您的数组转换为字符串。 base64_encode()对此字符串进行编码,以便通过HTTP进行传输。也许没有它可行,但更安全的一面。另外,你的数组有点混淆。

<强>更新

实际上我只是注意到序列化包含字符串的数组,例如array('foo', 'bar')会产生a:2:{i:0;s:3:"foo";i:1;s:3:"bar";} 要将此正确插入'value="' . serialized_value . '"',您必须对其进行编码,否则结果将与双引号"混淆:

value="a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}"

更新2: Tom对安全问题提出了一个很好的观点。您无法确保$_POST['price_list']包含您提供的值。它们可能被攻击者篡改 为确保数据有效,您可以预先设置某种密钥:

$secret_key = base64_encode('secret');

$value = $secret_key . base64_encode(serialize($item_list))

以后:

$value = $_POST['price_list'];
if(!substr($value,0,strlen($secret_key)) === $secret_key) {
    echo "Attempted attack!!";
    exit();
}
$price_list = unserialize(base64_decode(substr($value, strlen($secret_key)));
foreach($price_list as $name=>$price) {
...
}

当然,这可以进一步改进,但应该给出正确的想法。

答案 1 :(得分:2)

如果阵列上的打印只输出“数组”,那么我怀疑它是如何写入隐藏字段的。尝试查看源代码并查看实际如何呈现给浏览器。如果是,那么您将需要一些序列化和反序列化数组的方法。

答案 2 :(得分:1)

你可以试试:

foreach ($item_list as $item)
{
    $value = base64_encode($item);
    echo "<input type='hidden' name='price_list[]' value='$value'>";
}