ci架構中驗證表單類

來源:互聯網
上載者:User
關鍵字 php

這是控制器的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但錯誤資訊為空白,注意這裡錯誤資訊為空白,而不是提示參數不存在什麼的。所以會出現你說的情況。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.