php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
表單驗證詳解
CodeIgniter 提供了一個全面的表單驗證和數據預處理類以幫助縮減你所寫的代碼。
概述
在解釋 CodeIgniter 的數據驗證處理之前,讓我們先描述一下一般的情況:
一個表單顯示了。
你填寫并提交了它。
如果你提交了一些無效的信息,或者可能漏掉了一個必填項,表單將會連同你的數據和錯誤問題的描述信息重新顯示。
這個過程將繼續,直到你提交了一個有效的表單。
在接收端,腳本必須:
檢查必須的數據。
驗證數據是否為正確的類型,合適的標準。例如,如果一個用戶名被提交,它必須被驗證是否只包含了允許的字符。它必須有一個最小長度,不能超過最大長度。用戶名不能是已存在的他人用戶名,或者甚至是一個保留字等。
清理數據使其安全。
如果需要,預格式化數據(數據需要清除空白嗎?經過 HTML 編碼?等。)
準備數據,插入數據庫。
盡管上面的過程并不是很復雜,但是通常需要編寫很多代碼,而且為了顯示錯誤信息,在網頁中經常要使用多種不同的控制結構。創建表單驗證雖簡單,實施起來卻也枯燥無味。
表單驗證指南
下面是如何實施CodeIgniter表單驗證的一個簡易教程
為了進行表單驗證,你需要這三樣東西:
一個包含表單的 視圖 文件。
一個包含“成功”信息的視圖文件,在成功提交后將被顯示。
一個接收并處理所提交數據的 控制器 函數。
讓我們以一個會員注冊表單為例來創建這三個玩意。
表單
使用一個文本編輯器,創建一個名叫 myform.php 的表單。在它里面放上這些代碼并把它保存到你的 applications/views/ 文件夾中:
My FormUsername
Password
Password Confirm
Email Address
成功頁面
使用一個文本編輯器,創建一個名叫 formsuccess.php 的表單。在它里面放上這些代碼并保存到你的 applications/views/
文件夾:
My FormYour form was successfully submitted!
控制器
使用一個文本編輯器,創建一個名叫 form.php 的控制器。在它里面,放上這些代碼并保存到你的 applications/controllers/
文件夾:
class Form extends CI_Controller {
function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
}
?>
Try it!
要測試你的表單,請使用類似這樣的URL訪問你的網站:
example.com/index.php/form/
如果你提交表單你只會看到表單重新加載了。這是因為你還沒有設置驗證規則。
由于你還沒有告訴表單驗證類驗證什么東西。它只是默認的返回了 FALSE (boolean false) 。 run()
方法只在全部成功匹配了你的規則才會返回 TRUE 。
解析
你會注意到在此頁上面的幾點:
表單 (myform.php) 是一個標準的Web表單,除了以下兩點:
它使用一個 表單輔助函數 創建表單開始。
技術上,這并非必要。你可以使用標準的HTML來創建,然而,使用輔助函數的好處是它為你生成了基于你配置文件中的URL的 action URL。這使得你的應用在更改URL時更具移植性。
在表單的頂端你將注意到如下函數調用:
這個函數將會返回驗證器送回的所有錯誤信息。如果沒有錯誤信息,它將返回空字符串。
控制器 (form.php) 有一個方法: index()。這個方法初始化驗證類并加載你視圖中用到的 表單輔助函數 和URL 輔助函數 它也會 運行
驗證程序。基于驗證是否成功,它會重現表單或顯示成功頁面。
設置驗證規則
CodeIgniter允許你為單個表單域創建多個驗證規則,按順序層疊在一起,你甚至可以同時預先處理表單域數據。要設置驗證規則請使用set_rules() 函數:
$this->form_validation->set_rules();
上面的函數使用 三個 參數作為輸入:
表單域的名字 - 就是你給表單域取的那個名字。
一個此表單域的 "人性化" 名字,它將被插入到錯誤信息中。例如,如果你有一個表單域叫做“user”你可能給它一個人性化名字叫做“用戶名”。 注意: 如果你想讓表單域的名字保存在一個語言文件里,請參考 翻譯表單域名字.
為此表單域設置的驗證規則。
這兒有一個示例。在你的 控制器 (form.php) 中緊接著驗證初始化函數之后,添加這段代碼:
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');
你的控制器現在看起來像這樣:
class Form extends CI_Controller {
function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
}
?>
現在留空表單域提交表單你會看到錯誤信息。
如果你填充所有的表單域提交表單你會看到成功頁。
注意: 出現錯誤時表單域并沒有被使用數據重新填充。稍后我們去搞這個。
使用一個數組設置驗證規則
繼續之前請注意,如果你更喜歡通過一個操作設置所有規則的話,向規則設定函數傳遞的可以是一個數組。
如果你想用這個方式,你必須這樣命名你的數組鍵:
$config = array(
array(
'field'???=> 'username',
'label'???=> 'Username',
'rules'???=> 'required'
),
array(
'field'???=> 'password',
'label'???=> 'Password',
'rules'???=> 'required'
),
array(
'field'???=> 'passconf',
'label'???=> 'Password Confirmation',
'rules'???=> 'required'
),
array(
'field'???=> 'email',
'label'???=> 'Email',
'rules'???=> 'required'
)
);
$this->form_validation->set_rules($config);
級聯規則(Cascading Rules)
CodeIgniter 允許你將多個規則連接在一起。讓我們試一試。修改規則設置函數中的第三個參數,如下:
$this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]|is_unique[users.username]');
$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');
上面的代碼設置了一組規則:
用戶名表單域長度不得小于5個字符以及大于12個字符。
密碼表單域必須跟密碼確認表單域的數據一致。
電子郵件表單域必須是一個有效郵件地址。
馬上試試看!提交不合法的數據后你會看到新的錯誤信息跟你設置的新規則相符。在驗證參考頁中你可以閱讀到更多規則。
預處理數據
作為上面使用的驗證函數的附加,你也可以以多種方式預處理你的數據。
例如,你可以設置像這樣的規則:
$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]');
$this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]|matches[passconf]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
In the above example, we are "trimming" the fields, checking for length where necessary and making sure that both password fields match.
任何接收一個參數的 PHP 函數都可以被用作一個規則,比如 htmlspecialchars(),
trim() 等等。
注意: 你一般會在驗證規則之后使用這些預處理功能,這樣如果發生錯誤,原數據將會被顯示在表單。
重新填充表單(Re-populating the form)
目前為止我們只處理了錯誤。是使用提交的數據重填表單的時候了。CodeIgniter 為此提供了幾個輔助函數。你最常用到的一個是:
set_value('field name')
打開 myform.php 視圖文件并使用 set_value() 函數更新每個表單域的 值 :
不要忘記在set_value()函數中包含每個表單域的名字!
My FormUsername
Password
Password Confirm
Email Address
現在刷新你的頁面并提交表單產生一個錯誤。你的表單域應該被重新填寫了。但是,只能重新填充設置了規則(rules)的表單域。
注意:1.下面的 函數參考 節包含了可以讓你重填下拉菜單,單選框和復選框的函數。
重要提示: 如果你使用一個數組作為一個表單域的名字,你必須為函數提供給它一個數組。例如:
更多信息請參考下面的 使用數組作為表單域名字 一節。
回調: 你自己的驗證函數
驗證系統提供了向你自己驗證函數的回調。這是你可以擴展驗證類以適應你的需求。例如,如果你需要執行一個數據庫查詢來檢查用戶是否選擇了一個唯一的用戶名,你可以創建一個回調函數做這個。咱們建個例子。
在你的控制器中,修改“username”為:
$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
然后在你的控制器中添加一個新的函數名叫 username_check 。你的控制器現在看起來是這樣:
class Form extends CI_Controller {
public function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|is_unique[users.email]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
public function username_check($str)
{
if ($str == 'test')
{
$this->form_validation->set_message('username_check', 'The %s field can not be the word "test"');
return FALSE;
}
else
{
return TRUE;
}
}
}
?>
重新載入表單并以“test”作為用戶名提交數據,你會看到表單域數據傳遞到回調函數中供你處理。
要調用一個回調函數只需把函數名加一個"callback_"前綴并放在驗證規則里。如果你需要在你的回調函數中調用一個額外的參數,你只需要在回調函數后面用[]把參數(這個參數只能是字符串類型)括起來,
例如: "callback_foo[bar]", 其中bar將成為你的回調函數中的第二個參數.【譯者注:第一個參數是input的value值】
注意:你也可以處理并返回傳遞給你的回調函數中的表單數據。如果你的回調函數返回了除布爾型的TRUE/FALSE外的任何值,它將被假定數據是你新處理過的表單數據。
設置錯誤信息
所有自身的錯誤信息位于下面的語言文件中:language/english/form_validation_lang.php
要設置你的自定義信息你可以編輯那個文件,或使用下面的函數:
$this->form_validation->set_message('rule', 'Error Message');
其中 rule 是該條定義規則的名稱,Error Message 該規則會顯示的錯誤文本。
如果你在錯誤信息中包含了 %s,它將插入顯示出你在表單域中設置的別名。
在上面回調的例子中,, 錯誤信息是通過傳送函數名稱返回的:
$this->form_validation->set_message('username_check')
你也可以重寫語言文件中的錯誤信息. 例如, 你可以這么做來改變"required" 規則的信息:
$this->form_validation->set_message('required', 'Your custom message here');
翻譯表單域名稱
如果你希望將傳遞給 set_rules() 函數的自然語言參數存儲在一個語言文件中——使他們有一個或多個翻譯版本,你可以這么做:
首先,給當前表單域自定義一個key值(通常就是表單標簽的name),然后添加上lang:前綴,如下:
$this->form_validation->set_rules('first_name', 'lang:first_name', 'required');
然后,以如下語言數組(數組的key值不必包含lang前綴)的形式保存在你的語言文件中:
$lang['first_name'] = 'First Name';
注意: 開發者自定義的語言文件數組(如上例)不會自動被CI加載,你需要在控制器中手動加載:
$this->lang->load('file_name');
關于語言文件的具體設置和加載請參考 語言類 說明。
更改錯誤定界符
在默認情況下,表單驗證類會使用 (
) 標簽來分割每條錯誤信息,以達到分段效果。你可以自行對其進行定義。
定界符統一更改
如果需要全局更改錯誤定界符, 可以在你的控制器中,在表單驗證類加載之后添加如下代碼:
$this->form_validation->set_error_delimiters('
', '');在此例中,我們將定界符由系統默認的
更改為一個div標簽。
定界符單獨更改
表單驗證類所提供的兩種顯示錯誤驗證信息的函數,分別可以通過如下方法來設置它們的定界符:
<?php echo form_error('field name', '
', ''); ?>總結
以上是生活随笔為你收集整理的php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 抽象类 方法_java 抽象类
- 下一篇: 栈清空程序演示