這個(gè)類庫(kù)已經(jīng)廢棄掉了。鼓勵(lì)使用 form_validation 類庫(kù)。
表單驗(yàn)證
在解釋CodeIgniter的數(shù)據(jù)驗(yàn)證前,讓我們先描述下理想情況:
- 顯示一個(gè)表單;
- 你填寫文字并點(diǎn)擊提交按鈕;
- 如果你提交的東西是殘缺的,又或者漏填了必須填寫的項(xiàng),表單重新顯示并包含你提交數(shù)據(jù)的一條錯(cuò)誤信息;
- 這個(gè)過程繼續(xù),直到你提交了正確的信息
在這個(gè)過程中,程序必須:
- 檢查必須的數(shù)據(jù)。
- 校驗(yàn)數(shù)據(jù)的格式是否正確,是否符合標(biāo)準(zhǔn)(比如,如果提交用戶名,那么必須只能包含有效的字符。必須有最小的長(zhǎng)度,并且不能超過允許的長(zhǎng)度。 用戶名不可以與已有用戶名重復(fù),或者不能為保留字,等等。 Etc.)
- 處理數(shù)據(jù)使之更安全。
- 需要的情況下預(yù)格式化數(shù)據(jù)(數(shù)據(jù)需要進(jìn)行剪裁,HTML格式化?等等)。
- 準(zhǔn)備數(shù)據(jù),寫入數(shù)據(jù)庫(kù)。
盡管上面的過程沒有什么復(fù)雜的地方,但這通常需要一定數(shù)量的代碼來提交錯(cuò)誤信息,各種控制結(jié)構(gòu)放置在HTML文件里。 創(chuàng)建簡(jiǎn)單表單驗(yàn)證,代碼通常會(huì)非常凌亂而效能地下。
CodeIgniter提供了一個(gè)全面的解決框架,真正的精簡(jiǎn)你需要寫的代碼數(shù)量。當(dāng)然也可以從你的HTML表單中分離出控制結(jié)構(gòu),使得它成為干凈而靈活的代碼。預(yù)覽
為了能使用CodeIgniter的表單驗(yàn)證功能,你需要做以下三件事情:
- 一個(gè)包含表單的 視圖 文件。
- 一個(gè)包含提交“成功”信息的視圖文件。
- 一個(gè)控制器函數(shù),用來接受和處理提交的數(shù)據(jù)。
讓我們創(chuàng)建這三個(gè)事件,使用注冊(cè)表單作為樣例:
表單頁(yè)
使用一個(gè)文本編輯器,創(chuàng)建一個(gè)名叫myform.php的文件。在文中寫入如下代碼并保存到applications/views/ 文件夾下:
成功頁(yè)
使用一個(gè)文本編輯器,創(chuàng)建一個(gè)名叫 formsuccess.php的文件。在文中寫入如下代碼并保存到applications/views/ 文件夾下:
控制器頁(yè)
使用一個(gè)文本編輯器,創(chuàng)建一個(gè)名叫 form.php的文件。在文中寫入如下代碼并保存到applications/controllers/ 文件夾下:
試一試!
用與下面相似的URL地址測(cè)試下你的表單:
example.com/index.php/form/
如果你提交了表單,你會(huì)發(fā)現(xiàn)表單重載了。那是因?yàn)槟氵€沒有設(shè)置任何驗(yàn)證條件,這就是我們接下來要做的。
說明:
你會(huì)注意到一些關(guān)于上面頁(yè)面的事情:
那個(gè) 頁(yè)面 (myform.php) 是一個(gè)除了兩個(gè)例外的標(biāo)準(zhǔn)頁(yè)面:
- 它使用一個(gè)表單助手 來創(chuàng)建表單to create the form opening. 從技術(shù)上講,這是沒有必要的。你可以用標(biāo)準(zhǔn)的HTML來創(chuàng)建表單。然而,使用這個(gè)助手的好處在于: 它為你生成了一個(gè)段URL,就是你在CONFIG文件里定義的那個(gè)。這使得你的程序在修改時(shí)可以更簡(jiǎn)單和靈活。
- 在表單的頂部,你會(huì)注意到一下的不同點(diǎn):
<?php echo $this->validation->error_string; ?>
驗(yàn)證類會(huì)使用這個(gè)變量返回并顯示一些錯(cuò)誤信息。如果沒有信息將沒有返回值。
這個(gè)控制器 (form.php) 有一個(gè)函數(shù): index(). 這個(gè)函數(shù)初始化驗(yàn)證類并加載你的視圖文件需要使用的 form helper 和 URL helper 。 當(dāng)然也 運(yùn)行 驗(yàn)證過程。這取決于驗(yàn)證是否成功,既不顯示表單也沒有返回成功信息。
如果還沒有告訴驗(yàn)證類使之生效的信息,它會(huì)一直返回“FALSE”(布爾值 FALSE)作為默認(rèn)值。如果數(shù)據(jù)成功地接受你的條件并且它們沒有任何錯(cuò)誤,那么run() 函數(shù)值返回“TRUE”。
設(shè)置驗(yàn)證條件
CodeIgniter可以讓你設(shè)置任意數(shù)量的條件來控制給定的范圍,循環(huán),甚至同時(shí)它可以讓你準(zhǔ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)在提交空白的表單,你將會(huì)看到錯(cuò)誤信息。如果你提交的表單包含有完全正確的信息,你將看到你的成功頁(yè)。
注意: 當(dāng)表單數(shù)據(jù)有錯(cuò)誤時(shí),它不會(huì)被重新填充。當(dāng)我們講明驗(yàn)證規(guī)則后,馬上回來解釋它。
改變出錯(cuò)信息的樣式
默認(rèn)情況下,系統(tǒng)會(huì)為每個(gè)錯(cuò)誤提示信息添加一個(gè)段落的標(biāo)識(shí)(<p>)。你可以很容易地通過編碼去改變這些界定符號(hào),在控制器里寫入一下代碼:
$this->validation->set_error_delimiters('<div class="error">', '</div>');
在這個(gè)例子中,我們將其改成了 div 標(biāo)簽。
順序編排規(guī)則
CodeIgniter可以讓你把所有的驗(yàn)證條件有序地串聯(lián)起來。我們來試一下。把你的驗(yà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ū)域 必須包含一個(gè)合法的Email地址.
盡管嘗試下吧!
請(qǐng)注意: 如果你閱讀最后的“規(guī)則參考”(Rule Reference),你會(huì)發(fā)現(xiàn)有很多可用的規(guī)則!
準(zhǔn)備數(shù)據(jù)
在驗(yàn)證函數(shù)的基礎(chǔ)上,你可以使用不同的方法準(zhǔn)備好你的數(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ū)域?yàn)?MD5 編碼,通過“XSS_CLEAN”函數(shù)檢測(cè)用戶名,移除危險(xiǎn)的數(shù)據(jù)。
默認(rèn)的PHP函數(shù)能為一個(gè)規(guī)則使用一個(gè)參數(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ù):你自己的驗(yàn)證函數(shù)
驗(yàn)證系統(tǒng)支持回調(diào)你自己的驗(yàn)證函數(shù). 這允許你通過擴(kuò)展驗(yàn)證類來適應(yīng)自己的需要. 例如, 如果你需要執(zhí)行一個(gè)數(shù)據(jù)庫(kù)查詢來查看用戶是否選擇了唯一的用戶名,你可以通過創(chuàng)建一個(gè)回調(diào)函數(shù)來做這件事. 讓我們創(chuàng)建一個(gè)簡(jiǎn)單的例子.
在你的控制器中將username規(guī)則改為:
$rules['username'] = "callback_username_check";
然后在你的控制器中添加一個(gè)新的函數(shù)叫做 username_check . 你的控制器看起來應(yīng)該像下面的例子:
重新載入表單并以"test"做為用戶名提交. 你可以看到表單中的數(shù)據(jù)已經(jīng)發(fā)送到你的回調(diào)函數(shù)中處理.
要想回調(diào)一個(gè)函數(shù)只需在你定義的函數(shù)名前加上一個(gè)"callback_"前綴即可.
錯(cuò)誤消息可以使用 $this->validation->set_message 函數(shù)來設(shè)置. 請(qǐng)牢記消息鍵(第一個(gè)參數(shù))必須與您的函數(shù)名相匹配.
注意: 你可以在任何規(guī)則中使用你自定義的錯(cuò)誤消息, 只需設(shè)置類似的消息. 例如,為"required"規(guī)則改變消息你可以這樣做:
$this->validation->set_message('required', 'Your custom message here');
填充表單
我們花了不少時(shí)間處理錯(cuò)誤?,F(xiàn)在是討論使用數(shù)據(jù)重新填充表單的時(shí)候了。這里的做法和你的驗(yàn)證規(guī)則類似。在你的驗(yàn)證規(guī)則下面加入如下代碼:
$fields['username'] = 'Username';
$fields['password'] = 'Password';
$fields['passconf'] = 'Password Confirmation';
$fields['email'] = 'Email Address';
$this->validation->set_fields($fields);
數(shù)組的關(guān)鍵字實(shí)際上是表單域的名字,對(duì)應(yīng)的值是你想要在錯(cuò)誤信息中顯示的全名。
現(xiàn)在你控制器中的index函數(shù)看起來應(yīng)該像這樣:
現(xiàn)在打開你的視圖文件myform.php,根據(jù)每個(gè)表單域的名字更新它們的值。
現(xiàn)在重新加載你的頁(yè)面,提交表單并觸發(fā)一個(gè)錯(cuò)誤。你的表單將會(huì)被重新填充而且錯(cuò)誤信息也會(huì)包含更多相關(guān)的表單域的名字。
單獨(dú)顯示錯(cuò)誤
如果你想要在每個(gè)表單域旁顯示錯(cuò)誤,而不是顯示一個(gè)錯(cuò)誤列表,你可以像這樣修改你的表單:
如果沒有錯(cuò)誤,不會(huì)顯示任何東西。如果有錯(cuò)誤發(fā)生,消息將會(huì)使用你設(shè)置的分割標(biāo)記顯示(<p> 標(biāo)記是默認(rèn)值)。
Note: 要這樣顯示錯(cuò)誤信息,你必須之前使用$this->validation->set_fields
函數(shù)描述。錯(cuò)誤將會(huì)被轉(zhuǎn)換成表單域名加"_error"后綴的變量。例如,你的用戶名錯(cuò)誤的值可以這樣訪問:
$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不能使用該驗(yàn)證規(guī)則) | ? |
is_natural_no_zero | No | 如果為非正整數(shù)(自然數(shù)) 則 Returns FALSE (注意 CI 1.7x版 新增, CI 1.6x不能使用該驗(yàn)證規(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ī)則也可以像獨(dú)立的函數(shù)一樣被調(diào)用。例如:
$this->validation->required($string);
Note: 你也可以使用接受一個(gè)參數(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: 你也可以,使用接收一個(gè)參數(shù)的PHP原生函數(shù),例如trim, htmlspecialchars, urldecode,等等。
設(shè)置自定義錯(cuò)誤信息
所有的原生錯(cuò)誤信息防止在下面的語(yǔ)言文件中:language/english/validation_lang.php
你可以編輯這個(gè)文件,或使用如下函數(shù)設(shè)置你自己的信息。
$this->validation->set_message('rule', 'Error Message');
rule是特定規(guī)則的名字,Error Message是你想要顯示的信息。
處理選擇菜單,單選按鈕,和復(fù)選框
如果你使用了選擇菜單,單選按鈕,和復(fù)選框,你會(huì)想在出錯(cuò)時(shí)保持原先的選擇。驗(yàn)證類有三個(gè)函數(shù)幫助你完成這些:
set_select()
允許你顯示和提交時(shí)狀態(tài)一致的菜單項(xiàng)。第一個(gè)參數(shù)是選擇菜單的名字,第二個(gè)參數(shù)必須包含每個(gè)選項(xiàng)的值。例如:
<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()
允許你顯示和提交時(shí)狀態(tài)一致的復(fù)選框。第一個(gè)參數(shù)是復(fù)選框的名字,第二個(gè)參數(shù)必須包含它的值,例如:
<input type="checkbox" name="mycheck" value="1" <?php echo $this->validation->set_checkbox('mycheck', '1'); ?> />
set_radio()
允許你顯示和提交時(shí)狀態(tài)一致的單選按鈕。第一個(gè)參數(shù)是單選按鈕的名字,第二個(gè)參數(shù)必須包含它的值:例如:
<input type="radio" name="myradio" value="1" <?php echo $this->validation->set_radio('myradio', '1'); ?> />
?