使用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) {
...
}
当然,这可以进一步改进,但应该给出正确的想法。