2016-11-22 1 views
1

Ich habe folgendes Array und Form auf page1.php:Ein Array auf eine andere Seite (Form)

$my_array = array("Volvo", "BMW", "Toyota"); 

echo " <form id=\"my_form\" action=\"page2.php\" method=\"post\" enctype=\"multipart/form-data\"> 
<input type=\"hidden\" name=\"id\" value=\"10\"> 
<input type=\"hidden\" name=\"input_name\" value=\"".serialize($my_array)."\" /> 

<a href=\"javascript:{}\" onclick=\"document.getElementById('my_form').submit(); return false;\">Send</a> </form>"; 

Auf der page2.php ich das Array print_r wollen:

$id = $_POST['id']; 
$passed_array = unserialize($_POST['input_name']); 

print_r($passed_array); 

Warum kann ich my_array nicht auf Seite2 empfangen? Ich kann den Fehler nicht sehen, den ich gemacht habe!

PS: Ich erhielt id auf page2.

+0

Die vom Benutzer bereitgestellten Daten nicht 'deserialize()'.Es kann Benutzern erlauben, beliebigen Code gegen Ihre Website auszuführen. Siehe https://www.notsosecure.com/remote-code-execution-via-php-unserialize/ für Informationen. Sie würden besser zu 'json_encode()' und 'json_decode()' es tun, wenn Sie Daten zwischen solchen Seiten übergeben müssen –

Antwort

3

Ich bin froh, dass @ksealey auf eine angemessenere Methode hingewiesen hat, aber um die Frage zu beantworten ... der Grund, warum es nicht funktioniert, ist, dass die Serialisierung allein nicht ausreicht, um das Ungültige zu verhindern html. siehe Ergebnis dessen, was die serialize Blätter im html:

enter image description here

so müssen Sie sicher sein, das html Sie produzieren gültig ist. Sie könnten Codierung wie base64 verwenden, um sicher html zu produzieren:

echo " <form id=\"my_form\" action=\"\" method=\"post\""; 
echo "enctype=\"multipart/form-data\">"; 
echo "<input type=\"hidden\" name=\"id\" value=\"10\">"; 
echo "<input type=\"hidden\" name=\"input_name\" "; 

echo "value=\"".base64_encode(serialize($my_array))."\" />"; 

enter image description here

dann können Sie nur die Decodierung Ihrer Ausgabe hinzu:

$passed_array = unserialize(base64_decode($_POST['input_name'])); 
print_r($passed_array); 
+0

Danke @WEBjuju für die Lösung en für die Erklärung. Es funktioniert für jetzt :) –

+0

das ist eine gute Nachricht. Stelle sicher, dass du _SESSION dafür verwendest. es wird dich in fruchtbaren, neuen Boden brechen und viele Probleme vermeiden. Wenn es keinen Grund gibt, dieses Array zu verändern, lassen Sie es nicht zu, dass es verändert wird. – WEBjuju

2

Wenn es Daten von einer Seite zur nächsten weitergegeben werden verwenden, um eine Sitzung

<?php 
//Page 1 
session_start(); 
$value = 'Value from page 1'; 
$_SESSION['page_1_value'] = $value; 
?> 


<?php 
//Page 2 
session_start(); 
echo 'Value from page 1: '.$_SESSION['page_1_value']; 
$_SESSION = array(); //If you want to wipe the session data after 


OR, pass as value params that get cleaned, JSON object maybe? 

<form id="my_form" action="page2.php" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="id" value="10"> 
    <input type="hidden" name="input_name" value="<?php echo json_encode($my_array); ?>" /> 
    <a href="javascript:{}" onclick="document.getElementById('my_form').submit(); return false;">Send</a 
</form> 

<?php 
//Page 2 
$object = json_decode(strip_tags(stripslashes($_POST['input_name']))); 
var_dump($object); 

Ich werde sagen, die erste Antwort sicherer ist.

+1

Danke @ksealey für die Erklärung. Es ist nützlich :) –

0

Dies ist der HTML-Code, die erste Seite generiert:

<input type="hidden" name="input_name" value="a:3:{i:0;s:5:" volvo";i:1;s:3:"bmw";i:2;s:6:"toyota";}"=""> 

Eine einfache Lösung wäre, um Ihre doppelten Anführungszeichen in

value=\"".serialize($my_array)."\" 

mit einfachen Anführungszeichen zu ersetzen, so:

value='" . serialize($my_array) . "' 

oder Sie können die Anführungszeichen in Ihrem serialisierten Array wie folgt:

0

Ich werde einfach hier meine 2 Cent hinzufügen :)

Sie möchten vielleicht ein Framework von einer Art verwenden, wie dies den Job für Sie viel mit solchen Situationen (oder ähnlichem) erleichtern wird. Zum Beispiel mit Codeigniter Rahmen könnte man eine Form (Ansicht), die Daten an die Steuerung und Controller sendet könnten Sie einfach das gesamte Array greifen wie so:

$data = $this->input->post('array'); 
$data[0] should == 'Volvo' 

So Ansicht:

<?php $my_array = array("Volvo", "BMW", "Toyota"); ?> 
<form id="my_form" action="<?php echo site_url(controller_name/controller_function)" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="id" value="10"> 
    <input type="hidden" name="input_name" value="".serialize($my_array)."" /> 

Controller:

public function foo() { 
    $data = $this->input->post('array'); 
    for($i=0; $i<sizeof($data); $i++) { 
     echo $data[$i]; 
    }  
} 
Verwandte Themen