Yeni bir PHP sayfası yeni bir POST değerini bildiren bir Array olduğunu?

3 Cevap php

Ben ilişkilendirilebilir bir dizi oluşturur bir sayfa var, sonra yeni bir PHP sayfası için gizli bir değeri olarak geçer. Ben bunun üzerinden yineleme yapmak için bekleyen bir foreach döngü var ama sayfa onunla çalışıyor değerini bilmiyor sanki (sadece "Array" gösteren "baskı" rağmen) bir dizidir, bir "geçersiz argüman" hatası kusar. Bu ne var aslında:

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

Ama ben sadece ": hattında 17 / home/cut/mg299/public_html/PHP/invoice.php içinde foreach için verilen Geçersiz bağımsız değişken () Uyarı" Verilen duyuyorum. Dizi Ben önceki sayfada yineleme gibi, çalışıyor, ve diğer değerler bu ikinci sayfada ince çözümlenir.

Ben 'resetleme' bu dizi değeri gerekir mi?

3 Cevap

Kullan serialize() and base64_encode() :

print '<input type="hidden" name="price_list" value="' . base64_encode(serialize($item_list)) . '">'

ve unserialize() and 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() sizin dizisi bir dizeye dönüştürür. base64_encode() HTTP üzerinden iletimi için güvenli hale getirmek için bu dizeyi kodlar. Belki de güvenli tarafta olmak için onunla ama daha iyi olmadan çalışır. Ayrıca, dizi karartılmış biraz alır.

Update:

Actually I just noticed that serializing an array containing strings e.g. array('foo', 'bar') results in a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}.
In order to insert this correctly in to 'value="' . serialized_value . '"' you have to encode it, otherwise the result will be messed with the double quotes ":

value="a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}"

Update 2: Tom made a good point regarding security. You cannot make sure that $_POST['price_list'] contains the values you provided. They could be tampered by an attacker.
To make sure, that the data is valid, you can prepend some kind of secret key:

$secret_key = base64_encode('secret');

$value = $secret_key . base64_encode(serialize($item_list))

ve daha sonra:

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

Tabii ki bu daha da geliştirilebilir ama doğru bir fikir vermelidir.

Dizinizdeki baskı, sadece "Array" çıktılar, sonra ben o gizli alana yazılı almak nasıl şüpheli. Görüntüleme kaynağını deneyin ve aslında tarayıcı render nasıl olur bakın. Eğer durum bu ise, o zaman dizi seri hale ve deserializing bazı yöntem gerekir.

'

Eğer deneyebilirsiniz:

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