0

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

//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() 提供的参数无效”。该数组工作正常,因为我可以在前一页上进行迭代,并且其他值可以很好地解析到第二页。

我需要“重新初始化”这个数组值吗?

4

3 回答 3

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:汤姆在安全方面提出了一个很好的观点。您无法确保$_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) {
...
}

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

于 2010-03-24T16:40:38.067 回答
2

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

于 2010-03-24T16:36:42.923 回答
1

'

你可以试试:

foreach ($item_list as $item)
{
    $value = base64_encode($item);
    echo "<input type='hidden' name='price_list[]' value='$value'>";
}
于 2010-03-24T16:54:41.317 回答