# 表單驗證類
CodeIgniter 提供了一個全面的表單驗證和數據預處理類可以幫你少寫很多代碼。
# 概述
在解釋 CodeIgniter 的數據驗證處理之前,讓我們先描述一下一般的情況:
1. 顯示一個表單。
2. 你填寫并提交了它。
3. 如果你提交了一些無效的信息,或者可能漏掉了一個必填項, 表單將會重新顯示你的數據,并提示一個錯誤信息。
4. 這個過程將繼續,直到你提交了一個有效的表單。
在接收端,腳本必須:
1. 檢查必填的數據。
2. 驗證數據類型是否為正確,條件是否滿足。例如,如果提交一個用戶名, 必須驗證它是否只包含了允許的字符,必須有一個最小長度,不能超過最大長度。 用戶名不能和已存在的其他人名字相同,或者不能是某個保留字,等等。
3. 為確保安全性對數據進行過濾。
4. 如果需要,預格式化數據(數據需要清除空白嗎?需要 HTML 編碼?等等)
5. 準備數據,插入數據庫。
盡管上面的過程并不是很復雜,但是通常需要編寫很多代碼,而且為了顯示錯誤信息, 在網頁中經常要使用多種不同的控制結構。表單驗證雖然簡單,但是實現起來卻非常枯燥。
# 表單驗證指南
下面是實現 CodeIgniter 表單驗證的一個簡易教程。
為了進行表單驗證,你需要這三樣東西:
1. 一個包含表單的 視圖 文件。
2. 一個包含“成功”信息的視圖文件,在成功提交后將被顯示。
3. 一個接收并處理所提交數據的 控制器 方法。
讓我們以一個會員注冊表單為例來創建這三樣東西。
表單
使用文本編輯器創建一個名為 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. (可選的)當此表單域設置自定義的錯誤信息,如果沒有設置該參數,將使用默認的。
**注解**
如果你想讓表單域的名字保存在一個語言文件里,請參考 翻譯表單域名稱
下面是個例子,在你的控制器(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() 函數更新每個表單域的 值 :
**不要忘記在 :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>
~~~
現在刷新你的頁面并提交表單觸發一個錯誤,你的表單域應該被重新填充了。
**注解**
下面的 類參考 節包含了可以讓你重填下拉菜單,單選框和復選框的函數。
**重要**
如果你使用一個數組作為一個表單域的名字,那么函數的參數也應該是一個數組。例如:
<input type="text" name="colors[]" value="<?php echo set_value('colors[]'); ?>" size="50" />
更多信息請參考下面的 使用數組作為域名稱 一節。
# 回調:你自己的驗證函數
驗證系統支持設置你自己的驗證函數,這樣你可以擴展驗證類以適應你自己的需求。 例如,如果你需要查詢數據庫來檢查用戶名是否唯一,你可以創建一個回調函數, 讓我們來新建一個例子。
在你的控制器中,將用戶名的規則修改為:
~~~
$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() 方法來作為驗證規則。
當然,這只是個例子,規則不只限于使用模型的方法,你可以使用任何對象和方法來接受域值作為第一個參數。你也可以使用匿名函數:
~~~
$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'))
)
);
下面是使用匿名函數的版本:
~~~
$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
To set your own global custom message for a rule, you can either extend/override the language file by creating your own in application/language/english/form_validation_lang.php (read more about this in the Language Class documentation), or use the following method:
~~~
$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');
~~~
關于語言文件的更多信息,參看 語言類 。
# 更改錯誤定界符
在默認情況下,表單驗證類會使用 <p> 標簽來分割每條錯誤信息。 你可以通過全局的,單獨的,或者通過配置文件對其進行自定義。
1. 全局的修改定界符 要在全局范圍內修改錯誤定界符,你可以在控制器方法中加載表單驗證類之后,使用下面的代碼:
~~~
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
~~~
在這個例子中,我們改成使用 <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() 方法。
嘗試一下!修改你的表單如下:
~~~
<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" />
~~~
更多信息,請參考下面的 使用數組作為域名稱 一節。
# 驗證數組(除 $_POST 數組)
有時你可能希望對一個單純的數組進行驗證,而不是對 $_POST 數組。
在這種情況下,你可以先定義要驗證的數組:
~~~
$data = array(
'username' => 'johndoe',
'password' => 'mypassword',
'passconf' => 'mypassword'
);
$this->form_validation->set_data($data);
~~~
Creating validation rules, running the validation, and retrieving error messages works the same whether you are validating $_POST data or another array of your choice.
**重要**
You have to call the set_data() method before defining any validation rules.
**重要**
如果你想驗證多個數組,那么你應該在驗證下一個新數組之前先調用 reset_validation() 方法。
更多信息,請參數下面的 類參考 一節。
# 將一系列驗證規則保存到一個配置文件
表單驗證類的一個不錯的特性是,它允許你將整個應用的所有驗證規則存儲到一個配置文件中去。 你可以對這些規則進行分組,這些組既可以在匹配控制器和方法時自動加載,也可以在需要時手動調用。
# 如何保存你的規則
如果要保存驗證規則,你需要在 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" />
~~~
如果你將域名稱定義為數組,那么在使用域名稱作為參數的 輔助函數函數 時, 你必須傳遞給他們與域名稱完全一樣的數組名,對這個域名稱的驗證規則也一樣。
例如,為上面的域設置驗證規則:
~~~
$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 注意:這個規則需要啟用 查詢構造器| 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 |Yes| 如果表單元素值不是一個合法的 IP 地址,返回 FALSE 通過可選參數 "ipv4" 或 "ipv6" 來指定 IP 地址格式。 |
|valid_base64 |No |如果表單元素值包含除了 base64 編碼字符之外的其他字符,返回 FALSE |
**注解**
這些規則也可以作為獨立的函數被調用,例如:
~~~
$this->form_validation->required($string);
~~~
**注解**
你也可以使用任何一個接受兩個參數的原生 PHP 函數(其中至少有一個參數是必須的,用于傳遞域值)
# 預處理參考
下表列出了所有可用的預處理方法:
|名稱 |參數 |描述|
|---|---|---|
|prep_for_form| No| DEPRECATED: 將特殊字符的轉換,以便可以在表單域中顯示 HTML 數據,而不會破壞它|
|prep_url| No |當 URL 丟失 "http://" 時,添加 "http://"|
|strip_image_tags| No |移除 HTML 中的 image 標簽,只保留 URL|
|encode_php_tags |No |將 PHP 標簽轉成實體|
**注解**
你也可以使用任何一個接受一個參數的原生 PHP 函數。 例如: trim() 、 htmlspecialchars() 、 urldecode() 等
# 類參考
**class CI_Form_validation**
**set_rules**($field[, $label = ''[, $rules = ''[, $errors = array()]]])
參數:
* $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
* $errors (array) -- A list of custom error messages
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
允許您設置驗證規則,如在本教程上面描述的:
設置驗證規則
將一系列驗證規則保存到一個配置文件
* * * * *
**run**([$group = ''])
參數: $group (string) -- The name of the validation group to run
返回: TRUE on success, FALSE if validation failed
返回類型: bool
運行驗證程序。成功返回 TRUE,失敗返回 FALSE。 您也可以傳一個驗證規則集的名稱作為參數,參考 將一系列驗證規則保存到一個配置文件
* * * * *
**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
允許您設置自定義錯誤消息,參考 設置錯誤信息
* * * * *
**set_error_delimiters**([$prefix = '<p>'[, $suffix = '</p>']])
參數:
* $prefix (string) -- Error message prefix
* $suffix (string) -- Error message suffix
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
設置錯誤消息的前綴和后綴。
* * * * *
**set_data**($data)
參數: $data (array) -- Array of data validate
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
允許你設置一個數組來進行驗證,取代默認的 $_POST 數組
* * * * *
**reset_validation**()
返回: CI_Form_validation instance (method chaining)
返回類型: CI_Form_validation
當你驗證多個數組時,該方法可以重置驗證規則,當驗證下一個新數組時應該調用它。
* * * * *
**error_array**()
返回: Array of error messages
返回類型: array
返回錯誤信息數組。
error_string([$prefix = ''[, $suffix = '']])
參數:
* $prefix (string) -- Error message prefix
* $suffix (string) -- Error message suffix
返回: Error messages as a string
返回類型: string
返回所有的錯誤信息(和 error_array() 返回結果一樣),并使用換行符分割格式化成字符串
* * * * *
**error**($field[, $prefix = ''[, $suffix = '']])
參數:
* $field (string) -- Field name
* $prefix (string) -- Optional prefix
* $suffix (string) -- Optional suffix
返回: Error message string
返回類型: string
返回特定域的錯誤消息,也可以添加一個前綴和/或后綴(通常是 HTML 標簽)
* * * * *
**has_rule**($field)
參數: $field (string) -- Field name
返回: TRUE if the field has rules set, FALSE if not
返回類型: bool
檢查某個域是否有驗證規則。
# 輔助函數參考
請參考 表單輔助函數 手冊了解以下函數:
* form_error()
* validation_errors()
* set_value()
* set_select()
* set_checkbox()
* set_radio()
注意這些都是過程式的函數,所以 **不需要** 添加 $this->form_validation 就可以直接調用它們。
- 空白目錄
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- 開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 向 CodeIgniter 貢獻你的力量
- 編寫 CodeIgniter 的文檔
- Developer's Certificate of Origin 1.1
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類