這個類庫已經(jīng)廢棄掉了。鼓勵使用 form_validation 類庫。
表單驗證
在解釋CodeIgniter的數(shù)據(jù)驗證前,讓我們先描述下理想情況:
- 顯示一個表單;
- 你填寫文字并點擊提交按鈕;
- 如果你提交的東西是殘缺的,又或者漏填了必須填寫的項,表單重新顯示并包含你提交數(shù)據(jù)的一條錯誤信息;
- 這個過程繼續(xù),直到你提交了正確的信息
在這個過程中,程序必須:
- 檢查必須的數(shù)據(jù)。
- 校驗數(shù)據(jù)的格式是否正確,是否符合標(biāo)準(比如,如果提交用戶名,那么必須只能包含有效的字符。必須有最小的長度,并且不能超過允許的長度。 用戶名不可以與已有用戶名重復(fù),或者不能為保留字,等等。 Etc.)
- 處理數(shù)據(jù)使之更安全。
- 需要的情況下預(yù)格式化數(shù)據(jù)(數(shù)據(jù)需要進行剪裁,HTML格式化?等等)。
- 準備數(shù)據(jù),寫入數(shù)據(jù)庫。
盡管上面的過程沒有什么復(fù)雜的地方,但這通常需要一定數(shù)量的代碼來提交錯誤信息,各種控制結(jié)構(gòu)放置在HTML文件里。 創(chuàng)建簡單表單驗證,代碼通常會非常凌亂而效能地下。
CodeIgniter提供了一個全面的解決框架,真正的精簡你需要寫的代碼數(shù)量。當(dāng)然也可以從你的HTML表單中分離出控制結(jié)構(gòu),使得它成為干凈而靈活的代碼。預(yù)覽
為了能使用CodeIgniter的表單驗證功能,你需要做以下三件事情:
- 一個包含表單的 視圖 文件。
- 一個包含提交“成功”信息的視圖文件。
- 一個控制器函數(shù),用來接受和處理提交的數(shù)據(jù)。
讓我們創(chuàng)建這三個事件,使用注冊表單作為樣例:
表單頁
使用一個文本編輯器,創(chuàng)建一個名叫myform.php的文件。在文中寫入如下代碼并保存到applications/views/ 文件夾下:
成功頁
使用一個文本編輯器,創(chuàng)建一個名叫 formsuccess.php的文件。在文中寫入如下代碼并保存到applications/views/ 文件夾下:
控制器頁
使用一個文本編輯器,創(chuàng)建一個名叫 form.php的文件。在文中寫入如下代碼并保存到applications/controllers/ 文件夾下:
試一試!
用與下面相似的URL地址測試下你的表單:
example.com/index.php/form/
如果你提交了表單,你會發(fā)現(xiàn)表單重載了。那是因為你還沒有設(shè)置任何驗證條件,這就是我們接下來要做的。
說明:
你會注意到一些關(guān)于上面頁面的事情:
那個 頁面 (myform.php) 是一個除了兩個例外的標(biāo)準頁面:
- 它使用一個表單助手 來創(chuàng)建表單to create the form opening. 從技術(shù)上講,這是沒有必要的。你可以用標(biāo)準的HTML來創(chuàng)建表單。然而,使用這個助手的好處在于: 它為你生成了一個段URL,就是你在CONFIG文件里定義的那個。這使得你的程序在修改時可以更簡單和靈活。
- 在表單的頂部,你會注意到一下的不同點:
<?php echo $this->validation->error_string; ?>
驗證類會使用這個變量返回并顯示一些錯誤信息。如果沒有信息將沒有返回值。
這個控制器 (form.php) 有一個函數(shù): index(). 這個函數(shù)初始化驗證類并加載你的視圖文件需要使用的 form helper 和 URL helper 。 當(dāng)然也 運行 驗證過程。這取決于驗證是否成功,既不顯示表單也沒有返回成功信息。
如果還沒有告訴驗證類使之生效的信息,它會一直返回“FALSE”(布爾值 FALSE)作為默認值。如果數(shù)據(jù)成功地接受你的條件并且它們沒有任何錯誤,那么run() 函數(shù)值返回“TRUE”。
設(shè)置驗證條件
CodeIgniter可以讓你設(shè)置任意數(shù)量的條件來控制給定的范圍,循環(huán),甚至同時它可以讓你準備并預(yù)處理數(shù)據(jù)。讓我們先看看它的用法,我們后面再具體解釋。
在你的控制器 (form.php)里, 僅加入下面的初始化函數(shù):
$rules['username'] = "required";
$rules['password'] = "required";
$rules['passconf'] = "required";
$rules['email'] = "required";
$this->validation->set_rules($rules);
你的控制器現(xiàn)在看起來像下面這樣:
現(xiàn)在提交空白的表單,你將會看到錯誤信息。如果你提交的表單包含有完全正確的信息,你將看到你的成功頁。
注意: 當(dāng)表單數(shù)據(jù)有錯誤時,它不會被重新填充。當(dāng)我們講明驗證規(guī)則后,馬上回來解釋它。
改變出錯信息的樣式
默認情況下,系統(tǒng)會為每個錯誤提示信息添加一個段落的標(biāo)識(<p>)。你可以很容易地通過編碼去改變這些界定符號,在控制器里寫入一下代碼:
$this->validation->set_error_delimiters('<div class="error">', '</div>');
在這個例子中,我們將其改成了 div 標(biāo)簽。
順序編排規(guī)則
CodeIgniter可以讓你把所有的驗證條件有序地串聯(lián)起來。我們來試一下。把你的驗證條件數(shù)據(jù)改成下面的樣子:
$rules['username'] = "required|min_length[5]|max_length[12]";
$rules['password'] = "required|matches[passconf]";
$rules['passconf'] = "required";
$rules['email'] = "required|valid_email";
以上代碼要求如下:
- username區(qū)域要求在5位到12位之間.
- password 區(qū)域必須和 password confirmation 區(qū)域匹配.
- Email 區(qū)域 必須包含一個合法的Email地址.
盡管嘗試下吧!
請注意: 如果你閱讀最后的“規(guī)則參考”(Rule Reference),你會發(fā)現(xiàn)有很多可用的規(guī)則!
準備數(shù)據(jù)
在驗證函數(shù)的基礎(chǔ)上,你可以使用不同的方法準備好你的數(shù)據(jù),例如,你可以建立這樣的規(guī)則:
$rules['username'] = "trim|required|min_length[5]|max_length[12]|xss_clean";
$rules['password'] = "trim|required|matches[passconf]|md5";
$rules['passconf'] = "trim|required";
$rules['email'] = "trim|required|valid_email";
上面的例子中,我們“修剪”內(nèi)容,轉(zhuǎn)換密碼區(qū)域為 MD5 編碼,通過“XSS_CLEAN”函數(shù)檢測用戶名,移除危險的數(shù)據(jù)。
默認的PHP函數(shù)能為一個規(guī)則使用一個參數(shù),像 htmlspecialchars, trim, MD5, 等等.
Note: You will generally want to use the prepping functions after the validation rules so if there is an error, the original data will be shown in the form.
回調(diào)函數(shù):你自己的驗證函數(shù)
驗證系統(tǒng)支持回調(diào)你自己的驗證函數(shù). 這允許你通過擴展驗證類來適應(yīng)自己的需要. 例如, 如果你需要執(zhí)行一個數(shù)據(jù)庫查詢來查看用戶是否選擇了唯一的用戶名,你可以通過創(chuàng)建一個回調(diào)函數(shù)來做這件事. 讓我們創(chuàng)建一個簡單的例子.
在你的控制器中將username規(guī)則改為:
$rules['username'] = "callback_username_check";
然后在你的控制器中添加一個新的函數(shù)叫做 username_check . 你的控制器看起來應(yīng)該像下面的例子:
重新載入表單并以"test"做為用戶名提交. 你可以看到表單中的數(shù)據(jù)已經(jīng)發(fā)送到你的回調(diào)函數(shù)中處理.
要想回調(diào)一個函數(shù)只需在你定義的函數(shù)名前加上一個"callback_"前綴即可.
錯誤消息可以使用 $this->validation->set_message 函數(shù)來設(shè)置. 請牢記消息鍵(第一個參數(shù))必須與您的函數(shù)名相匹配.
注意: 你可以在任何規(guī)則中使用你自定義的錯誤消息, 只需設(shè)置類似的消息. 例如,為"required"規(guī)則改變消息你可以這樣做:
$this->validation->set_message('required', 'Your custom message here');
填充表單
我們花了不少時間處理錯誤?,F(xiàn)在是討論使用數(shù)據(jù)重新填充表單的時候了。這里的做法和你的驗證規(guī)則類似。在你的驗證規(guī)則下面加入如下代碼:
$fields['username'] = 'Username';
$fields['password'] = 'Password';
$fields['passconf'] = 'Password Confirmation';
$fields['email'] = 'Email Address';
$this->validation->set_fields($fields);
數(shù)組的關(guān)鍵字實際上是表單域的名字,對應(yīng)的值是你想要在錯誤信息中顯示的全名。
現(xiàn)在你控制器中的index函數(shù)看起來應(yīng)該像這樣:
現(xiàn)在打開你的視圖文件myform.php,根據(jù)每個表單域的名字更新它們的值。
現(xiàn)在重新加載你的頁面,提交表單并觸發(fā)一個錯誤。你的表單將會被重新填充而且錯誤信息也會包含更多相關(guān)的表單域的名字。
單獨顯示錯誤
如果你想要在每個表單域旁顯示錯誤,而不是顯示一個錯誤列表,你可以像這樣修改你的表單:
如果沒有錯誤,不會顯示任何東西。如果有錯誤發(fā)生,消息將會使用你設(shè)置的分割標(biāo)記顯示(<p> 標(biāo)記是默認值)。
Note: 要這樣顯示錯誤信息,你必須之前使用$this->validation->set_fields
函數(shù)描述。錯誤將會被轉(zhuǎn)換成表單域名加"_error"后綴的變量。例如,你的用戶名錯誤的值可以這樣訪問:
$this->validation->username_error.
規(guī)則參考
下面是可用的原生規(guī)則列表:
Rule | Parameter | Description | Example |
---|---|---|---|
required | No | Returns FALSE if the form element is empty. | |
matches | Yes | Returns FALSE if the form element does not match the one in the parameter. | matches[form_item] |
min_length | Yes | Returns FALSE if the form element is shorter then the parameter value. | min_length[6] |
max_length | Yes | Returns FALSE if the form element is longer then the parameter value. | max_length[12] |
exact_length | Yes | Returns FALSE if the form element is not exactly the parameter value. | exact_length[8] |
alpha | No | Returns FALSE if the form element contains anything other than alphabetical characters. | |
alpha_numeric | No | Returns FALSE if the form element contains anything other than alpha-numeric characters. | |
alpha_dash | No | Returns FALSE if the form element contains anything other than alpha-numeric characters, underscores or dashes. | |
numeric | No | Returns FALSE if the form element contains anything other than numeric characters. | ? |
integer | No | Returns FALSE if the form element contains anything other than an integer. | ? |
valid_email | No | Returns FALSE if the form element does not contain a valid email address. | ? |
is_natural | No | 如果為非整數(shù)(自然數(shù)) 則 Returns FALSE (注意 CI 1.7x版 新增, CI 1.6x不能使用該驗證規(guī)則) | ? |
is_natural_no_zero | No | 如果為非正整數(shù)(自然數(shù)) 則 Returns FALSE (注意 CI 1.7x版 新增, CI 1.6x不能使用該驗證規(guī)則) | ? |
valid_ip | No | Returns FALSE if the supplied IP is not valid. | ? |
valid_base64 | No | Returns FALSE if the supplied string contains anything other than valid Base64 characters. | ? |
Note: 這些規(guī)則也可以像獨立的函數(shù)一樣被調(diào)用。例如:
$this->validation->required($string);
Note: 你也可以使用接受一個參數(shù)的PHP原生函數(shù)。
Prepping Reference
下面是所有可用的預(yù)處理函數(shù)列表
Name | Parameter | Description |
---|---|---|
xss_clean | No | Runs the data through the XSS filtering function, described in the Input Class page. |
prep_for_form | No | Converts special characters so that HTML data can be shown in a form field without breaking it. |
prep_url | No | Adds "http://" to URLs if missing. |
strip_image_tags | No | Strips the HTML from image tags leaving the raw URL. |
encode_php_tags | No | Converts PHP tags to entities. |
Note: 你也可以,使用接收一個參數(shù)的PHP原生函數(shù),例如trim, htmlspecialchars, urldecode,等等。
設(shè)置自定義錯誤信息
所有的原生錯誤信息防止在下面的語言文件中:language/english/validation_lang.php
你可以編輯這個文件,或使用如下函數(shù)設(shè)置你自己的信息。
$this->validation->set_message('rule', 'Error Message');
rule是特定規(guī)則的名字,Error Message是你想要顯示的信息。
處理選擇菜單,單選按鈕,和復(fù)選框
如果你使用了選擇菜單,單選按鈕,和復(fù)選框,你會想在出錯時保持原先的選擇。驗證類有三個函數(shù)幫助你完成這些:
set_select()
允許你顯示和提交時狀態(tài)一致的菜單項。第一個參數(shù)是選擇菜單的名字,第二個參數(shù)必須包含每個選項的值。例如:
<select name="myselect">
<option value="one" <?php echo $this->validation->set_select('myselect', 'one'); ?> >One</option>
<option value="two" <?php echo $this->validation->set_select('myselect', 'two'); ?> >Two</option>
<option value="three" <?php echo $this->validation->set_select('myselect', 'three'); ?> >Three</option>
</select>
set_checkbox()
允許你顯示和提交時狀態(tài)一致的復(fù)選框。第一個參數(shù)是復(fù)選框的名字,第二個參數(shù)必須包含它的值,例如:
<input type="checkbox" name="mycheck" value="1" <?php echo $this->validation->set_checkbox('mycheck', '1'); ?> />
set_radio()
允許你顯示和提交時狀態(tài)一致的單選按鈕。第一個參數(shù)是單選按鈕的名字,第二個參數(shù)必須包含它的值:例如:
<input type="radio" name="myradio" value="1" <?php echo $this->validation->set_radio('myradio', '1'); ?> />
?