2013-01-01 43 views
3

我有大約70個輸入字段的大表單,並且在表單中有可以創建其他輸入字段的按鈕。我的問題是,如果服務器上的某些內容在提交表單時出錯,如數據庫插入失敗,我該如何保留這些輸入字段及其值?我有動態驗證,但如果提交時出現錯誤怎麼辦?如何在數據庫失敗時保留動態創建的輸入字段值?

+0

嗯,因爲只有你知道你的形式最好的,你覺得呢?可以做些什麼來解決這個問題?如果在數據庫操作成功之前您不會首先銷燬表單?允許用戶在失敗的情況下重試提交數據? – hakre

+0

所以,你想說使用ajax後? – u54r

+0

我沒有讀過您使用javascript來動態構建表單的問題。最簡單的做法是將它轉換爲ajax請求,然後用jquery提交,而且我認爲你會這樣做。如果你還沒有這樣做,我建議你改變它,因爲這是一個非常簡單的方法來處理這個問題。 – hakre

回答

4

您有很多選擇。

  1. 你可以使用AJAX來發表您的形式,如果成功,則重定向到一個新的頁面,或提醒用戶,如果沒有(簡單!)
  2. 你可以從後重建從服務器端變量(更復雜的形式)
  3. 服務器可能在失敗時發送表單值,並且您可以編寫JS來重新創建表單(如果您已經有JS來管理表單,可能會很容易)。
  4. 您可以將表單的實際HTML與表單值一起傳遞,並讓服務器使用它來重新創建表單(根據您掛鉤的方式,您可能會失去JS事件,而不是通常的最佳選項)。

還有很多不太有用的選項。我會推薦#1。

+1

我也在考慮做一個阿賈克斯帖子。我認爲這是最好和最簡單的方法。 – u54r

1

對於一個真正簡單的解決方案:

您可以將值存儲在一個對象,只有當你已經有了一個證實DB插入清除它。如果插入失敗,您可以重試幾次,如果重複失敗,可以將值寫入CSV日誌文件以手動處理。

更復雜的解決方案

隊列。讓所有插入請求都使用Zend Jobserver,RabbitMQ或Gearman將隊列放入作業隊列中。然後創建一個工作進程以在隊列的另一端運行插入。這將允許您重新運行/重試失敗的作業。

+0

這是您認爲最好的方法嗎? – u54r

+0

@ u54r您是否需要在用戶體驗之後立即提供這些值,或者只是表單/數據收集的形式(您不需要以絕對實時方式訪問)? – Ray

+0

如果您的數據庫提交失敗,則使用完全相同的數據重試不可能在大多數情況下解決此問題。 99%的時間將是無效輸入。 – Levi

0

爲什麼在單個頁面上有這麼多字段?我會重新考慮這樣做。無論如何,如果您有服務器端驗證,並且失敗,您可以設置頁面,讓每個字段使用基於發送到服務器的發佈值的默認值...因此,只需將它們發回到同一頁面並將輸入字段值設置爲後期值。

這裏是一個例子。

$username = array(
          'name'  => 'username', 
          'id'   => 'username', 
          'maxlength' => '255', 
          'size'  => '28', 
          'title'    => 'username is required.', 
          'class'  => 'form-text required', 
          'value' => $this->input->post('username'), 
         ); 
<?php echo form_input($username); ?> 
+0

該表單用於創建提案。提供給客戶的產品有很多變量。我不認爲你的方法是最好的解決方案,因爲有多維數組,並找出哪些是繁瑣和壓倒性的。 – u54r

+0

如果您發佈表單並且所有內容都有名稱,您只需抓取相同名稱的表單值並設置該值即可。如果存在,它會被設置。如果不存在,則爲空字符串。我能看到的唯一更好的解決方案是ajaxForm。但是這需要對後端代碼進行適當的修改。 – miex

+0

正如我所說的,有一些動態創建的表單元素,例如name []可以在表單中反覆創建。你的方法效率低下。 – u54r

0

這裏有一對夫婦的功能,你可以用它來形式值存儲在一個會話:

//save form inputs 
    function Hold_Form_Input() 
     { 
     $FormPost = array(); 
      foreach ($_POST as $key => $entry) 
       { 
        $FormPost[''.$key.'']= $entry; 
       } 
     $_SESSION['post_form']= $FormPost;   
     } 
    //Clear form values upon success 
    function Clear_Form_Input() 
     { 
      if (isset($_SESSION['post_form'])) 
       { 
        unset($_SESSION['post_form']); 
       return true; 
       } 
      return false; 
     } 

//Reprint form values as needed 
    function Keep_on_error($fieldname) 
     { 
      if(isset($_SESSION['post_form']) && strlen($_SESSION['post_form'][$fieldname]) > 0) 
       { 
        $fill = $_SESSION['post_form'][$fieldname]; 
        return $fill; 
       } 
      return false; 
     } 
相關問題