CodeIgniter

バリデーションとは?

ユーザー「入力値」の妥当性を、システム側で「検証」し、適切に処理すること。

バリデーションとは【validation】(バリデート) - IT用語辞典

別名 :validate
検証(する)、実証(する)、認可(する)、妥当性確認、などの意味を持つ英単語。
ITの分野では、対象がその仕様や文法などに照らして適切に記述・構築されているか否かを検証すること、という意味で使われる。

参考リンク

バリデーションクラス

CodeIgniterで用意されているバリデーションクラスを利用して、ユーザーの入力値をチェックします。

処理の流れ

  1. 入力ページ(フォーム)が表示されます。
  2. ユーザーが、入力して送信します。
  3. 間違ったデータが送信された場合や、必要項目が入力されていない場合、エラーメッセージを、入力したデータと一緒にフォームで再表示します。
  4. 送信データが正しい形式になるまで、上記の処理を繰り返します。

データを受け取るページで、入力値のチェック処理を行います。

  1. 必須入力のデータをチェックする。
  2. データが、正しいデータ型か?、データが条件に合致するか?等をチェックする。
    (ユーザー名が送信された場合、許可した文字だけになっているか?等)
  3. セキュリティのためにデータをサニタイズする。
  4. 必要であれば、前もってデータをフォーマットします。
    (前後の余計な空白文字を除去する、等)
  5. データベースに追加するデータを準備します。

フォームバリデーション(検証)の実装

次の3つのファイルを用意します。

ファイル内容
入力ページのビュー入力フォームを設置したビューファイル
結果ページのビュー送信が成功したときに、「成功」"メッセージを表示するビューファイル
コントローラー送信されたデータを受け取り、処理できるようにしたコントローラ内のメソッド

入力ページ

入力フォームのビューファイルを用意する。

applications/views/myform.php

#code(html){{

html>

 <head>
   <title>マイフォーム</title>
 </head>
 <body>
   <?php echo validation_errors(); ?>
   <?php echo form_open('form'); ?>
     <h5>ユーザ名</h5>
     <input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />
     <h5>パスワード</h5>
     <input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" />
     <h5>パスワードの確認</h5>
     <input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" />
     <h5>メールアドレス</h5>
     <input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" />
     <div><input type="submit" value="送信" /></div>
   </form>
 </body>

/html>
}}

結果ページ

バリデーションの結果を表示するビューファイルを用意する。

applications/views/formsuccess.php

#code(html){{

html>

 <head>
   <title>マイフォーム</title>
 </head>
 <body>
   <h3>フォームは正しく送信されました!</h3>
   <p><?php echo anchor('form', 'もう一度!'); ?></p>
 </body>

/html>
}}

コントローラー

入力ページを制御するコントローラーファイルを用意する。

applications/controllers/form.php

#code(php){{

?php

class Form extends CI_Controller {

	
	function index()
	{
		$this->load->helper(array('form', 'url'));
		$this->load->library('form_validation');
		$this->form_validation->set_rules('username', 'ユーザ名', 'required');
		$this->form_validation->set_rules('password', 'パスワード', 'required');
		$this->form_validation->set_rules('passconf', 'パスワードの確認', 'required');
		$this->form_validation->set_rules('email', 'メールアドレス', 'required');
				
		if ($this->form_validation->run() == FALSE)
		{
			$this->load->view('myform');
		}
		else
		{
			$this->load->view('formsuccess');
		}
	}

}
?>
}}

検証ルールを設定する

バリデーションクラスのset_rules()メソッドを使って検証ルールを設定します。

$this->form_validation->set_rules();

set_rules()メソッドの引数

set_rules()メソッドに、3つの引数を指定します。

引数引数の順番内容
フォーム名1番目フォームの name 属性に指定した値
フォームの表示名2番目「user」という入力フィールドの表示名として「名前」等
フォームに設定する検証ルール3番目'required', 'max_length[12]'等、CodeIgniterで用意されている値

set_rules()メソッドの呼出し

コントローラ (form.php) の中で、バリデーションクラスを初期化(ロード)した後、set_rules()メソッドを使います。

#code(php){{
$this->form_validation->set_rules('username', 'ユーザ名', 'required');
$this->form_validation->set_rules('password', 'パスワード', 'required');
$this->form_validation->set_rules('passconf', 'パスワードの確認', 'required');
$this->form_validation->set_rules('email', 'メールアドレス', 'required');
}}

配列を使った検証ルールの一括指定

一回で全ての検証ルールを設定したい場合、set_rules()メソッドの引数を配列にします。
引数の配列は、検証ルール設定メソッドを通る配列の形式で記述しなければいけません。

#code(php){{
$config = array(

              array(
                    'field'   => 'username',
                    'label'   => 'ユーザ名',
                    'rules'   => 'required'
                 ),
              array(
                    'field'   => 'password',
                    'label'   => 'パスワード',
                    'rules'   => 'required'
                 ),
              array(
                    'field'   => 'passconf',
                    'label'   => 'パスワードの確認',
                    'rules'   => 'required'
                 ),   
              array(
                    'field'   => 'email',
                    'label'   => 'メールアドレス',
                    'rules'   => 'required'
                 )
           );

$this->form_validation->set_rules($config);
}}

ルールの連結(カスケード)

set_rules()メソッドの、3番目の引数である「検証ルール」は、複数のルールを指定できます。
各ルールは「|」でつなげて記述します。

#code(php){{
$this->form_validation->set_rules('username', 'ユーザ名', 'required|min_length[5]|max_length[12]');
$this->form_validation->set_rules('password', 'パスワード', 'required|matches[passconf]');
$this->form_validation->set_rules('passconf', 'パスワードの確認', 'required');
$this->form_validation->set_rules('email', 'メールアドレス', 'required|valid_email');
}}

上記の例では、

  1. username フィールドは、5文字より小さくてはだめで、12文字を超えてはいけません。
  2. password フィールドは、パスワード確認フィールドと入力が一致しなければなりません。
  3. email フィールドは、正しいメールアドレスの形式でなければなりません。
    というルールを追加してします。

データの整形

バリデーションの機能は、データの整形をすることもできます。
たとえば、以下のように、ルールを追加することができます。

#code(php){{
$this->form_validation->set_rules('username', 'ユーザ名', 'trim|required|min_length[5]|max_length[12]|xss_clean');
$this->form_validation->set_rules('password', 'パスワード', 'trim|required|matches[passconf]|md5');
$this->form_validation->set_rules('passconf', 'パスワードの確認', 'trim|required');
$this->form_validation->set_rules('email', 'メールアドレス', 'trim|required|valid_email');
}}

上記の例では、

  1. トリミング(文字列の先頭と末尾にある空白の除去)を行う
  2. パスワードを MD5 に変換する
  3. 悪意のあるデータを取り除く "xss_clean" 機能を通す
    というルール(処理)を追加してします。

独自の検証ルール

コールバックメソッドを作ると、独自の検証ルールを設定できます。
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#callbacks

CodeIgniterのバリデーションクラスは、検証ルールを設定するset_rules()メソッドの第3引数によって、他のメソッド(=コールバックメソッド)を呼び出す仕組みになっており、いろいろな検証作業をさせることができます。

system/libraries/Form_validation.php

のソースコードを見ると、仕組みの詳細が分かります。

  1. CodeIgniterが、標準で用意している検証作業(のメソッド)
  2. ユーザーが独自に定義できる検証作業(のメソッド)
    が使えます。

以下は、ユーザーが独自に定義できる検証作業(=コールバックメソッドを自前で用意する方法)の説明になります。

コールバック: ユーザ定義の検証メソッド

ユーザ定義の検証メソッドへのコールバックが、CodeIgniterでサポートされています。
この機能を使えば、検証ルールを拡張することができます。

例えば、ユーザー名の登録において、固有の名前かどうかを調べるためにデータベースを参照する必要がある場合など、コールバックメソッドを作って調べることができます。
これは、次のような方法でできます。

  1. 検証ルールで、「username」に適用するルールを次のように変更します。

    #code(php){{
    $this->form_validation->set_rules('username', 'ユーザ名', 'callback_username_check');
    }}

  2. 次に「username_check」という名前の新しいメソッドをコントローラに追加します。

    #code(php){{

    ?php

class Form extends CI_Controller {

   function index()
   {
       $this->load->helper(array('form', 'url'));
       $this->load->library('form_validation');
       $this->form_validation->set_rules('username', 'ユーザ名', 'callback_username_check');
       $this->form_validation->set_rules('password', 'パスワード', 'required');
       $this->form_validation->set_rules('passconf', 'パスワードの確認', 'required');
       $this->form_validation->set_rules('email', 'メールアドレス', 'required');
       if ($this->form_validation->run() == FALSE)
       {
           $this->load->view('myform');
       }
       else
       {
           $this->load->view('formsuccess');
       }
   }
   // callback method for original validation rules
   function username_check($str)
   {
       if ($str == 'test')
       {
           $this->form_validation->set_message('username_check', 'フィールド %s に、"test"は使えません');
           return FALSE;
       }
       else
       {
           return TRUE;
       }
   }

}
?>
}}

set_rules()メソッドの第3引数で、自前で用意したコールバックメソッドを呼び出すには、「callback_」+「コールバックメソッド名」という値を指定すればOKと。

CodeIgniterのバリデーションクラスで用意されている既存の検証ルールではチェックできない条件も、自前でコールバックメソッドを用意すればチェックできるようになります。

正規表現を使った細かいチェック等をやりたい場合に便利な機能ですね!

例:郵便番号の形式「123-4567」に合致しているかチェックする等。

検証の実行

バリデーションクラスのrun()メソッドで、ユーザー入力値の検証を実行します。

$this->form_validation->run();

run()メソッドは、ユーザー入力値の検証を実行し、

成功時は、入力値に基づいて、必要な処理を行う。
失敗時は、ユーザーに再入力させる → 入力フォームを再表示する。

run()メソッドの引数

run()メソッドは、検証ルールの「グループ名」を引数として渡せます。
検証ルールのグループ名とは、複数の検証ルールを配列の形(=グループ)で設定してある場合の、個別のルールの名前です。

(参考)検証ルールのセットを作る

http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#savingtoconfig

コントローラーの記述例:

#code(php){{
$config = array(

   'signup' => array(
       array(
           'field' => 'username',
           'label' => 'ユーザ名',
           'rules' => 'required'
       ),
       array(
           'field' => 'password',
           'label' => 'パスワード',
           'rules' => 'required'
       ),
       array(
           'field' => 'passconf',
           'label' => 'パスワードの確認',
           'rules' => 'required'
       ),
       array(
           'field' => 'email',
           'label' => 'メールアドレス',
           'rules' => 'required'
       )
   ),
   'email' => array(
       array(
           'field' => 'emailaddress',
           'label' => 'メールアドレス',
           'rules' => 'required|valid_email'
       ),
       array(
           'field' => 'name',
           'label' => '名前',
           'rules' => 'required|alpha'
       ),
       array(
           'field' => 'title',
           'label' => 'タイトル',
           'rules' => 'required'
       ),
       array(
           'field' => 'message',
           'label' => 'メッセージ本文',
           'rules' => 'required'
       )
   )                          

);

if ($this->form_validation->run('signup') == FALSE)
{

  $this->load->view('myform');

}
else
{

  $this->load->view('formsuccess');

}
}}

(参考)検証ルールを自動的に呼び出す方法

run()メソッドには、他にも便利な使い方が用意されています。
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#savingtoconfig

  1. 検証ルールのグループ名を自動的に呼び出すには、検証ルールのグループ名を、検証を実行するコントローラーのクラス名とメソッド名に関連付けます。
  2. 検証ルールのグループは、CodeIgniterの設定ファイル内(application/config/config.php)に記述します。

例:
コントローラーのクラス名を「Member」という名前にして、メソッド名を「signup」という名前にした場合は、以下のようになります。

application/controllers/member.php

#code(php){{

?php

class Member extends CI_Controller {

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

}
?>
}}

CodeIgniterの設定ファイル(application/config/config.php)内で、検証ルールのグループ名として「member/signup」と名付けます。

application/config/config.php

#code(php){{
$config = array(

   'member/signup' => array(
       array(
           'field' => 'username',
           'label' => 'ユーザ名',
           'rules' => 'required'
       ),
       array(
           'field' => 'password',
           'label' => 'パスワード',
           'rules' => 'required'
       ),
       array(
           'field' => 'passconf',
           'label' => 'パスワードの確認',
           'rules' => 'required'
       ),
       array(
           'field' => 'email',
           'label' => 'メールアドレス',
           'rules' => 'required'
       )
   )

);
}}

このように、検証ルールの「グループ名」が、「コントローラー名/メソッド名」に一致する名前のとき、run()メソッドが呼び出された時に、自動的に使用されます。

この方法を使うと、検証ルールを記述する場所が、CodeIgniterの設定ファイル(application/config/config.php)に移動させられるので、コントローラー内のコードがスッキリしますね!
(=検証ルールの量が、やたらと多くなってしまったときに便利!?)

入力フォームの再表示

エラーメッセージ表示

Formヘルパーのvalidation_errors()関数を使って、入力値の検証結果(エラーメッセージ)を表示させることができます。

validation_errors()

validation_errors()関数は、Formヘルパーをロードしないと使えないので注意!

$this->load->helper('form');

validation_errors()関数は、バリデーションクラスのバリデータが返すエラーメッセージを取得して、出力します。
メッセージがなければ、何も出力しません。
(注意:run()メソッドを実行して、検証した後じゃないと、バリデーションクラスからエラーメッセージを取得できません。)

入力ページで、エラーメッセージを表示させる場所に、以下のように記述します。

#code(php){{

?php echo validation_errors(); ?>
}}

(参考)Formヘルパーのvalidation_errors()関数

validation_errors()は、以下の場所で定義されています。

ファイル:

system/helpers/form_helper.php

関数定義:

#code(php){{
/**

* Validation Error String
*
* Returns all the errors associated with a form submission.  This is a helper
* function for the form validation class.
*
* @access	public
* @param	string
* @param	string
* @return	string
*/

if ( ! function_exists('validation_errors'))
{

	function validation_errors($prefix = '', $suffix = '')
	{
		if (FALSE === ($OBJ =& _get_validation_object()))
		{
			return '';
		}
		return $OBJ->error_string($prefix, $suffix);
	}

}
}}

入力値の再表示

Formヘルパーのset_value()関数を使って、ユーザーの入力値を、入力ページで、再表示させることができます。

set_value()

set_value()関数は、Formヘルパーをロードしないと使えないので注意!

$this->load->helper('form');

set_value()関数は、バリデーションクラスのバリデータが返すユーザーの入力値を取得して、出力します。
元々の入力値がなければ、何も出力しません。
(注意:run()メソッドを実行して、検証した後じゃないと、バリデーションクラスから入力値を取得できません。)

入力ページで、ユーザーの入力値を再表示させる場所に、以下のように記述します。

#code(php){{

?php echo set_value('username'); ?>
}}

具体的には、

#code(html){{

h5>ユーザ名</h5>

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

(参考)Formヘルパーのset_value()関数

set_value()は、以下の場所で定義されています。

ファイル:

system/helpers/form_helper.php

関数定義:

#code(php){{
/**

* Form Value
*
* Grabs a value from the POST array for the specified field so you can
* re-populate an input field or textarea.  If Form Validation
* is active it retrieves the info from the validation class
*
* @access	public
* @param	string
* @return	mixed
*/

if ( ! function_exists('set_value'))
{

	function set_value($field = '', $default = '')
	{
		if (FALSE === ($OBJ =& _get_validation_object()))
		{
			if ( ! isset($_POST[$field]))
			{
				return $default;
			}
			return form_prep($_POST[$field], $field);
		}
		return form_prep($OBJ->set_value($field, $default), $field);
	}

}
}}

配列を使うときの注意点

フォームの名前には、配列を使うことができます。
フォームの名前に配列を使う場合、set_value()関数の引数も、配列の形で指定します。

#code(html){{

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

※詳しくは、CodeIgniterのマニュアルを見てください。\(手抜き)/
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#arraysasfields

まとめ

CodeIgniterは、便利だな~!(・∀・)


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS