我有一个创建关联数组的页面,然后将其作为隐藏值传递给新的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()提供的参数无效”。数组工作正常,因为我可以在上一页上进行迭代,其他值可以很好地解析到第二页。
我是否需要'重新初始化'此数组值?
答案 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'>";
}