Использование 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. Может быть, это работает без этого, но лучше быть на безопасной стороне. Кроме того, ваш массив немного запутан.
* * 1023 Обновление: 1025 **
На самом деле я только что заметил, что сериализация массива, содержащего строки, например 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) {
...
}
Конечно, это может быть улучшено и дальше, но должно дать правильное представление.