CodeIgniter 表單驗證類

2018-07-21 15:39 更新

表單驗證類

CodeIgniter 提供了一個全面的表單驗證和數(shù)據(jù)預處理類可以幫你少寫很多代碼。

Page Contents

概述

在解釋 CodeIgniter 的數(shù)據(jù)驗證處理之前,讓我們先描述一下一般的情況:

  1. 顯示一個表單。
  2. 你填寫并提交了它。
  3. 如果你提交了一些無效的信息,或者可能漏掉了一個必填項, 表單將會重新顯示你的數(shù)據(jù),并提示一個錯誤信息。
  4. 這個過程將繼續(xù),直到你提交了一個有效的表單。

在接收端,腳本必須:

  1. 檢查必填的數(shù)據(jù)。
  2. 驗證數(shù)據(jù)類型是否為正確,條件是否滿足。例如,如果提交一個用戶名, 必須驗證它是否只包含了允許的字符,必須有一個最小長度,不能超過最大長度。 用戶名不能和已存在的其他人名字相同,或者不能是某個保留字,等等。
  3. 為確保安全性對數(shù)據(jù)進行過濾。
  4. 如果需要,預格式化數(shù)據(jù)(數(shù)據(jù)需要清除空白嗎?需要 HTML 編碼?等等)
  5. 準備數(shù)據(jù),插入數(shù)據(jù)庫。

盡管上面的過程并不是很復雜,但是通常需要編寫很多代碼,而且為了顯示錯誤信息, 在網(wǎng)頁中經(jīng)常要使用多種不同的控制結構。表單驗證雖然簡單,但是實現(xiàn)起來卻非??菰铩?/p>

表單驗證指南

下面是實現(xiàn) CodeIgniter 表單驗證的一個簡易教程。

為了進行表單驗證,你需要這三樣東西:

  1. 一個包含表單的 視圖 文件。
  2. 一個包含“成功”信息的視圖文件,在成功提交后將被顯示。
  3. 一個接收并處理所提交數(shù)據(jù)的 控制器 方法。

讓我們以一個會員注冊表單為例來創(chuàng)建這三樣東西。

表單

使用文本編輯器創(chuàng)建一個名為 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>

成功頁面

使用文本編輯器創(chuàng)建一個名為 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>

控制器

使用文本編輯器創(chuàng)建一個名為 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/

如果你提交表單,你會看到表單只是簡單重新加載了,這是因為你還沒有設置任何驗證規(guī)則。

由于你還沒有告訴表單驗證類驗證什么東西,它默認返回 FALSE, run() 方法只在全部成功匹配了你的規(guī)則后才會返回 TRUE 。

解釋

在這個頁面上你會注意到以下幾點:

例子中的表單(myform.php)是一個標準的 Web 表單,除了以下兩點:

  1. 它使用了一個 表單輔助函數(shù) 來創(chuàng)建表單的起始標簽。,嚴格來說這并不是必要的, 你完全可以使用標準的 HTML 來創(chuàng)建,使用輔助函數(shù)的好處是它生成 action 的時候, 是基于你配置文件來生成 URL 的,這使得你的應用在更改 URL 時更具移植性。

  2. 在表單的頂部你將注意到如下函數(shù)調(diào)用:

    <?php echo validation_errors(); ?>

    這個函數(shù)將會返回驗證器返回的所有錯誤信息。如果沒有錯誤信息,它將返回空字符串。

控制器(Form.php)有一個方法: index() 。這個方法初始化驗證類, 并加載你視圖中用到的 表單輔助函數(shù) 和 URL 輔助函數(shù),它也會 執(zhí)行 驗證流程, 基于驗證是否成功,它會重新顯示表單或顯示成功頁面。

設置驗證規(guī)則

CodeIgniter 允許你為單個表單域創(chuàng)建多個驗證規(guī)則,按順序層疊在一起, 你也可以同時對表單域的數(shù)據(jù)進行預處理。要設置驗證規(guī)則, 可以使用set_rules() 方法:

$this->form_validation->set_rules();

上面的方法有 三個 參數(shù):

  1. 表單域名 - 就是你給表單域取的那個名字。
  2. 表單域的 "人性化" 名字,它將被插入到錯誤信息中。例如, 如果你有一個表單域叫做 “user” ,你可能會給它一個人性化的名字叫做 “用戶名” 。
  3. 為此表單域設置的驗證規(guī)則。
  4. (可選的)當此表單域設置自定義的錯誤信息,如果沒有設置該參數(shù),將使用默認的。

注解

如果你想讓表單域的名字保存在一個語言文件里,請參考 翻譯表單域名稱

下面是個例子,在你的控制器(Form.php)中緊接著驗證初始化函數(shù)之后,添加這段代碼:

$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');

你的控制器現(xiàn)在看起來像這樣:

<?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');
        }
    }
}

現(xiàn)在如果你不填寫表單就提交,你將會看到錯誤信息。如果你填寫了所有的表單域并提交,你會看到成功頁。

注解

當出現(xiàn)錯誤時表單頁將重新加載,所有的表單域將會被清空,并沒有被重新填充。 稍后我們再去處理這個問題。

使用數(shù)組來設置驗證規(guī)則

在繼續(xù)之前請注意,如果你更喜歡通過一個操作設置所有規(guī)則的話, 你也可以使用一個數(shù)組來設置驗證規(guī)則,如果你使用這種方式, 你必須像下面這樣來定義你的數(shù)組:

$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);

級聯(lián)規(guī)則(Cascading Rules)

CodeIgniter 允許你將多個規(guī)則連接在一起。讓我們試一試,修改規(guī)則設置函數(shù)中的第三個參數(shù),如下:

$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]');

上面的代碼設置了以下規(guī)則:

  1. 用戶名表單域長度不得小于 5 個字符、不得大于 12 個字符。
  2. 密碼表單域必須跟密碼確認表單域的數(shù)據(jù)一致。
  3. 電子郵件表單域必須是一個有效郵件地址。

馬上試試看!提交不合法的數(shù)據(jù)后你會看到新的錯誤信息,跟你設置的新規(guī)則相符。 還有很多其他的驗證規(guī)則,你可以閱讀驗證規(guī)則參考。

注解

你也可以傳一個包含規(guī)則的數(shù)組給 set_rules() 方法來替代字符串,例如:

$this->form_validation->set_rules('username', 'Username', array('required', 'min_length[5]'));

預處理數(shù)據(jù)

除了上面我們使用的那些驗證函數(shù),你還可以以多種方式來預處理你的數(shù)據(jù)。 例如,你可以設置像這樣的規(guī)則:

$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');

在上面的例子里,我們?nèi)サ糇址畠啥丝瞻祝╰rimming),檢查字符串的長度,確保兩次輸入的密碼一致。

任何只有一個參數(shù)的 PHP 原生函數(shù)都可以被用作一個規(guī)則,比如 htmlspecialcharstrim 等等。

注解

你一般會在驗證規(guī)則之后使用預處理功能,這樣如果發(fā)生錯誤,原數(shù)據(jù)將會被顯示在表單。

重新填充表單

目前為止我們只是在處理錯誤,是時候用提交的數(shù)據(jù)重新填充表單了。 CodeIgniter 為此提供了幾個輔助函數(shù),你最常用到的一個是:

set_value('field name')

打開 myform.php 視圖文件并使用 set_value() 函數(shù)更新每個表單域的  :

不要忘記在 :php:func:set_value() 函數(shù)中包含每個表單域的名字!

<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>

現(xiàn)在刷新你的頁面并提交表單觸發(fā)一個錯誤,你的表單域應該被重新填充了。

注解

下面的 類參考 節(jié)包含了可以讓你重填下拉菜單,單選框和復選框的函數(shù)。

重要

如果你使用一個數(shù)組作為一個表單域的名字,那么函數(shù)的參數(shù)也應該是一個數(shù)組。例如:

<input type="text" name="colors[]" value="<?php echo set_value('colors[]'); ?>" size="50" />

更多信息請參考下面的 使用數(shù)組作為域名稱 一節(jié)。

回調(diào):你自己的驗證函數(shù)

驗證系統(tǒng)支持設置你自己的驗證函數(shù),這樣你可以擴展驗證類以適應你自己的需求。 例如,如果你需要查詢數(shù)據(jù)庫來檢查用戶名是否唯一,你可以創(chuàng)建一個回調(diào)函數(shù), 讓我們來新建一個例子。

在你的控制器中,將用戶名的規(guī)則修改為:

$this->form_validation->set_rules('username', 'Username', 'callback_username_check');

然后在你的控制器中添加一個新的方法 username_check() 。你的控制器現(xiàn)在看起來是這樣:

<?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” 作為用戶名提交數(shù)據(jù),你會看到表單域數(shù)據(jù)被傳遞到你的回調(diào)函數(shù)中處理了。

要調(diào)用一個回調(diào)函數(shù)只需把函數(shù)名加一個 "callback_" 前綴并放在驗證規(guī)則里。 如果你需要在你的回調(diào)函數(shù)中調(diào)用一個額外的參數(shù),你只需要在回調(diào)函數(shù)后面用[]把參數(shù) (這個參數(shù)只能是字符串類型)括起來,例如:"callback_foo[bar]" , 其中 bar 將成為你的回調(diào)函數(shù)中的第二個參數(shù)。

注解

你也可以對傳給你的表單數(shù)據(jù)進行處理并返回,如果你的回調(diào)函數(shù)返回了除布爾型的 TRUE 或 FALSE 之外的任何值,它將被認為是你新處理過的表單數(shù)據(jù)。

使用任何可調(diào)用的方法作為驗證規(guī)則

如果回調(diào)的規(guī)則對你來說還不夠好(譬如,它們被限制只能定義在控制器中), 別失望,還有一種方法來創(chuàng)建自定義的規(guī)則:任何 is_callable() 函數(shù)返回 TRUE 的東西都可以作為規(guī)則。

看下面的例子:

$this->form_validation->set_rules(
    'username', 'Username',
    array(
        'required',
        array($this->users_model, 'valid_username')
    )
);

上面的代碼將使用 Users_model 模型的 valid_username() 方法來作為驗證規(guī)則。

當然,這只是個例子,規(guī)則不只限于使用模型的方法,你可以使用任何對象和方法 來接受域值作為第一個參數(shù)。如果你使用 PHP 5.3+ ,還可以使用匿名方法:

$this->form_validation->set_rules(
    'username', 'Username',
    array(
        'required',
        function($value)
        {
            // Check $value
        }
    )
);

但是,由于可調(diào)用的規(guī)則并不是一個字符串,也沒有一個規(guī)則名,所以當你需要為它們設置 相應的錯誤消息時會有麻煩。為了解決這個問題,你可以將這樣的規(guī)則放到一個數(shù)組的第二個值, 第一個值放置規(guī)則名:

$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

如果要為某個規(guī)則設置你的自定義信息你可以編輯那個文件,或使用下面的方法:

$this->form_validation->set_message('rule', 'Error Message');

如果你要為某個域的某個規(guī)則設置你的自定義信息,可以使用 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 是該規(guī)則的名稱,Error Message 為該規(guī)則顯示的錯誤信息。

如果你希望在錯誤信息中包含域的人性化名稱,或者某些規(guī)則設置的一個可選參數(shù) (例如:max_length),你可以在消息中使用 {field} 和 {param} 標簽:

$this->form_validation->set_message('min_length', '{field} must have at least {param} characters.');

如果域的人性化名稱為 Username ,并有一個規(guī)則 min_length[5] ,那么錯誤信息會顯示: "Username must have at least 5 characters."

注解

老的 sprintf() 方法和在字符串使用 %s 也還可以工作,但是會覆寫掉上面的標簽。 所以你同時只應該使用兩個中的一個。

在上面回調(diào)的例子中,錯誤信息是通過方法的名稱(不帶 "callback_" 前綴)來設置的:

$this->form_validation->set_message('username_check')

翻譯表單域名稱

如果你希望將傳遞給 set_rules() 方法的人性化名稱存儲在一個語言文件中, 使他們能被翻譯成其他語言,你可以這么做:

首先,給人性化名稱添加一個前綴:lang:,如下:

$this->form_validation->set_rules('first_name', 'lang:first_name', 'required');

然后,將該名稱保存到你的某個語言文件數(shù)組中(不帶前綴):

$lang['first_name'] = 'First Name';

注解

如果你保存的語言文件沒有自動被 CI 加載,你要記住在你的控制器中使用下面的方法手工加載:

$this->lang->load('file_name');

關于語言文件的更多信息,參看 語言類 。

更改錯誤定界符

在默認情況下,表單驗證類會使用 標簽來分割每條錯誤信息。 你可以通過全局的,單獨的,或者通過配置文件對其進行自定義。

  1. 全局的修改定界符 要在全局范圍內(nèi)修改錯誤定界符,你可以在控制器方法中加載表單驗證類之后,使用下面的代碼:

    $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() 方法。

嘗試一下!修改你的表單如下:

<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" />

如果沒有錯誤信息,將不會顯示。如果有錯誤信息,將會在輸入框的旁邊單獨顯示。

重要

如果你使用一個數(shù)組作為一個表單域的名字,那么函數(shù)的參數(shù)也應該是一個數(shù)組。例如:

<?php echo form_error('options[size]'); ?>
<input type="text" name="options[size]" value="<?php echo set_value("options[size]"); ?>" size="50" />

更多信息,請參考下面的 使用數(shù)組作為域名稱 一節(jié)。

驗證數(shù)組(除 $_POST 數(shù)組)

有時你可能希望對一個單純的數(shù)組進行驗證,而不是對 $_POST 數(shù)組。

在這種情況下,你可以先定義要驗證的數(shù)組:

$data = array(
    'username' => 'johndoe',
    'password' => 'mypassword',
    'passconf' => 'mypassword'
);

$this->form_validation->set_data($data);

創(chuàng)建驗證規(guī)則,運行驗證,獲取錯誤消息和上面說講的那些驗證 $_POST 數(shù)組是一樣的。

重要
如果你想驗證多個數(shù)組,那么你應該在驗證下一個新數(shù)組之前先調(diào)用 reset_validation() 方法。

更多信息,請參數(shù)下面的 類參考 一節(jié)。

將一系列驗證規(guī)則保存到一個配置文件

表單驗證類的一個不錯的特性是,它允許你將整個應用的所有驗證規(guī)則存儲到一個配置文件中去。 你可以對這些規(guī)則進行分組,這些組既可以在匹配控制器和方法時自動加載,也可以在需要時手動調(diào)用。

如何保存你的規(guī)則

如果要保存驗證規(guī)則,你需要在 application/config/ 目錄下創(chuàng)建一個名為 form_validation.php 的文件。 然后在該文件中,將驗證規(guī)則保存在數(shù)組 $config 中即可。和之前介紹的一樣,驗證規(guī)則數(shù)組格式如下:

$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'
    )
);

你的驗證規(guī)則會被自動加載,當用戶觸發(fā) run() 方法時被調(diào)用。

請務必要將數(shù)組名稱定義成 $config 。

創(chuàng)建規(guī)則集

為了將你的多個規(guī)則組織成規(guī)則集,你需要將它們放置到子數(shù)組中。 請參考下面的例子,在此例中我們設置了兩組規(guī)則集,我們分別命名為 "signup" 和 "email" ,你可以根據(jù)自己的需求任意命名:

$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'
        )
    )
);

調(diào)用某組驗證規(guī)則

為了調(diào)用特定組的驗證規(guī)則,你可以將它的名稱傳給 run() 方法。 例如,使用 signup 規(guī)則你可以這樣:

if ($this->form_validation->run('signup') == FALSE)
{
    $this->load->view('myform');
}
else
{
    $this->load->view('formsuccess');
}

將控制器方法和規(guī)則集關聯(lián)在一起

調(diào)用一組規(guī)則的另一種方法是將控制器方法和規(guī)則集關聯(lián)在一起(這種方法也更自動), 例如,假設你有一個控制器類 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');
        }
    }
}

在你的驗證規(guī)則配置文件中,使用 member/signup 來給這組規(guī)則集命名:

$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'
        )
    )
);

當一組規(guī)則的名稱和控制器類/方法名稱完全一樣時,它會在該控制器類/方法中自動被 run() 方法調(diào)用。

使用數(shù)組作為域名稱

表單驗證類支持使用數(shù)組作為域名稱,比如:

<input type="text" name="options[]" value="" size="50" />

如果你將域名稱定義為數(shù)組,那么在使用域名稱作為參數(shù)的 輔助函數(shù)函數(shù) 時, 你必須傳遞給他們與域名稱完全一樣的數(shù)組名,對這個域名稱的驗證規(guī)則也一樣。

例如,為上面的域設置驗證規(guī)則:

$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" />

你也可以使用多維數(shù)組作為域的名稱,例如:

<input type="text" name="options[size]" value="" size="50" />

甚至:

<input type="text" name="sports[nba][basketball]" value="" size="50" />

和上面的例子一樣,你必須在輔助函數(shù)中使用完全一樣的數(shù)組名:

<?php echo form_error('sports[nba][basketball]'); ?>

如果你正在使用復選框(或其他擁有多個選項的域),不要忘了在每個選項后加個空的方括號, 這樣,所有的選擇才會被添加到 POST 數(shù)組中:

<input type="checkbox" name="options[]" value="red" />
<input type="checkbox" name="options[]" value="blue" />
<input type="checkbox" name="options[]" value="green" />

或者,使用多維數(shù)組:

<input type="checkbox" name="options[color][]" value="red" />
<input type="checkbox" name="options[color][]" value="blue" />
<input type="checkbox" name="options[color][]" value="green" />

當你使用輔助函數(shù)時,也要添加方括號:

<?php echo form_error('options[color][]'); ?>

規(guī)則參考

下表列出了所有可用的原生規(guī)則:

規(guī)則 參數(shù) 描述 例子
required No 如果表單元素為空,返回 FALSE  
matches Yes 如果表單元素值與參數(shù)中對應的表單字段的值不相等,返回 FALSE matches[form_item]
regex_match Yes 如果表單元素不匹配正則表達式,返回 FALSE regex_match[/regex/]
differs Yes 如果表單元素值與參數(shù)中對應的表單字段的值相等,返回 FALSE differs[form_item]
is_unique Yes 如果表單元素值在指定的表和字段中并不唯一,返回 FALSE 注意:這個規(guī)則需要啟用查詢構造器 is_unique[table.field]
min_length Yes 如果表單元素值的長度小于參數(shù)值,返回 FALSE min_length[3]
max_length Yes 如果表單元素值的長度大于參數(shù)值,返回 FALSE max_length[12]
exact_length Yes 如果表單元素值的長度不等于參數(shù)值,返回 FALSE exact_length[8]
greater_than Yes 如果表單元素值小于或等于參數(shù)值或非數(shù)字,返回 FALSE greater_than[8]
greater_than_equal_to Yes 如果表單元素值小于參數(shù)值或非數(shù)字,返回 FALSE greater_than_equal_to[8]
less_than Yes 如果表單元素值大于或等于參數(shù)值或非數(shù)字,返回 FALSE less_than[8]
less_than_equal_to Yes 如果表單元素值大于參數(shù)值或非數(shù)字,返回 FALSE less_than_equal_to[8]
in_list Yes 如果表單元素值不在規(guī)定的列表中,返回 FALSE in_list[red,blue,green]
alpha No 如果表單元素值包含除字母以外的其他字符,返回 FALSE  
alpha_numeric No 如果表單元素值包含除字母和數(shù)字以外的其他字符,返回 FALSE  
alpha_numeric_spaces No 如果表單元素值包含除字母、數(shù)字和空格以外的其他字符,返回 FALSE 應該在 trim 之后使用,避免首尾的空格  
alpha_dash No 如果表單元素值包含除字母/數(shù)字/下劃線/破折號以外的其他字符,返回 FALSE  
numeric No 如果表單元素值包含除數(shù)字以外的字符,返回 FALSE  
integer No 如果表單元素包含除整數(shù)以外的字符,返回 FALSE  
decimal No 如果表單元素包含非十進制數(shù)字時,返回 FALSE  
is_natural No 如果表單元素值包含了非自然數(shù)的其他數(shù)值 (不包括零),返回 FALSE 自然數(shù)形如:0、1、2、3 .... 等等。  
is_natural_no_zero No 如果表單元素值包含了非自然數(shù)的其他數(shù)值 (包括零),返回 FALSE 非零的自然數(shù):1、2、3 .... 等等。  
valid_url No 如果表單元素值包含不合法的 URL,返回 FALSE  
valid_email No 如果表單元素值包含不合法的 email 地址,返回 FALSE  
valid_emails No 如果表單元素值包含不合法的 email 地址(地址之間用逗號分割),返回 FALSE  
valid_ip No 如果表單元素值不是一個合法的 IP 地址,返回 FALSE 通過可選參數(shù) "ipv4" 或 "ipv6" 來指定 IP 地址格式。  
valid_base64 No 如果表單元素值包含除了 base64 編碼字符之外的其他字符,返回 FALSE  

注解

這些規(guī)則也可以作為獨立的函數(shù)被調(diào)用,例如:

$this->form_validation->required($string);

注解

你也可以使用任何一個接受兩個參數(shù)的原生 PHP 函數(shù)(其中至少有一個參數(shù)是必須的,用于傳遞域值)

預處理參考

下表列出了所有可用的預處理方法:

名稱 參數(shù) 描述
prep_for_form No 將特殊字符的轉換,以便可以在表單域中顯示 HTML 數(shù)據(jù),而不會破壞它
prep_url No 當 URL 丟失 "http://" 時,添加 "http://"
strip_image_tags No 移除 HTML 中的 image 標簽,只保留 URL
encode_php_tags No 將 PHP 標簽轉成實體

注解

你也可以使用任何一個接受一個參數(shù)的原生 PHP 函數(shù)。 例如: trim() 、 htmlspecialchars() 、 urldecode() 等

類參考

classCI_Form_validation

set_rules($field[, $label = ''[, $rules = '']])

參數(shù):

  • $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

允許您設置驗證規(guī)則,如在本教程上面描述的:

    以上內(nèi)容是否對您有幫助:
    在線筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號
    微信公眾號

    編程獅公眾號