2010-07-23 87 views
1

最好的做法是什麼?PHP發送HTTP_POST_VARS到另一個頁面?

會話?我怎樣才能把我在1頁定義的所有變量發送給另一個頁面。

我使用serialize讀取將HTTP_POST_VARS轉換爲一個字符串,然後通過(使用隱藏的表單/輸入?)並在另一個PHP頁面上使用反序列化來獲取變量。

而且我看見有人剛剛使用類似:

<?php 
foreach($HTTP_POST_VARS as $key => $val) { 
?> 
<input type="hidden" name="<?php echo $key; ?>" value="<?php echo $val; ?>"> 
<?php 
} 
?> 

這似乎醜陋,自找麻煩。


基本上,這是運行的是什麼我試圖做下來:

用戶填寫表單,然後提交表單的所有信息,多數民衆贊成必需的。第二個頁面攔截所有HTTP_POST_VARS,然後定義更多變量。詢問用戶信息是否正確,並詢問他們是否想提交所有信息。到目前爲止,我已經得到了這一點。現在我想要一個按鈕/鏈接,用戶點擊它,然後將頁面2中的所有信息發送到另一個頁面,最終運行代碼處理所有信息。 (MYSQL,EMAILS等)

我的理想解決方案就是能夠定義像onclick這樣的東西,我可以隨心所欲地運行一個PHP函數,但這並不存在。有一件事是我想確保信息發佈/推送/任何第3頁(處理),它的合法性,實際上來自第2頁(確認)......我不希望人們隨意製作HTTP POST並驗證它。我想用一個密鑰來運行某種MD5的東西來驗證。

有沒有人有第1部分(填寫),第2部分(確認給用戶)和第3部分(處理來自第2部分的所有信息)的表格的優雅解決方案。

+7

'$ HTTP_POST_VARS'是舊的,冗長,不推薦使用。改用['$ _POST'](http://www.php.net/manual/en/reserved.variables.post.php)。只是在說'。 – BoltClock 2010-07-23 20:54:12

回答

1

我將在首次提交後在會話變量的值存儲,然後確認/驗證後,相應地使用它們:

<?php 

///////////////////////////////// 
// STEP 1 - Initial Form Display 
///////////////////////////////// 

session_start(); 
echo '<form>'; 
echo '<input type="text" name="usr_name" />'; 
echo '<input type="text" name="usr_phone" />'; 
echo '<input type="text" name="invalid_field" />'; 
echo '<input type="submit" name="submit" value="Submit" />'; 
echo '</form>'; 

///////////////////////////////// 
// STEP 2 - Confirmation Page 
///////////////////////////////// 

// change this by your global of choice ($_POST, $_GET, $_REQUEST) 
$input_source &= $_GET; 
// create an array of all input fields that start with 'usr_' 
$input_fields = @preg_grep('#^usr_[a-z]+#i', array_keys($input_source)); 
if(!empty($input_fields)) 
{ 
    // store all valid input fields in the session 
    $_SESSION['input_values'] = array(); 
    foreach($input_fields as $key) 
    { 
     $_SESSION['input_values'][$key] = $input_source[$key]; 
    } 

    // create a checksum from the user's IP address and all input values (for false sense of security ^_^) 
    $_SESSION['input_checksum'] = md5($_SERVER['REMOTE_ADDR'] . '|' . join('', $_SESSION['input_values'])); 

    // logic for data validation and confirmation HTML goes here... 
} 

///////////////////////////////// 
// STEP 3 - Final Validation 
///////////////////////////////// 

// check for the existence of the session values from step 2 
if(!empty($_SESSION['input_values']) && !empty($_SESSION['input_checksum'])) 
{ 
    // create comparison checksum for validation purposes 
    $_comp_checksum = md5($_SERVER['REMOTE_ADDR'] . '|' . join('', $_SESSION['input_values'])); 

    // check session and comparisson checksums 
    if($_SESSION['input_checksum'] == $_comp_checksum) 
    { 
     // confirmation/validation looks good, proceed... 
    } 
} 

?> 
0

我通常只是把一切都變成Session變量後,我已經驗證的信息。我一直對這方面的運氣一直很好,因爲通常沒有很多用戶信息,比如你說的開銷真的不是很糟糕。現在,如果您正在談論大量數據,那麼您可能需要考慮一種不同的方法。

就像我說的,這可能不是最優雅的解決方案,但它肯定會起作用。

+0

是的,我想盡可能多,但我無法找到任何快速和骯髒的例子,如何進行會話,並只存儲所有聲明的變量。有23個變量我想通過,我想我可以只聲明他們23次,但一段時間看起來不錯。 – ParoX 2010-07-23 21:13:24

0

醜陋而煩惱?我認爲你正在做某件事。

理想情況下,您可以將先前輸入的數據存儲在將數據存儲在服務器上的會話狀態中。

或者,如果需要將狀態存儲在瀏覽器頁面中,則可以使用您提到的方法,或者可以更像微軟的「查看狀態」變量。基本上,你需要序列化你的數據,也許是加密和/或簽名結果,然後base64對整個代碼進行編碼並將結果粘貼到頁面上的隱藏變量中。這樣做的好處包括:(a)不會使用舊變量名稱污染名稱空間,(b)不會混淆表單填充插件和實用程序,(c)防篡改變量存儲(尤其是加密或簽名)。

相關問題