2011-06-04 88 views
1

我想學習與codeigniter的PHP,遇到了問題。我正在寫一個帶有表單驗證的用戶註冊表單。 如果用戶輸入已通過驗證,它將檢查數據庫中電子郵件是否已存在於數據庫中。如果存在,它應該向用戶顯示一個錯誤。 我將這個錯誤存儲在flashdata會話變量中,並將用戶重定向到註冊表單。但重定向後,表單set_values是空的。 我希望它填入用戶之前已經填寫的值。如果我使用$this->load->view('registration_form') ..字段值填充像我想要的,但數據庫錯誤不顯示,因爲它不是一個新的服務器調用。Codeigniter使用flashdata和form_validation

form_validation值(set_value())在重定向上消失嗎?如果是這樣,我如何預先填充字段值?

回答

2

如果您在發佈到自身的表單有效時重定向,那麼您會失去set_value(),因爲現在$ _POST數組中沒有任何內容 - 這就是您重定向的原因,因此用戶不會重新提交形式刷新。

你應該做的是在同一個控制器的回調函數中創建你自己的驗證規則。看到這裏http://codeigniter.com/user_guide/libraries/form_validation.html#callbacks

你需要做的是將電子郵件傳遞給回調模型,該模型將檢查電子郵件與數據庫的對應關係,如果它已經存在,則返回false。這樣,如果電子郵件已存在,您的表單將無效並且不會重定向。

+0

是的,這就是我最終做的。 – WebNovice 2011-06-04 18:50:24

1

我只是在幾分鐘前將一個窗體添加到舊的CI安裝中,並且出現此問題。你應該提到它很有趣。

由於set_value()及相關函數只讀取$_POST數據,所以刷新後它們不會保留該值。你有幾個選擇:

  1. 不要重定向,直到表單有效。
  2. 分配$_POST陣列到flashdata(會話)變量,和重定向
  3. 自己寫的功能組與任一flashdata或會話數據或其它的方法來處理這後手動將其複製到$_POST陣列,和Don不使用set_value()函數。

爲了最快速的修復,請使用#1。我不喜歡手動設置$_POST的值,所以我並不真正支持#2,但它應該起作用。從長遠來看 - 使用#3。我發現CI表單處理通常是缺乏的,而且我的個人表單交互代碼庫已經隨着時間的推移而增長很多。

+0

如果我做#1,flashdata將不包含錯誤消息,是嗎?那麼在數據庫檢查之後,我可能需要將錯誤存儲在一個變量中並顯示它。順便提一下,在發佈問題後,我讀了一些關於form_validation中的回調函數。 例如:$ this-> form_validation-> set_rules('email','電子郵件地址','required | valid_email | callback_username_check');你有沒有使用它?如果是這樣,這樣做是個好主意嗎? – WebNovice 2011-06-04 12:34:33

+0

@DamcheyLhendup:如果您已經將錯誤分配給flashdata,它將不會受到影響(但它不會自動爲您執行此操作)。回調函數確實適用於檢查用戶是否存在 - 我會推薦它。沒有看到你是如何設置的,很難給你具體的建議,但總的來說,解決方案#1是我該做的。 – 2011-06-04 12:43:07

相關問題