2010-03-24 13 views
0

J'ai une page qui crée un tableau associatif, puis le passe comme une valeur cachée à une nouvelle page PHP. J'ai une boucle foreach qui attend de l'itérer mais elle crache une erreur "argument invalide", comme si la page ne connaissait pas la valeur avec laquelle elle travaille est un tableau (malgré "print" montrant simplement "Array"). Ce qui est essentiellement ce que j'ai:Laisser une nouvelle page PHP connaître une nouvelle valeur POST est un tableau?

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

Mais je suis simplement donné "Avertissement: Invalid argument supplied for foreach() dans /home/cut/mg299/public_html/PHP/invoice.php la ligne 17". Le tableau fonctionne bien, comme je peux itérer sur la page précédente, et d'autres valeurs sont bien analysées sur cette deuxième page. Dois-je besoin de «réinitialiser» cette valeur de tableau?

+0

Que signifie '$ item_list' ressembler quand il est écrit sur le terrain de forme? –

+0

Il obtient seulement le tableau parce que faisant un écho (ou, n'importe quoi essayant de convertir un tableau en chaîne) fait "Array" être retourné et imprimé.Essayez ceci pour voir: '$ arr = array (1, 2, 3); echo 'arr est:'. $ arr; ' – Tarka

Répondre

3

Utilisez serialize() et base64_encode():

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

et et 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() convertit votre tableau en une chaîne. base64_encode() encode cette chaîne pour la sécuriser pour la transmission via HTTP. Peut-être que cela fonctionne sans cela, mais mieux vaut être prudent. En outre, votre tableau devient un peu obscurci.

Mise à jour:

En fait, je viens de remarquer que sérialisation un tableau contenant des chaînes par exemple array('foo', 'bar') dans a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}.
Pour insérer cela correctement pour 'value="' . serialized_value . '"' vous devez encoder, sinon le résultat sera sali avec les guillemets doubles ":

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

Mise à jour 2: Tom a fait un bon point en ce qui concerne la sécurité. Vous ne pouvez pas vous assurer que $_POST['price_list'] contient les valeurs que vous avez fournies. Ils pourraient être trafiqués par un attaquant.
Pour vous assurer que les données sont valides, vous pouvez PREPEND une sorte de clé secrète:

$secret_key = base64_encode('secret'); 

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

et plus tard:

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

Bien sûr, cela peut être encore améliorée, mais devrait donner le droit idée.

+0

Ces commentaires m'ont aidé à comprendre le problème qui se passe (c'est-à-dire que le tableau est écrit comme une chaîne de" tableau "). J'ai tenté de sérialiser puis de désérialiser la valeur, mais l'erreur suivante est générée: "Remarque: unserialize() [fonction.unserialize]: erreur au décalage 0 de 3 octets dans/home/cut/mg299/public_html/PHP/invoice.php on line 16 " Qu'est-ce qui causerait cela? – Wintermute

+1

Je me méfierais des données soumises par l'utilisateur unserializing(). un utilisateur malveillant serait alors capable d'instancier des objets arbitraires sur le serveur, ce qui pourrait vous causer un problème, même si cela est peu probable. –

+0

@Wintermute: Que contient votre tableau? –

2

Si l'impression sur votre tableau sort juste "Array", alors je pense que c'est comme ça qu'il est écrit dans le champ caché. Essayez d'afficher la source et voyez comment cela est rendu au navigateur. Si c'est le cas, vous aurez besoin d'une méthode de sérialisation et de désérialisation du tableau.

1

'

que vous pourriez essayer:

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