這是控制器的add方法
public function add(){ //驗證有效性 $this->load->library('form_validation'); //設定規則 $this->form_validation->set_rules('title', '標題', 'required|max_length[10]'); $this->form_validation->set_rules('content', '內容', 'required|max_length[150]'); if ($this->form_validation->run() == false){ $this->load->view('admin/blogc/add'); }else{ //進行資料插入 $this->load->model('blogm','bm'); $this->bm->insert(); redirect('admin/blogc/add'); } }
這是視圖的
問題
為什麼我第一次直接在瀏覽器中打入 index.php/admin/blog_c/add?
他走的是 $this->load->view('admin/blogc/add');
如果走這個說明他預設是false 但是如果是falsed第一次為什麼不出現使用者名稱不可為空 而是要提交才觸發了 求大神解釋
回複內容:
這是控制器的add方法
public function add(){ //驗證有效性 $this->load->library('form_validation'); //設定規則 $this->form_validation->set_rules('title', '標題', 'required|max_length[10]'); $this->form_validation->set_rules('content', '內容', 'required|max_length[150]'); if ($this->form_validation->run() == false){ $this->load->view('admin/blogc/add'); }else{ //進行資料插入 $this->load->model('blogm','bm'); $this->bm->insert(); redirect('admin/blogc/add'); } }
這是視圖的
問題
為什麼我第一次直接在瀏覽器中打入 index.php/admin/blog_c/add?
他走的是 $this->load->view('admin/blogc/add');
如果走這個說明他預設是false 但是如果是falsed第一次為什麼不出現使用者名稱不可為空 而是要提交才觸發了 求大神解釋
我來回答這個問題,第一次開啟肯定是載入你這個模板,為什嗎?因為你第一次開啟的時候沒有提交title和content這兩個資料上來,在這裡的驗證規則:
$this->form_validation->set_rules('title', '標題', 'required|max_length[10]');$this->form_validation->set_rules('content', '內容', 'required|max_length[150]');
裡面有個required的驗證規則,意思是不為空白,那麼你第一次載入這個add方法的時候,什麼資料都沒提交肯定為空白,所以
$this->form_validation->run()
執行這個得到的結果為false,自然就是載入了admin/blogc/add這個模板。
而你這個使用者名稱不為空白或者是為空白的這個提示跟這個函數
form_error();
以及驗證的類form_validation有關,如果第一次驗證沒通過但是沒有顯示出錯的話;那麼分析其代碼應該是:
form_validation這個驗證類驗證的是post提交上來的資料,而第一次壓根都沒提交,所以雖然為false,但是根本沒有擷取到資料,所以不報錯。也就是說當你第二次提交空的時候,利用$_POST['title']或者$_POST['content']擷取到有title和content提交,但是為空白。但第一次get載入的時候,擷取$_POST['title']或者是$_POST['content']根本都不存在,所以也沒法去驗證,直接返回false。如果要驗證我這個猜想對不對,你自己去看validation驗證類的原始碼就一目瞭然。不過我的想法是八九不離十了。
結尾補充個例子說明
比如我叫你去吃飯,看到有兩碗飯你才吃,看到有一碗飯你不吃,但是假設你去看到的是兩個空碗,你怎麼吃?這裡就是所謂的第一次載入啥都沒有,但是會返回false;你看到兩碗你才吃,看到一碗你不吃,看到兩碗你才吃,這是飯存在的情況下,為空白提交就相當於是一碗飯,驗證不通過,報false,然後提示錯誤原因,而第一次沒有飯的情況根本就沒考慮到,所以雖然是不吃,但是沒錯可報,就這麼回事。當然,你可以把飯換成屎來增加印象。
因為你第一次開啟是 get請求,第二次是post請求。
恰恰相反,CI的確預設只能驗證post請求,run()方法的第一段這麼寫的:
// Do we even have any data to process? Mm?$validation_array = empty($this->validation_data) ? $_POST : $this->validation_data;if (count($validation_array) === 0){ return FALSE;}
那麼,我們可以在$this->validation_data上做文章,實際上CI提供了public function set_data(array $data)方法手動增加需要驗證的資料:
public function set_data(array $data) { if ( ! empty($data)) { $this->validation_data = $data; } return $this; }
還是我的那句話:你第一次開啟這個網址時是 get請求,第二次是post請求。而預設只會對post請求驗證,除非你手動調用set_data()方法。
CI的這個驗證,確實和常規的不同,正常都是先判斷是不是post請求,然後再驗證,而ci不需要,他預設是如果沒有_POST請求資料則驗證雖然為false但錯誤資訊為空白,注意這裡錯誤資訊為空白,而不是提示參數不存在什麼的。所以會出現你說的情況。