このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0297

CI_Form_validation

 「CI_Form_validation」ライブラリクラスは、POSTされたデータの検証や整形を行います。
 検証の対象となるデータは常に「POSTデータ」であり、他のデータを検証・整形することはできません。

 「CI_Form_validation」の大まかな利用方法は、以下のようになります。

  1. 検証ルールをセットする
  2. POSTデータの各フィールドのデータを検証する
  3. 不正データがあれば、エラーメッセージをキャッシュする
  4. POSTフィールドのデータを取得する

CI_Form_validationクラスのロード

 「CI_Loader」クラスの「library()」メソッドで 「CI_Form_validation」クラスをロードします。

 「CI_Form_validation」クラスは、コンストラクタ内で「Form」ヘルパーをロードしているため、 「CI_Form_validation」をロードすると自動的に「Form」ヘルパーの機能が利用できるようになります。

    $this->load->library('form_validation');

 「CI_Form_validation」クラスをロードする際に、併せてバリデーションルールを指定することができます。 ルールを指定するには、各POSTフィール毎の連想配列のルールを配列にし、バリデーションルールセットとして、 第二引数に指定します。

    $rules = array(
        $rule1,
        $rule2,
    );
    $this->load->library('form_validation', $rules);

バリデーションルール

 「CI_Form_validation」では、バリデーションルールを各POSTフィールド毎に対してルールを作成する必要があります。
 各ルールは、配列データで「ルールセット」としたり、また、「ルールセット」を連想配列データとして
グループ化することができます。


POSTフィールド毎のルールデータ

 各POSTフィールドのルールには「field」「label」「rules」の3つのパラメータにより管理されています。

    $rule = array (
        'field' => 'account', // POSTフィールド名
        'label' => 'アカウント', // POSTフィールドラベル
        'rules' => 'required', // ルール
    )
    • field
    • POSTデータのフィールド名です。HTMLページからデータが送信される場合は、「<form>」タグ内の 「<input>」タグや、「<select>」タグ、「<textarea>」タグの「name=」属性で指定された値となります。

    • label
    • 各フィールドを表わす文字列となります。エラーメッセージで利用されます。
      エラーメッセージにラベルを表示しなければ「空文字列」を指定しても構いません。
      値を指定しない場合は、「field」の設定値に置き換えられます。
      (空文字を指定すれば置き換えられません)

    • rules
    • バリデーションルールを記述します。
      バリデーションルールは「CI_Form_validation」が用意しているルール、
      ユーザカスタマイズルール、及び、PHP関数が利用できます。


rules の記述

 「rules」の記述は、「CI_From_validation」が用意しているルール名、ユーザが作成したルール名、
及び、PHP関数名を記述します。
 また、複数のルールを適用する場合は「|」パイプ文字で続けて記述していきます。「|」パイプ文字で記述された ルールが順番に処理されていくことになります。
 PHP関数は、引数として文字列を受け取り、その文字列を処理した結果文字列を返す関数が利用できます。

    'trim|alpha|max_length|my_rule|strtolower'

    上記のルールは、以下の順番でデータを処理していきます。

    • PHPの「trim()」関数でトリミング
    • 「CI_Form_validation」の「alpha()」メソッドで検証
    • 「CI_Form_validation」の「max_length()」メソッドで検証
    • ユーザが作成した「my_rule()」メソッドで検証
    • PHPの「strtolower()」関数で小文字に整形

 バリデーションルールセット

 バリデーションルールは、POSTデータの各フィールドそれぞれ個別に指定していきます。
バリデーションルールセットは、この個別のルールの配列となります。

    $config = array(
        array(
           'field' => 'item_id',
           'label' => '商品ID',
           'rules' => 'alpha_numeric|min_length[3]|max_length[5]',
        ),
        array(
           'field' => 'qty',
           'label' => '数量',
           'rules' => 'is_natural_no_zero|less_than[10000]',
        ),
        array(
           'field' => 'color',
           'label' => 'カラー',
           'rules' => 'my_rule_color',
        ),
    )

ルールセットのグループ化

 バリデーションルールセットをグループ化して、複数のルールセットとして定義することも可能です。
 ルールセットをグループ化するには、それぞれのルールセットを識別する「添え字(インデックスキー)」で 連想配列にします。

    $config = array(
      'item_rule' => array(
          array(
             'field' => 'item_id',
             'label' => '商品ID',
             'rules' => 'alpha_numeric|min_length[3]|max_length[5]',
          ),
          array(
             'field' => 'qty',
             'label' => '数量',
             'rules' => 'is_natural_no_zero|less_than[10000]',
          ),
          array(
             'field' => 'color',
             'label' => 'カラー',
             'rules' => 'my_rule_color',
          ),
      ),
      'account_rule' => array(
          array(
             'field' => 'account',
             'label' => 'アカウント',
             'rules' => 'ialpha_dash|min_length[4]|max_length[8]',
          ),
          array(
             'field' => 'mail_addr',
             'label' => 'メールアドレス',
             'rules' => 'valid_email',
          ),
      ),
    )

URIパスによるグループ化

 識別子によるグループ化の他に、バリデーションルールセットをURIパスによりグループ化することも
可能です。

 リクエストを処理する「コントローラ」とその「アクションメソッド」の組み合わせにより、 バリデーションルールセットをグループ化します。
 グループ化の識別子文字列が、リクエストされた「コントローラ/アクションメソッド」にマッチすると自動で、 設定したルールが適用されます。

    $config = array(
      'item/order' => array(
          array(
             'field' => 'item_id',
             'label' => '商品ID',
             'rules' => 'alpha_numeric|min_length[3]|max_length[5]',
          ),
          array(
             'field' => 'qty',
             'label' => '数量',
             'rules' => 'is_natural_no_zero|less_than[10000]',
          ),
          array(
             'field' => 'color',
             'label' => 'カラー',
             'rules' => 'my_rule_color',
          ),
      ),
      'account/register' => array(
          array(
             'field' => 'account',
             'label' => 'アカウント',
             'rules' => 'ialpha_dash|min_length[4]|max_length[8]',
          ),
          array(
             'field' => 'mail_addr',
             'label' => 'メールアドレス',
             'rules' => 'valid_email',
          ),
      ),
    )

バリデーションルールをセットする

 「CI_Form_validation」では、必ずバリデーションルールをセットする必要があり、 ルールをセットせずに検証を行うと、全ての検証データは不正データとして処理されます。

 バリデーションルールをセットする方法は3つあります。

  1. 「application/config/form_validation.php」設定ファイルで設定する
  2. // application/config/form_validation.php
    $config = array(
        // 省略 (ルールセット、ルールセットグループ化参照のこと)
    );
    $this->load->library('form_validation');
  3. 「CI_Loader」の「library()」メソッドで「CI_Form_validation」クラスをロードする際に指定する
  4. $rule_set = array(
        // 省略 (ルールセット、ルールセットグループ化参照のこと)
    );
    $this->load->library('form_validation', $rule_set);
  5. 「CI_Form_validation」クラスの「set_rules()」メソッドで個別にルールをセットする
  6. $this->load->library('form_validation');

    $rule = array(
        'field' => 'account',
        'label' => 'アカウント',
        'rules' => 'required',
    );
    $this->form_validation->set_rules($rule);
    $this->form_validation->set_rules('mail_addr', 'メールアドレス', 'valid_email');

CI_Form_validationで用意されているバリデーションルール

 「CI_Form_validation」クラスで用意されているルールには以下のものがあります。
 これらのうちいくつかはオプションを指定する必要があり、オプションはルール名の後ろに「[  ]」で囲み指定します。

ルール名[オプション] オプション例 説明
required 必須項目
空文字または、空配列は「FALSE」となります
regex_match[正規表現] [/^xyz\d+$/] PHPの「preg_match()」メソッドの第一引数で指定する形式で正規表現をオプションに指定し、正規表現にマッチすると「TRUE」を返します。
matches[フィールド名] [mailaddr2] 他のPOSTフィールドデータと同じか比較し、同じであれば「TRUE」を返します。メールアドレスの確認などで利用します。
is_unique[tabl.column] [item_tbl.item_id] DBにアクセスしてデータがユニーク(一意)であるか確認します。DBは「default」が利用されます。
min_length[正数値] [4] 最低文字数をチェックします。「mb_strlen()」メソッドが利用可能な環境では、「mb_strlen()」メソッドで文字数をカウントして比較されます。
max_length[正数値] [12] 最大文字数をチェックします。「mb_strlen()」メソッドが利用可能な環境では、「mb_strlen()」メソッドで文字数をカウントして比較されます。
exact_length[正数値] [10] 文字数がオプションで指定した数値と同じかチェックします。
valid_email メールアドレスの形式がある程度正しいか確認します。ドコモの「@」の直前に「.(ドット)」がつくアドレスは不正とみなされるのでドコモのメールアドレスチェックには使えません…
valid_emails 「,(カンマ)」区切りで複数記述されたメールアドレスをチェックします。各メールアドレスのチェックには「valid_email」が利用されます。
valid_ip IPアドレスの書式かどうかチェックします。
alpha 文字列が全て英字かどうかチェックします。正規表現「/^([a-z])+$/i」でチェックされています。
alpha_numeric 文字列が全て英字と数字かどうかチェックします。正規表現「/^([a-z0-9])+$/i」でチェックされています。
alpha_dash 文字列が全て英字、数字、「_(アンダスコア)」か「-(ハイフン)」かどうかチェックします。正義表現「/^([-a-z0-9_-])+$/i」でチェックされています。
numeric 数値かどうかチェックします。先頭に「+」「-」不等号がある場合も「TRUE」となります。小数も「TRUE」です。
is_numeric PHPの「is_numeric()」関数のラッパーです。16進数表記(0xFFなど)も「TRUE」です。
integer 整数かどうかチェックします。先頭に「+」「-」不等号がある場合も「TRUE」と>なります。
decimal 小数かどうかチェックします。先頭に「+」「-」不等号がある場合も「TRUE」と>なります。
greater_than[数値] [0] 指定された数値よりも大きいかチェックします。同数は「FALSE」です。
less_than[数値] [100] 指定された数値よりも小さいかチェックします。同数は「FALSE」です。
is_natural 0 を含む正の自然数かチェックします。正規表現「/^[0-9]+$/」でチェックされています。
is_natural_no_zero 0 を含まない正の自然数かチェックします。
valid_base64 Base64エンコードされた文字列かチェックします。

CI_Form_validationで用意されている整形ルール

ルール名 説明
prep_for_form POSTデータをHTMLのFORMに再表示させる際に適切に表示されるよう「'」「"」「<」「>」が、 それぞれ、「&#39;」、「 &quot;」、「 &lt;」、「 &gt;」に置き換えられます。 また、PHPの「stripslashes()」関数で処理されます。
prep_url POSTデータの文字列の先頭に「http://」もしくは、「https://」がついていない場合、「http://」を付加します。
xss_clean POSTデータをXSS除染します。
CI_Security」クラスの「xss_clean()」メソッド のラッパーです。
encode_php_tags PHPタグをHTML特殊文字に変換します。
「<?php」「<?PHP」「<?」「?>」をそれぞれ、 「&lt;?php」「&lt;?PHP」「&lt;?」「?&gt;」に変換します。
strip_image_tags CodeIgniter 2.1.0 では、この整形ルールは、以下のエラーとなり利用できません。 完全にCodeIgniterのバグとなっています。
Fatal error: Call to undefined method CI_Input::strip_image_tags()

エラーメッセージの定義

 FORMから送られたデータを検証するときは、通常、データが不正だった場合に表示する「エラーメッセージ」の 処理も必要になってくると思います。

 バリデーションルールはエラーメッセージとセットになっていなければならず、言い換えれば、 全てのバリデーションルールに対してエラーメッセージを定義する必要があります。

 エラーメッセージを定義するには、言語ファイルで定義するか「set_message()」メソッドで定義します。

 言語ファイル (form_validation_lang.php)

 「CI_Form_validation」クラスで用意されているバリデーションルールに対応するエラーメッセージは、 デフォルトで「system/language/english/form_validation_lang.php」言語ファイルに定義されています。
 これを変更したい場合は、「system/language/english/form_validation_lang.php」言語ファイルを修正せずに、 「application/language/言語/」ディレクトリにコピーしてエラーメッセージを修正します。

    $ cp system/language/english/form_validation_lang.php application/language/japanese/

set_message($lang, $val = '')

 「set_message()」メソッドで定義すると言語ファイルのエラーメッセージ定義より優先されます。

 「set_message()」メソッドでのエラーメッセージ定義は、一つずつ定義していく方法と、 複数をまとめて定義する方法があります。

    • 一つずつ定義
    $this->form_validation->set_message('required', '%s は必須項目です。');

    「 %s 」は、エラーメッセージがページに描画される際に「set_rules()」メソッドの第二引数で指定した ラベル名に置き換えられます。

    • まとめて定義
    $err_msg = array(
        'alpha' => '%s は英字を入力してください。',
        'max_length' => '%s が文字数オーバーです。',
        'is_natural' => '%s は数値を入力してください。',
    );
    $this->form_validation->set_message($err_msg);

データの検証

 「CI_Form_validation」クラスでは、常に検証データの対象はPOSTデータとなるため、 「CI_Form_validation」インスタンスにデータを指定する必要はありません。

 「CI_Form_validation」クラスをロードして、「set_rules()」メソッドでバリデーションルールがセットされた後は、 「run()」メソッドでPOSTフィールドデータを一括して検証します。

    $this->form_validation->run();
    • グループ化されたルールの検証
    $this->form_validation->run('item_rule');

     バリデーションルールをグループ化している場合は、引数にグループ名を指定する必要があります。

エラーメッセージの取得

 「run()」メソッドで「FALSE」が返った場合はエラーメッセージを取得して、 ビューに渡すことで、エラーメッセージをページに表示することができます。


$this->form_validation->error_string($prefix = '', $suffix = '')
validation_errors($prefix = '', $suffix = '') @FORMヘルパー

 「error_string()」メソッドは、バリデーションルールでエラーになったチェック項目すべての エラーメッセージを取得します。

 「validation_errors()」関数は 「FORM ヘルパー」で定義されている「error_string()」メソッドの ラッパー関数です。「error_string()」メソッドの代わりに「validation_errors()」を利用してもエラーメッセージを
取得できます。
(「form ヘルパー」は自動でロードされるので、改めてロードする必要はありません。)

 第一引数には各エラーメッセージの前に付加するHTMLタグなどの文字列を指定し、 第二引数には各エラーメッセージの後ろに付加するHTMLタグなどの文字列を指定することができます。
 デフォルトでは、「<p>」と「</p>」が付加されます。

    if ( $this->form_validation->run() )
    {
        $data['error_message'] = $this>form_validation->error_string();
        $this->load->view('purchase_form', $data);
    }
    • または…
    if ( $this->form_validation->run() )
    {
        $data['error_message'] = validation_errors();
        $this->load->view('purchase_form', $data);
    }

    echo $data['error_message'];
    /*
    <p>名前 は必須項目です。</p>
    <p>数量 は数値を入力してください。</p>
    */

set_error_delimiters($prefix = '<p>', $suffix = '</p>')

 各エラーメッセージの前後に付加するデフォルトの文字列を変更するには、 「set_error_delimiters()」メソッドを実行します。

    $this->form_validation->set_error_delimiters('<div class="err">', '</div>');
    $error_message = $this>form_validation->error_string();
    echo $error_message;
    /*
    <div class="err">名前 は必須項目です。</div>
    <div class="err">数量 は数値を入力してください。</div>
    */

$this->form_validation->error($field = '', $prefix = '', $suffix = '')
form_error($field = '', $prefix = '', $suffix = '') @FORMヘルパー

 第一引数で指定されたフィールドに対するエラーメッセージを取得します。

 第二引数には、エラーメッセージの先頭に付加するプリフィックス文字列を、
 第三引数には、エラーメッセージの後ろに付加する文字列を指定できます。

    echo $this->form_validation->error('account');
    // The account field is required.

 FORMヘルパーの 「form_error()」関数を利用することも可能です。

    echo form_error('account');
    // The account field is required.

CI_From_validationの多言語化

 エラーメッセージ及び、「set_message()」メソッドの「%s」を置き換えるPOSTフィールドのラベルを
多言語化することができます。

 多言語化するには、まず、必要な言語ファイル「form_validation_lang.php」をそれぞれの
言語ディレクトリ「application/language/言語/」に作成します。


ラベルの多言語化

 言語ファイルには、POSTフィールド名を添え字に、値をエラーメッセージに表示するラベルを指定した
連想配列を記述していきます。

  • application/language/japanese/form_validation_lang.php
  • $lang['account'] = 'アカウント名';
    $lang['mailaddr'] = 'メールアドレス';
  • application/language/english/form_validation_lang.php
  • $lang['account'] = 'Account';
    $lang['mailaddr'] = 'Mailaddress';
  • application/language/chinese/form_validation_lang.php
  • $lang['account'] = '帐户';
    $lang['mailaddr'] = '电子邮件地址';

 言語ファイルを作成したら、言語ファイルからラベルを読み込むようにバリデーションルールをセットすることで 多言語化することができます。

 言語ファイルからラベルを読み込むように指定するには、ラベル指定を「 lang:フィールド名 」とします。

  • ルールファイル (application/config/form_validation.php)
  • $config = array(
        array(
           'field' => 'account',
           'label' => 'lang:account',
           'rules' => 'alpha_numeric|min_length[3]|max_length[8]',
        ),
        array(
           'field' => 'mailaddr',
           'label' => 'lang:mailaddr',
           'rules' => 'valid_email',
        ),
    )
  • set_rules()メソッド
  • $this->form_validation->set_rules(
        'account',
        'lang:account',
        'alpha_numeric|min_length[3]|max_length[8]'
    );
    $this->form_validation->set_rules(
        'mailaddr',
        'lang:mailaddr',
        'valid_email'
    );

エラーメッセージの多言語化

 言語ファイルに、バリデーションルール名を添え字とし、 値を表示したい言語でエラーメッセージを指定した連想配列を記述していきます。
 デフォルトの言語ファイル「system/language/english/form_validation_lang.php」ファイルを 「application/language/言語/」ディレクトリにコピーして作成するのがよいでしょう。

  • application/language/japanese/form_validation_lang.php
  • $lang['alpha'] = '%s は英字を入力してください。';
  • application/language/english/form_validation_lang.php
  • $lang['alpha'] = 'Ther %s field may only contain alphabetical characters.';
  • application/language/chinese/form_validation_lang.php
  • $lang['alpha'] = '%s请输入英文';

言語の指定

 言語ファイルを作成し、バリデーションルールをセットしたら、POSTデータを検証する前に
「利用する言語」を指定します。

    $this->config->set_item('language', japanese');
    $this->form_validation->run();