2016-11-22 138 views
1

我有以下陣列和形式page1.php中:傳遞一個陣列到另一個頁面(表格)

$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>"; 

在我想要的print_r數組中則page2.php:

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

print_r($passed_array); 

爲什麼我無法在第2頁上收到my_array?我看不到我犯的錯誤!

PS:我在第2頁收到ID

+0

不要'unserialize()'用戶提供的數據。它可能允許用戶對您的網站執行任意代碼。有關信息,請參閱https://www.notsosecure.com/remote-code-execution-via-php-unserialize/。如果你必須在這個 –

回答

3

我很高興@ksealey指出了一個更恰當的方法來做這件事,但爲了回答這個問題......它不起作用的原因是單獨使用序列化不足以防止無效HTML。看的連載樹葉在HTML什麼結果:

enter image description here

,所以你需要確保你生成HTML是有效的。您可以使用編碼一樣的base64生產安全HTML:

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

那麼你可以解碼只需添加到您的輸出:

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

感謝@WEBjuju的解決方案en的解釋。它現在工作:) –

+0

這是個好消息。儘管如此,確保開始使用_SESSION。它會讓你變成肥沃的新土壤並避免很多問題。如果沒有理由改變這個陣列,不要讓他們有機會改變它。 – WEBjuju

2

如果從頁面傳遞到頁面使用會話

<?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); 

我會說的第一個答案是更安全的數據。

+1

這樣的頁面之間傳遞數據,你最好'json_encode()'和'json_decode()'謝謝@ksealey的解釋。這是有用的:) –

0

這是你的第一頁生成的HTML:

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

一個簡單的解決辦法是在

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

用單引號替換您的雙引號像這樣:

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

或者你可以在你的序列化數組中跳過這樣的引號:

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

我只想補充我的2美分這裏:)

您可能想要使用某種框架,因爲這樣會緩解這種情況下的工作(或類似情況)。例如用笨框架,你可以有將數據發送到控制器和控制器,你可以只抓住整個陣列作爲這樣一種形式(視圖):

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

所以視圖:

<?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)."" /> 

控制器:

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