# [表單驗證類](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#id29)
CodeIgniter 提供了一個全面的表單驗證和數據預處理類可以幫你少寫很多代碼。
Page Contents
[TOC=2,3]
## 概述
在解釋 CodeIgniter 的數據驗證處理之前,讓我們先描述一下一般的情況:
1. 顯示一個表單。
2. 你填寫并提交了它。
3. 如果你提交了一些無效的信息,或者可能漏掉了一個必填項, 表單將會重新顯示你的數據,并提示一個錯誤信息。
4. 這個過程將繼續,直到你提交了一個有效的表單。
在接收端,腳本必須:
1. 檢查必填的數據。
2. 驗證數據類型是否為正確,條件是否滿足。例如,如果提交一個用戶名, 必須驗證它是否只包含了允許的字符,必須有一個最小長度,不能超過最大長度。 用戶名不能和已存在的其他人名字相同,或者不能是某個保留字,等等。
3. 為確保安全性對數據進行過濾。
4. 如果需要,預格式化數據(數據需要清除空白嗎?需要 HTML 編碼?等等)
5. 準備數據,插入數據庫。
盡管上面的過程并不是很復雜,但是通常需要編寫很多代碼,而且為了顯示錯誤信息, 在網頁中經常要使用多種不同的控制結構。表單驗證雖然簡單,但是實現起來卻非常枯燥。
## 表單驗證指南
下面是實現 CodeIgniter 表單驗證的一個簡易教程。
為了進行表單驗證,你需要這三樣東西:
1. 一個包含表單的?[視圖](http://codeigniter.org.cn/user_guide/general/views.html)?文件。
2. 一個包含“成功”信息的視圖文件,在成功提交后將被顯示。
3. 一個接收并處理所提交數據的?[控制器](http://codeigniter.org.cn/user_guide/general/controllers.html)?方法。
讓我們以一個會員注冊表單為例來創建這三樣東西。
### 表單
使用文本編輯器創建一個名為 myform.php 的文件,在它里面插入如下代碼, 并把它保存到你的 applications/views/ 目錄下:
~~~
<html>
<head>
<title>My Form</title>
</head>
<body>
<?php echo validation_errors(); ?>
<?php echo form_open('form'); ?>
<h5>Username</h5>
<input type="text" name="username" value="" size="50" />
<h5>Password</h5>
<input type="text" name="password" value="" size="50" />
<h5>Password Confirm</h5>
<input type="text" name="passconf" value="" size="50" />
<h5>Email Address</h5>
<input type="text" name="email" value="" size="50" />
<div><input type="submit" value="Submit" /></div>
</form>
</body>
</html>
~~~
### 成功頁面
使用文本編輯器創建一個名為 formsuccess.php 的文件,在它里面插入如下代碼, 并把它保存到你的 applications/views/ 目錄下:
~~~
<html>
<head>
<title>My Form</title>
</head>
<body>
<h3>Your form was successfully submitted!</h3>
<p><?php echo anchor('form', 'Try it again!'); ?></p>
</body>
</html>
~~~
### 控制器
使用文本編輯器創建一個名為 Form.php 的控制器文件,在它里面插入如下代碼, 并把它保存到你的 application/controllers/ 目錄下:
~~~
<?php
class Form extends CI_Controller {
public 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');
}
}
}
~~~
### 試一下!
訪問類似于下面這樣的 URL 來體驗一下你的表單:
~~~
example.com/index.php/form/
~~~
如果你提交表單,你會看到表單只是簡單重新加載了,這是因為你還沒有設置任何驗證規則。
**由于你還沒有告訴表單驗證類驗證什么東西,它默認返回 FALSE, ``run()`` 方法只在全部成功匹配了你的規則后才會返回 TRUE 。**
### 解釋
在這個頁面上你會注意到以下幾點:
例子中的表單(myform.php)是一個標準的 Web 表單,除了以下兩點:
1. 它使用了一個 表單輔助函數 來創建表單的起始標簽。,嚴格來說這并不是必要的, 你完全可以使用標準的 HTML 來創建,使用輔助函數的好處是它生成 action 的時候, 是基于你配置文件來生成 URL 的,這使得你的應用在更改 URL 時更具移植性。
2. 在表單的頂部你將注意到如下函數調用:
~~~
<?php echo validation_errors(); ?>
~~~
這個函數將會返回驗證器返回的所有錯誤信息。如果沒有錯誤信息,它將返回空字符串。
控制器(Form.php)有一個方法:?index()?。這個方法初始化驗證類, 并加載你視圖中用到的 表單輔助函數 和 URL 輔助函數,它也會 執行 驗證流程, 基于驗證是否成功,它會重新顯示表單或顯示成功頁面。
### 設置驗證規則
CodeIgniter 允許你為單個表單域創建多個驗證規則,按順序層疊在一起, 你也可以同時對表單域的數據進行預處理。要設置驗證規則, 可以使用set_rules()?方法:
~~~
$this->form_validation->set_rules();
~~~
上面的方法有?**三個**?參數:
1. 表單域名 - 就是你給表單域取的那個名字。
2. 表單域的 "人性化" 名字,它將被插入到錯誤信息中。例如, 如果你有一個表單域叫做 “user” ,你可能會給它一個人性化的名字叫做 “用戶名” 。
3. 為此表單域設置的驗證規則。
4. (可選的)當此表單域設置自定義的錯誤信息,如果沒有設置該參數,將使用默認的。
> 注解
> 如果你想讓表單域的名字保存在一個語言文件里,請參考?[翻譯表單域名稱](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#translating-field-names)
下面是個例子,在你的控制器(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');
~~~
你的控制器現在看起來像這樣:
~~~
<?php
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', 'required');
$this->form_validation->set_rules('password', 'Password', 'required',
array('required' => 'You must provide a %s.')
);
$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',
'errors' => array(
'required' => 'You must provide a %s.',
),
),
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]',
array(
'required' => 'You have not provided %s.',
'is_unique' => 'This %s already exists.'
)
);
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required|matches[password]');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');
~~~
上面的代碼設置了以下規則:
1. 用戶名表單域長度不得小于 5 個字符、不得大于 12 個字符。
2. 密碼表單域必須跟密碼確認表單域的數據一致。
3. 電子郵件表單域必須是一個有效郵件地址。
馬上試試看!提交不合法的數據后你會看到新的錯誤信息,跟你設置的新規則相符。 還有很多其他的驗證規則,你可以閱讀驗證規則參考。
> 注解
> 你也可以傳一個包含規則的數組給?set_rules()?方法來替代字符串,例如:
> ~~~
> $this->form_validation->set_rules('username', 'Username', array('required', 'min_length[5]'));
> ~~~
### 預處理數據
除了上面我們使用的那些驗證函數,你還可以以多種方式來預處理你的數據。 例如,你可以設置像這樣的規則:
~~~
$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]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required|matches[password]');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
~~~
在上面的例子里,我們去掉字符串兩端空白(trimming),檢查字符串的長度,確保兩次輸入的密碼一致。
**任何只有一個參數的 PHP 原生函數都可以被用作一個規則,比如 ``htmlspecialchars``, ``trim`` 等等。**
> 注解
> 你一般會在驗證規則**之后**使用預處理功能,這樣如果發生錯誤,原數據將會被顯示在表單。
### 重新填充表單
目前為止我們只是在處理錯誤,是時候用提交的數據重新填充表單了。 CodeIgniter 為此提供了幾個輔助函數,你最常用到的一個是:
~~~
set_value('field name')
~~~
打開 myform.php 視圖文件并使用?[set_value()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#set_value "set_value")?函數更新每個表單域的?**值**?:
**不要忘記在 :php:func:`set_value()` 函數中包含每個表單域的名字!**
~~~
<html>
<head>
<title>My Form</title>
</head>
<body>
<?php echo validation_errors(); ?>
<?php echo form_open('form'); ?>
<h5>Username</h5>
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />
<h5>Password</h5>
<input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" />
<h5>Password Confirm</h5>
<input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" />
<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" />
<div><input type="submit" value="Submit" /></div>
</form>
</body>
</html>
~~~
現在刷新你的頁面并提交表單觸發一個錯誤,你的表單域應該被重新填充了。
> 注解
> 下面的?[類參考](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#class-reference)?節包含了可以讓你重填下拉菜單,單選框和復選框的函數。
重要
如果你使用一個數組作為一個表單域的名字,那么函數的參數也應該是一個數組。例如:
~~~
<input type="text" name="colors[]" value="<?php echo set_value('colors[]'); ?>" size="50" />
~~~
更多信息請參考下面的?[使用數組作為域名稱](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#using-arrays-as-field-names)?一節。
### 回調:你自己的驗證函數
驗證系統支持設置你自己的驗證函數,這樣你可以擴展驗證類以適應你自己的需求。 例如,如果你需要查詢數據庫來檢查用戶名是否唯一,你可以創建一個回調函數, 讓我們來新建一個例子。
在你的控制器中,將用戶名的規則修改為:
~~~
$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
~~~
然后在你的控制器中添加一個新的方法?username_check()?。你的控制器現在看起來是這樣:
~~~
<?php
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 {field} field can not be the word "test"');
return FALSE;
}
else
{
return TRUE;
}
}
}
~~~
重新載入表單并以 “test” 作為用戶名提交數據,你會看到表單域數據被傳遞到你的回調函數中處理了。
要調用一個回調函數只需把函數名加一個 "callback_"?**前綴**并放在驗證規則里。 如果你需要在你的回調函數中調用一個額外的參數,你只需要在回調函數后面用[]把參數 (這個參數只能是字符串類型)括起來,例如:"callback_foo**[bar]**" , 其中 bar 將成為你的回調函數中的第二個參數。
> 注解
> 你也可以對傳給你的表單數據進行處理并返回,如果你的回調函數返回了除布爾型的 TRUE 或 FALSE 之外的任何值,它將被認為是你新處理過的表單數據。
### 使用任何可調用的方法作為驗證規則
如果回調的規則對你來說還不夠好(譬如,它們被限制只能定義在控制器中), 別失望,還有一種方法來創建自定義的規則:任何?is_callable()?函數返回 TRUE 的東西都可以作為規則。
看下面的例子:
~~~
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
array($this->users_model, 'valid_username')
)
);
~~~
上面的代碼將使用?Users_model?模型的?valid_username()?方法來作為驗證規則。
當然,這只是個例子,規則不只限于使用模型的方法,你可以使用任何對象和方法 來接受域值作為第一個參數。如果你使用 PHP 5.3+ ,還可以使用匿名方法:
~~~
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
function($value)
{
// Check $value
}
)
);
~~~
但是,由于可調用的規則并不是一個字符串,也沒有一個規則名,所以當你需要為它們設置 相應的錯誤消息時會有麻煩。為了解決這個問題,你可以將這樣的規則放到一個數組的第二個值, 第一個值放置規則名:
~~~
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
array('username_callable', array($this->users_model, 'valid_username'))
)
);
~~~
下面是使用匿名方法(PHP 5.3+)的版本:
~~~
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
array(
'username_callable',
function($str)
{
// Check validity of $str and return TRUE or FALSE
}
)
)
);
~~~
### 設置錯誤信息
所有原生的錯誤信息都位于下面的語言文件中:?**language/english/form_validation_lang.php**
如果要為某個規則設置你的自定義信息你可以編輯那個文件,或使用下面的方法:
~~~
$this->form_validation->set_message('rule', 'Error Message');
~~~
如果你要為某個域的某個規則設置你的自定義信息,可以使用 set_rules() 方法:
~~~
$this->form_validation->set_rules('field_name', 'Field Label', 'rule1|rule2|rule3',
array('rule2' => 'Error Message on rule2 for this field_name')
);
~~~
其中, rule 是該規則的名稱,Error Message 為該規則顯示的錯誤信息。
如果你希望在錯誤信息中包含域的人性化名稱,或者某些規則設置的一個可選參數 (例如:max_length),你可以在消息中使用?**{field}**?和?**{param}**?標簽:
~~~
$this->form_validation->set_message('min_length', '{field} must have at least {param} characters.');
~~~
如果域的人性化名稱為 Username ,并有一個規則 min_length[5] ,那么錯誤信息會顯示: "Username must have at least 5 characters."
> 注解
> 老的?sprintf()?方法和在字符串使用?**%s**?也還可以工作,但是會覆寫掉上面的標簽。 所以你同時只應該使用兩個中的一個。
在上面回調的例子中,錯誤信息是通過方法的名稱(不帶 "callback_" 前綴)來設置的:
~~~
$this->form_validation->set_message('username_check')
~~~
### 翻譯表單域名稱
如果你希望將傳遞給?set_rules()?方法的人性化名稱存儲在一個語言文件中, 使他們能被翻譯成其他語言,你可以這么做:
首先,給人性化名稱添加一個前綴:**lang:**,如下:
> $this->form_validation->set_rules('first_name', 'lang:first_name', 'required');
然后,將該名稱保存到你的某個語言文件數組中(不帶前綴):
~~~
$lang['first_name'] = 'First Name';
~~~
> 注解
> 如果你保存的語言文件沒有自動被 CI 加載,你要記住在你的控制器中使用下面的方法手工加載:
~~~
$this->lang->load('file_name');
~~~
關于語言文件的更多信息,參看?[語言類](http://codeigniter.org.cn/user_guide/libraries/language.html)?。
### 更改錯誤定界符
在默認情況下,表單驗證類會使用 標簽來分割每條錯誤信息。 你可以通過全局的,單獨的,或者通過配置文件對其進行自定義。
1. **全局的修改定界符**?要在全局范圍內修改錯誤定界符,你可以在控制器方法中加載表單驗證類之后,使用下面的代碼:
~~~
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
~~~
在這個例子中,我們改成使用 標簽來作為定界符。
2. **單獨的修改定界符**?有兩個錯誤生成方法可以用于設置它們自己的定界符,如下:
~~~
<?php echo form_error('field name', '<div class="error">', '</div>'); ?>
~~~
或者:
~~~
<?php echo validation_errors('<div class="error">', '</div>'); ?>
~~~
3. **在配置文件中設置定界符**?你還可以在配置文件 application/config/form_validation.php 中定義錯誤定界符,如下:
~~~
$config['error_prefix'] = '<div class="error_prefix">';
$config['error_suffix'] = '</div>';
~~~
### 單獨顯示錯誤
如果你喜歡緊挨著每個表單域顯示錯誤信息而不是顯示為一個列表, 你可以使用?[form_error()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#form_error "form_error")?方法。
嘗試一下!修改你的表單如下:
~~~
<h5>Username</h5>
<?php echo form_error('username'); ?>
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />
<h5>Password</h5>
<?php echo form_error('password'); ?>
<input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" />
<h5>Password Confirm</h5>
<?php echo form_error('passconf'); ?>
<input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" />
<h5>Email Address</h5>
<?php echo form_error('email'); ?>
<input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" />
~~~
如果沒有錯誤信息,將不會顯示。如果有錯誤信息,將會在輸入框的旁邊單獨顯示。
重要
如果你使用一個數組作為一個表單域的名字,那么函數的參數也應該是一個數組。例如:
~~~
<?php echo form_error('options[size]'); ?>
<input type="text" name="options[size]" value="<?php echo set_value("options[size]"); ?>" size="50" />
~~~
更多信息,請參考下面的?[使用數組作為域名稱](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#using-arrays-as-field-names)?一節。
### 驗證數組(除 $_POST 數組)
有時你可能希望對一個單純的數組進行驗證,而不是對?$_POST?數組。
在這種情況下,你可以先定義要驗證的數組:
~~~
$data = array(
'username' => 'johndoe',
'password' => 'mypassword',
'passconf' => 'mypassword'
);
$this->form_validation->set_data($data);
~~~
創建驗證規則,運行驗證,獲取錯誤消息和上面說講的那些驗證?$_POST?數組是一樣的。
>[danger] 重要
> 如果你想驗證多個數組,那么你應該在驗證下一個新數組之前先調用?reset_validation()?方法。
更多信息,請參數下面的?[類參考](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#class-reference)?一節。
## 將一系列驗證規則保存到一個配置文件
表單驗證類的一個不錯的特性是,它允許你將整個應用的所有驗證規則存儲到一個配置文件中去。 你可以對這些規則進行分組,這些組既可以在匹配控制器和方法時自動加載,也可以在需要時手動調用。
### 如何保存你的規則
如果要保存驗證規則,你需要在 application/config/ 目錄下創建一個名為 form_validation.php 的文件。 然后在該文件中,將驗證規則保存在數組 $config 中即可。和之前介紹的一樣,驗證規則數組格式如下:
~~~
$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'
)
);
~~~
你的驗證規則會被自動加載,當用戶觸發?run()?方法時被調用。
請務必要將數組名稱定義成?$config?。
### 創建規則集
為了將你的多個規則組織成規則集,你需要將它們放置到子數組中。 請參考下面的例子,在此例中我們設置了兩組規則集,我們分別命名為 "signup" 和 "email" ,你可以根據自己的需求任意命名:
~~~
$config = array(
'signup' => 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'
)
),
'email' => array(
array(
'field' => 'emailaddress',
'label' => 'EmailAddress',
'rules' => 'required|valid_email'
),
array(
'field' => 'name',
'label' => 'Name',
'rules' => 'required|alpha'
),
array(
'field' => 'title',
'label' => 'Title',
'rules' => 'required'
),
array(
'field' => 'message',
'label' => 'MessageBody',
'rules' => 'required'
)
)
);
~~~
### 調用某組驗證規則
為了調用特定組的驗證規則,你可以將它的名稱傳給?run()?方法。 例如,使用 signup 規則你可以這樣:
~~~
if ($this->form_validation->run('signup') == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
~~~
### 將控制器方法和規則集關聯在一起
調用一組規則的另一種方法是將控制器方法和規則集關聯在一起(這種方法也更自動), 例如,假設你有一個控制器類 Member 和一個方法 signup ,你的類如下:
~~~
<?php
class Member extends CI_Controller {
public function signup()
{
$this->load->library('form_validation');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
}
~~~
在你的驗證規則配置文件中,使用 member/signup 來給這組規則集命名:
~~~
$config = array(
'member/signup' => array(
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'required'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'required'
),
array(
'field' => 'passconf',
'label' => 'PasswordConfirmation',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'Email',
'rules' => 'required'
)
)
);
~~~
當一組規則的名稱和控制器類/方法名稱完全一樣時,它會在該控制器類/方法中自動被?run()?方法調用。
## 使用數組作為域名稱
表單驗證類支持使用數組作為域名稱,比如:
~~~
<input type="text" name="options[]" value="" size="50" />
~~~
如果你將域名稱定義為數組,那么在使用域名稱作為參數的?[輔助函數函數](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#helper-functions)?時, 你必須傳遞給他們與域名稱完全一樣的數組名,對這個域名稱的驗證規則也一樣。
例如,為上面的域設置驗證規則:
~~~
$this->form_validation->set_rules('options[]', 'Options', 'required');
~~~
或者,為上面的域顯示錯誤信息:
~~~
<?php echo form_error('options[]'); ?>
~~~
或者,重新填充該域的值:
~~~
<input type="text" name="options[]" value="<?php echo set_value('options[]'); ?>" size="50" />
~~~
你也可以使用多維數組作為域的名稱,例如:
~~~
<input type="text" name="options[size]" value="" size="50" />
~~~
甚至:
~~~
<input type="text" name="sports[nba][basketball]" value="" size="50" />
~~~
和上面的例子一樣,你必須在輔助函數中使用完全一樣的數組名:
~~~
<?php echo form_error('sports[nba][basketball]'); ?>
~~~
如果你正在使用復選框(或其他擁有多個選項的域),不要忘了在每個選項后加個空的方括號, 這樣,所有的選擇才會被添加到 POST 數組中:
~~~
<input type="checkbox" name="options[]" value="red" />
<input type="checkbox" name="options[]" value="blue" />
<input type="checkbox" name="options[]" value="green" />
~~~
或者,使用多維數組:
~~~
<input type="checkbox" name="options[color][]" value="red" />
<input type="checkbox" name="options[color][]" value="blue" />
<input type="checkbox" name="options[color][]" value="green" />
~~~
當你使用輔助函數時,也要添加方括號:
~~~
<?php echo form_error('options[color][]'); ?>
~~~
## 規則參考
下表列出了所有可用的原生規則:
| 規則 | 參數 | 描述 | 例子 |
| --- | --- | --- | --- |
| **required** | No | 如果表單元素為空,返回 FALSE | ? |
| **matches** | Yes | 如果表單元素值與參數中對應的表單字段的值不相等,返回 FALSE | matches[form_item] |
| **regex_match** | Yes | 如果表單元素不匹配正則表達式,返回 FALSE | regex_match[/regex/] |
| **differs** | Yes | 如果表單元素值與參數中對應的表單字段的值相等,返回 FALSE | differs[form_item] |
| **is_unique** | Yes | 如果表單元素值在指定的表和字段中并不唯一,返回 FALSE 注意:這個規則需要啟用[查詢構造器](http://codeigniter.org.cn/user_guide/database/query_builder.html) | is_unique[table.field] |
| **min_length** | Yes | 如果表單元素值的長度小于參數值,返回 FALSE | min_length[3] |
| **max_length** | Yes | 如果表單元素值的長度大于參數值,返回 FALSE | max_length[12] |
| **exact_length** | Yes | 如果表單元素值的長度不等于參數值,返回 FALSE | exact_length[8] |
| **greater_than** | Yes | 如果表單元素值小于或等于參數值或非數字,返回 FALSE | greater_than[8] |
| **greater_than_equal_to** | Yes | 如果表單元素值小于參數值或非數字,返回 FALSE | greater_than_equal_to[8] |
| **less_than** | Yes | 如果表單元素值大于或等于參數值或非數字,返回 FALSE | less_than[8] |
| **less_than_equal_to** | Yes | 如果表單元素值大于參數值或非數字,返回 FALSE | less_than_equal_to[8] |
| **in_list** | Yes | 如果表單元素值不在規定的列表中,返回 FALSE | in_list[red,blue,green] |
| **alpha** | No | 如果表單元素值包含除字母以外的其他字符,返回 FALSE | ? |
| **alpha_numeric** | No | 如果表單元素值包含除字母和數字以外的其他字符,返回 FALSE | ? |
| **alpha_numeric_spaces** | No | 如果表單元素值包含除字母、數字和空格以外的其他字符,返回 FALSE 應該在 trim 之后使用,避免首尾的空格 | ? |
| **alpha_dash** | No | 如果表單元素值包含除字母/數字/下劃線/破折號以外的其他字符,返回 FALSE | ? |
| **numeric** | No | 如果表單元素值包含除數字以外的字符,返回 FALSE | ? |
| **integer** | No | 如果表單元素包含除整數以外的字符,返回 FALSE | ? |
| **decimal** | No | 如果表單元素包含非十進制數字時,返回 FALSE | ? |
| **is_natural** | No | 如果表單元素值包含了非自然數的其他數值 (不包括零),返回 FALSE 自然數形如:0、1、2、3 .... 等等。 | ? |
| **is_natural_no_zero** | No | 如果表單元素值包含了非自然數的其他數值 (包括零),返回 FALSE 非零的自然數:1、2、3 .... 等等。 | ? |
| **valid_url** | No | 如果表單元素值包含不合法的 URL,返回 FALSE | ? |
| **valid_email** | No | 如果表單元素值包含不合法的 email 地址,返回 FALSE | ? |
| **valid_emails** | No | 如果表單元素值包含不合法的 email 地址(地址之間用逗號分割),返回 FALSE | ? |
| **valid_ip** | No | 如果表單元素值不是一個合法的 IP 地址,返回 FALSE 通過可選參數 "ipv4" 或 "ipv6" 來指定 IP 地址格式。 | ? |
| **valid_base64** | No | 如果表單元素值包含除了 base64 編碼字符之外的其他字符,返回 FALSE | ? |
注解
這些規則也可以作為獨立的函數被調用,例如:
~~~
$this->form_validation->required($string);
~~~
> 注解
> 你也可以使用任何一個接受兩個參數的原生 PHP 函數(其中至少有一個參數是必須的,用于傳遞域值)
## 預處理參考
下表列出了所有可用的預處理方法:
| 名稱 | 參數 | 描述 |
| --- | --- | --- |
| **prep_for_form** | No | 將特殊字符的轉換,以便可以在表單域中顯示 HTML 數據,而不會破壞它 |
| **prep_url** | No | 當 URL 丟失 "[http://](http://codeigniter.org.cn/user_guide/libraries/form_validation.html)" 時,添加 "[http://](http://codeigniter.org.cn/user_guide/libraries/form_validation.html)" |
| **strip_image_tags** | No | 移除 HTML 中的 image 標簽,只保留 URL |
| **encode_php_tags** | No | 將 PHP 標簽轉成實體 |
> 注解
> 你也可以使用任何一個接受一個參數的原生 PHP 函數。 例如:?trim()?、?htmlspecialchars()?、?urldecode()?等
## 類參考
classCI_Form_validation
>[info] ### set_rules($field[,?$label = ''[,?$rules = '']])
參數:
* **$field**?(string) -- Field name
* **$label**?(string) -- Field label
* **$rules**?(mixed) -- Validation rules, as a string list separated by a pipe "|", or as an array or rules
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
允許您設置驗證規則,如在本教程上面描述的:
* [設置驗證規則](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#setting-validation-rules)
* [將一系列驗證規則保存到一個配置文件](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#saving-groups)
>[info] ### run([$group = ''])
參數:
* **$group**?(string) -- The name of the validation group to run
返回: TRUE on success, FALSE if validation failed
返回類型: bool
運行驗證程序。成功返回 TRUE,失敗返回 FALSE。 您也可以傳一個驗證規則集的名稱作為參數,參考?[將一系列驗證規則保存到一個配置文件](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#saving-groups)
set_message($lang[,?$val = ''])
參數:
* **$lang**?(string) -- The rule the message is for
* **$val**?(string) -- The message
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
允許您設置自定義錯誤消息,參考?[設置錯誤信息](http://codeigniter.org.cn/user_guide/libraries/form_validation.html#setting-error-messages)
>[info] ### set_error_delimiters([$prefix = ''[,?$suffix = '']])
參數:
* **$prefix**?(string) -- Error message prefix
* **$suffix**?(string) -- Error message suffix
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
設置錯誤消息的前綴和后綴。
>[info] ### set_data($data)
參數:
* **$data**?(array) -- Array of data validate
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
允許你設置一個數組來進行驗證,取代默認的?$_POST?數組
>[info] ### reset_validation()
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
當你驗證多個數組時,該方法可以重置驗證規則,當驗證下一個新數組時應該調用它。
>[info] ### error_array()
返回: Array of error messages
返回類型: array
返回錯誤信息數組。
>[info] ### error_string([$prefix = ''[,?$suffix = '']])
參數:
* **$prefix**?(string) -- Error message prefix
* **$suffix**?(string) -- Error message suffix
返回: Error messages as a string
返回類型: string
返回所有的錯誤信息(和 error_array() 返回結果一樣),并使用換行符分割格式化成字符串
>[info] ### error($field[,?$prefix = ''[,?$suffix = '']])
參數:
* **$field**?(string) -- Field name
* **$prefix**?(string) -- Optional prefix
* **$suffix**?(string) -- Optional suffix
返回: Error message string
返回類型: string
返回特定域的錯誤消息,也可以添加一個前綴和/或后綴(通常是 HTML 標簽)
>[info] ### has_rule($field)
參數:
* **$field**?(string) -- Field name
返回: TRUE if the field has rules set, FALSE if not
返回類型: bool
檢查某個域是否有驗證規則。
## 輔助函數參考
請參考?[表單輔助函數](http://codeigniter.org.cn/user_guide/helpers/form_helper.html)?手冊了解以下函數:
* [form_error()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#form_error "form_error")
* [validation_errors()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#validation_errors "validation_errors")
* [set_value()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#set_value "set_value")
* [set_select()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#set_select "set_select")
* [set_checkbox()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#set_checkbox "set_checkbox")
* [set_radio()](http://codeigniter.org.cn/user_guide/helpers/form_helper.html#set_radio "set_radio")
注意這些都是過程式的函數,所以?**不需要**?添加?$this->form_validation?就可以直接調用它們。
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量