Сообщение новой странице PHP о новом значении POST является массивом? - PullRequest
0 голосов
/ 24 марта 2010

У меня есть страница, которая создает ассоциативный массив, а затем передает его как скрытое значение на новую страницу PHP. У меня есть цикл foreach, ожидающий итерации по нему, но он выдает ошибку «неверный аргумент», как если бы страница не знала, что значение, с которым она работает, является массивом (несмотря на «print», показывающий просто «Array»). Это по сути то, что я имею:

//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) {
...
}

Но мне просто дают «Предупреждение: неверный аргумент указан для foreach () в /home/cut/mg299/public_html/PHP/invoice.php в строке 17». Массив работает нормально, так как я могу выполнить итерацию на предыдущей странице, а остальные значения отлично анализируются на этой второй странице.

Нужно ли повторно инициализировать значение этого массива?

Ответы [ 3 ]

3 голосов
/ 24 марта 2010

Использование 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) {
...
}

Конечно, это может быть улучшено и дальше, но должно дать правильное представление.

2 голосов
/ 24 марта 2010

Если print в вашем массиве просто выводит «Array», то я подозреваю, что так оно и записывается в скрытое поле. Попробуйте просмотреть исходный код и посмотрите, как он отображается в браузере. Если это так, то вам понадобится какой-нибудь метод сериализации и десериализации массива.

1 голос
/ 24 марта 2010

Вы можете попробовать:

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