2011-03-04 53 views
1

我有一個基本的PHP表單頁面,其中包含大量的數據,一旦全部完成,這些數據將被保存到MySql中的大約4-5個不同的表中。由於構建這個保存例程需要一點PHP,我希望POST操作不是指向PHP_SELF,而是指向一個單獨的PHP文件進行處理。PHP表單處理器錯誤傳遞

當諸如電話號碼,電子郵件,郵政編碼等所有常規數據之前將被傳遞到處理器腳本,如果是由處理器返回一個錯誤提交驗證...

什麼是在保持數據輸入的同時指向原始表單頁面(HTTP_REFERER)的最佳實踐方式?

<?php 
    if (isset($_POST['date']) && ($_SERVER['HTTP_REFERER'] == "form.php")) 
    { 
      $errors = false; 

      //attempt to put data in database 

      if ($errors) 
      { 
       //Pass back to the form.php page with error message and all data intact 
      } 
    } 
?> 

回答

1

我以前也碰到過這樣的問題,我們如何解決,這是把所有的字段到一個會話,然後重定向到形成.php使用標題(「Location:form。php「);

當數據發佈到表單時,我們將$ _REQUEST存儲到$ _SESSION ['post'];如果驗證失敗,我們將它發送回表單,填充字段並取消設置該會話。

因此,例如

$_SESSION['post']['field_a'] = $_REQUEST['field_a']; 
$_SESSION['post']['field_b'] = $_REQUEST['field_b']; 

用一些花哨的命名約定,你可以循環這使它容易。

,那麼這個表單頁面上,我們只是檢查,看看是否有一些數據,或只是回顯數據,無論如何。

$str_field_a = @$_SESSION['post']['field_a']; 
... 
<input name="field_a" value="<?php echo $str_field_a; ?>" /> 
... 
unset($_SESSION['post']); 

這可能是一種混亂的做法,但它已被證明對我們的目的有效。只是想我會分享。

+0

我從別人那裏聽說過這個,但是想知道這是否被認爲是最佳做法。這是骯髒的,但它確實完成了工作......雖然效率是關鍵。 – Jeff 2011-03-04 04:54:42

+1

我們之所以選擇這種方式有很多原因。讓java腳本強制提交重定向將允許用戶點擊後退按鈕並可能導致一些錯誤。由於我們有超過60個字段的數據,GET方法並不是非常優化的。唯一可用的方法是暫時保留它。我同意,這是一個混亂的方式,但到目前爲止還沒有任何問題。這實際上取決於個人意見和您面臨的選擇。 – Dave 2011-03-04 05:00:12

+0

感謝您在javascript上的推理 - 我沒有考慮過使用它的原因,而不是提交按鈕。 – Jeff 2011-03-04 05:02:25

0

我認爲你可以做,使用錯誤的數組:

窗體頁:

<form action="processor.php" action="post"> 
<!-- lots of fields --> 
<input type="submit" id="submitButton" name="Save" value="Save" /> 
</form> 

Processor頁面。

  1. 設置錯誤標誌爲false(如果發生錯誤,則將其設置爲true,因此不在數據庫中存儲)。

  2. 檢查元件1,如果錯誤,則其存儲在陣列$error['name'] = 'value'

  3. 類似地檢查所有的元件,並且使用相同的程序存儲。

  4. 在結束時,如果錯誤標誌設置爲false不要在數據庫中存儲和(如果在同一頁面上,你將能夠訪問要顯示的錯誤消息上的形式排列。)

    if(isset($error['elementname'])) echo $error['elementname']; 
    

頁面下方。

但是,最好的方法是使用面向對象的方法。

[更新]

  1. storing php objects on html form element and passing php objects through GET method?

  2. how to send redirect page pass variables as post variables from a php script

而且我想,在會話中存儲整個對象不會是一個不錯的辦法

+0

我的問題不在於如何將錯誤收集到某種數組或StdObject中,而是如何正確地將數據傳回HTTP_REFERER頁面以允許用戶更正錯誤並重新提交而無需重新輸入數據。 – Jeff 2011-03-04 04:42:23

+0

@Jeff你知道你可以通過'GET','POST'和'SESSION'傳遞數據。我想'GET'將是優雅的(但非常不安全)。和'POST'將是簡單的(如果在同一頁面上)。和'SESSION'將是最糟糕的一個 – 2011-03-04 04:47:18

+0

正確 - 它將被存儲在POST中的可能性更大 - 但是如何處理髮送頁面控制回到處理器的form.php頁面的邏輯?你是否簡單地接受了收到的POST,並在$ _POST ['error']上添加一個新項目並將其提交回form.php頁面以重新提交?如果是這樣 - 你有一個快速的例子嗎? – Jeff 2011-03-04 05:00:58

0

我會發一個帖子回form.php包含錯誤rs和值。我在我的個人項目中使用了相同的方法。

if ($errors) { 
    ?><form action="form.php" method="post" name="error"> 
    <input type="hidden" name="errcode" value="<?php echo $errorcodes; /*or whatever message*/ ?>" /> 
    <input type="hidden" name="anotherdata" value="anothervalue" /> 
    <?php /*you can add all post datas here as hidden field*/ ?> 
    </form> 
    <script type="text/javascript">document.error.submit();</script><?php 
} 

這是類似於我form.php的

//first I set default blank variables for form 
$formvalue=""; 
$formnumericvalue=""; 
//i set them, yay! 

//if I get values from post.php, I update the values 
if (isset($_POST['iserror'])) { //you can either echo a error message or update current data here, I'm showing this for both 
    $formvalue=$_POST['formvalue'];//don't forget to validate these! 
    $formnumericvalue=$_POST['formnumericvalue']; //don't forget to validate these! 
} 
//I also do this method for edit forms 

//and finally I show the form 
?> 
<form name="form" method="post" action="post.php"> 
    <input type="text" name="formvalue" value="<?php echo $formvalue; ?>" /> 
</form> 
+0

我想我不會關注。是表單頁面還是form_processor的頂級代碼片段?如果來自表單頁面,那麼它的引用與PHP_SELF相同,我試圖遠離賦予腳本的本質。如果從你的form_processor中,你爲什麼要重新插入一個新的表單對象,該對象指向帶有隱藏字段的原始表單? – Jeff 2011-03-04 04:57:42

+0

頂級代碼位於processor.php中。如果你發現錯誤,你可以像我寫的代碼一樣將值發送回form.php。即將數據提交回form.php(或不同的頁面),以便人員進行更正並重新提交(它只是將提交的數據發送回form.php)。我插入它是因爲您將表單操作設置爲不同的頁面。如果它們都在同一頁面中,則不需要製作

。要麼你只設置一個數據,包括錯誤信息或發送所有表單數據,這樣提交者只能找到他/她的錯誤並修復它們。 – Arda 2011-03-04 05:02:05