폼검증 Form Validation

CodeIgniter는 포괄적인 폼 검증및 데이터 준비 클래스를 제공함으로써 작성하시는 코드의 양을 최소화 하도록 해 줍니다.

개요 Overview

CodeIgniter 의 폼 검증 설명으로 들어가기전에 먼저 이상적인 시나리오를 만들어봅시다:

  1. 폼이 표시된다.
  2. 내용을 채우고 전송(submit)한다.
  3. 뭔가 적합하지 않은 것을 전송한다든지, 필수인 항목을 빠뜨린다든지 했을 경우, 폼이 다시 표시되면서 관련 에러 메세지를 뿌려준다.
  4. 정확하게 전송할 때까지 이 과정을 반복한다.

수신측에서의 스크립트는 반드시:

  1. 요구되는 데이터가 모두 들어왔는지 점검한다.
  2. 데이터의 형식이라든지 다른 요구되는 제한사항을 만족하는지 확인한다. 예를 들어, 만약 사용자아이디(username)이 전송되었고 반드시 영문자만을 포함해야한다고 제한한다든지, 최소 최대길이를 지정한다든지, 이미 다른사람이 사용하고 있는아이디를 사용할 수 없다든지,예약어를 사용할 수 없다든지 등의경우가 있을수 있습니다.
  3. 보안을 위해서 데이터를 가공한다.
  4. 필요하다면 데이터를 전처리 한다(좌우공백제거나 html 인코딩 등)
  5. 데이터베이스 입력에 적합하도록 데이터를 준비한다.

위 프로세스가 그리 복잡하지는 않지만, 일반적으로 대단히많은 소스 코드가 필요하고, 에러 코드를 표시하기 위해서 다양한 컨트롤 구조를 html 안에 코딩해야한다. 폼검증코드는 쉬운작업인 반면에 통상 그 양이 방대하고 지루한 작업이다.

폼검증 튜토리얼 Form Validation Tutorial

아래는 CodeIgniter 의 폼검증을 구현하기 위한 “수작업” 튜토리얼 입니다.

폼검을 위해서는 아래 3가지 요소가 필요합니다:

  1. 폼을 포함한 파일.
  2. 전송이 성공했을 때 “성공” 메세지를 보여줄 파일.
  3. 전송된 데이터를 받아서 처리할 컨트롤러 (controller) 함수.

회원가입폼 예제를 통해서 이 세 가지를 만들어 봅시다!

폼 The Form

텍스트 편집기를 이용하여 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>

성공 페이지 The Success Page

텍스트 편집기를 이용하여 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>

컨트롤러 The Controller

텍스트 편집기를 이용하여 Form.php 파일을 만듭니다. 그런 다음 아래 코드를 삽입하고 applications/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');
                }
        }
}

시도해봅시다 Try it!

브라우저에서 아래와 같은 URL 로 접속합니다(여러분의 환경에 맞는 url 입니다. 아래 그대로가 아니라 ..)

example.com/index.php/form/

폼을 전송(submit) 하면 단순히 폼이 리로드(reload) 되는 것을 보실 수 있습니다. 왜나하면 아직 검사(validation) 루틴을 작성하지 않았기 때문입니다.

폼 검사 클래스에 어떤 검사코드도 넣지 않았기 때문에 결과는 FALSE (boolean false) 를 기본값으로 리턴합니다.검사코드를 성공적으로 통과했을 경우에만 run() 함수는TRUE 를 리턴합니다.

설명 Explanation

위 페이지들로부터 여러가지를 아실수 있을거예요:

폼 (myform.php) 은 몇 가지 예외들을 포함한 표준 웹폼(standard web form) 입니다.

  1. 폼은 폼을 여는 태그 대신 폼헬퍼(form helper) 를 사용합니다. 엄밀히말하면, 폼 헬퍼 사용은 꼭 필요하지 않을수 있습니다. 표준 html 을 이용하여 폼을 열 수 있으니까요. 그러나, 폼헬퍼를 사용하면 설정(config)파일에 따라서 액션url(action URL)을 자동으로 생성해줍니다. 그렇게 되면 URL 이 변하더라도 쉽게 처리할 수 있겠지요.

  2. 폼의 맨위에 아래와 같은 함수 호출이 있는 것을 주목하세요:

    <?php echo validation_errors(); ?>
    

    이 함수는 검사(validator)루틴으로부터 되돌아오는 모든 에러 메세지를 리턴합니다. 아무런 메세지가 없다면 빈문자열(empty string)을 리턴합니다.

컨트롤러(controller) (Form.php)는 index() 라는 함수를 가지고 있습니다. 이 함수는 뷰파일에서 사용할 검사클래스(validation class)를 초기화 하고 폼 헬퍼 와 URL 헬퍼를 로드합니다. 또한 검사루틴을 실행(runs) 합니다. 검사루틴을 성공적으로 패스했는지 여부에 따라서 폼 자신이나 성공 페이지를 보여줍니다.

검증 규칙 설정 Setting Validation Rules

검사 규칙은 원하는 만큼 제한 없이 작성하실 수 있으며, 각 규칙들을 순서대로 처리하도록 할 수 있습니다. 또한, 검사와 동시에 필드 데이터들을 전처리(pre-process) 할 수 있습니다. 검사 규칙을 설정하기 위해서는 set_rules() 함수를 사용합니다:

$this->form_validation->set_rules();

위 함수는 3가지 파라미터를 받습니다:

  1. 필드이름-폼에서 설정한 필드이름과 일치해야 합니다.
  2. 위 필드이름에 대한 “사람이 알아보기 쉬운” 이름. 그 이름은 에러 메세지에 삽입됩니다. 예를 들어, 필드 이름이 “user” 라면 사람이 알아보기 쉬운 이름은 “Username” 정도로 하시면 됩니다. 부가설명: 필드이름을 랭귀지파일에 저장하고 싶다면, 필드이름변환을 참조하세요.
  3. 폼에 필요한 검사규칙들.
  4. (옵션) 현재 필드의 어떤 룰에 대한 커스텀 에러 메세지. 만약 제공되지 않으면 기본 에러 메세지를 보입니다.

Note

필드명이 언어 파일에 저장되기 원한다면, 필드명의 변환을 참조해주세요.

예제를 봐주세요. 컨트롤러 (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');
                }
        }
}

자 이제 필드를 공백으로둔 채 폼을 전송해봅시다. 에러 메세지가 보여야 합니다. 만약 필드를 모두 채운상태에서 전송한다면 성공페이지가 보여야 합니다.

Note

지금까지로는 에러가 발생했을 경우, 폼에 이미 입력한데이터는 다시 복원되지않습니다. 곧 복원되도록 만들어 봅시다.

배열을 이용한 검증 규칙 설정 Setting Rules Using an Array

여러 검사규칙을 한 번에 처리하는걸 좋아한다면, 배열을 사용하세요. 이 방법을 사용할 때는 반드시 배열의 키이름을 아래와 같이 해야 합니다:

$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. Username 필드는 5 글자에서 12 글자 사이라야 한다
  2. Password 필드는 패스워드 확인 필드와 일치해야한다.
  3. Email 필드는 유효한 email 주소라야 한다.

해봅시다! 적절하지 않은 데이터를 입력한 후 폼을 전송하시면 여러분이 새로 설정한 규칙에 맞는 에러메시지를 뿌릴것입니다. 레퍼런스에는 사용 가능한 다양한 규칙들이 있습니다.

Note

문자열 대신에 규칙의 배열을 set_rules() 에 전달할 수 있습니다. 예제:

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

데이터 준비 Prepping Data

위에서 사용해 본 검사 함수에 덧붙여, 여러분은 다양한 방법으로 데이터 준비 작업을 하실 수 있습니다. 예를 들어, 아래와 같이 규칙을 설정할 수 있습니다:

$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]');
$this->form_validation->set_rules('password', 'Password', 'trim|required|md5');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required|matches[password]');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');

위 예제에서, 값의 양쪽 여백 제거, 길이 체크, 필수항목 체크, MD5 패스워드 암호화 등을 했습니다.

Note

일반적으로 검증규칙을 적용시킨후 데이터준비(prep)함수를 사용하게 됩니다. 이때 만약 에러가 발생한다면 원래데이터가 폼에 표시되게 됩니다.

폼 데이터를 다시 살리기 Re-populating the form

지금까지는 에러관련부분 처리에 대해서 이야기해왔습니다. 이제는 전송된 데이터를 다시 복원하는 것에 대해서 이야기하겠습니다. CodeIgniter 에서는 그 작업을 위해서 여러가지 헬퍼함수를 제공합니다. 여러분이 가장 많이 사용할 함수는 아래함수입니다:

set_value('field name')

myform.php 뷰 파일을 연후 각 필드의 value 부분을 set_value() 함수를 사용하여 업데이트합니다 :

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

에러를 발생시키기 위해서 폼을 새로고침한 후 전송하세요 . 이제 폼필드의 데이터들은 복원될것입니다.

Note

아래의 클래스 레퍼런스 부분에서 <select> menus, radio button, checkbox 의 데이터를 복원하는 부분을 확인하세요.

Important

필드의 이름에 배열을 사용했다면, 함수에도 배열형태 그대로를 넘겨줍니다. 예제:

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

더많은 정보는 아래의 필드이름으로 배열사용하기 에 있습니다.

콜백 Callbacks: Your own Validation Methods

검증시스템은 콜백을지원합니다. 이를 통해 검증클래스를 어려분의 필요에 따라 확장하는 것이 가능합니다. 예를 들어, 만약 사용자가 유일한 아이디를 선택했는지를 확인하기 위해 데이터베이스 쿼리가 필요하다면, 그 기능을 위한 콜백함수를 만들수 있습니다. 예제를 만들어 봅시다.

컨트롤러에서, “username ” 규칙을 아래와 같이 바꿉니다:

$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]**”

Note

여러분은 콜백으로 전달되는 폼 데이터를 처리하거나 리턴할 수 있습니다. 콜백함수가 불린(boolean TRUE/FALSE) 외의 어떤 값을 리턴하더라도 원본의 폼데이터가 아니라 새롭게 처리된 데이터라고 가정합니다.

호출 : 원칙적으로 어느 것이나 사용 Callable: Use anything as a rule

If callback rules aren’t good enough for you (for example, because they are limited to your controller), don’t get disappointed, there’s one more way to create custom rules: anything that is_callable() would return TRUE for.

Consider the following example:

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

The above code would use the valid_username() method from your Users_model object.

This is just an example of course, and callbacks aren’t limited to models. You can use any object/method that accepts the field value as its’ first parameter. Or if you’re running PHP 5.3+, you can also use an anonymous function:

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

Of course, since a Callable rule by itself is not a string, it isn’t a rule name either. That is a problem when you want to set error messages for them. In order to get around that problem, you can put such rules as the second element of an array, with the first one being the rule name:

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

Anonymous function (PHP 5.3+) version:

$this->form_validation->set_rules(
        'username', 'Username',
        array(
                'required',
                array(
                        'username_callable',
                        function($str)
                        {
                                // Check validity of $str and return TRUE or FALSE
                        }
                )
        )
);

에러 메세지 설정 Setting Error Messages

모든 내장 에러 메세지는 아래의 언어파일에 있습니다 : system/language/english/form_validation_lang.php

에러 메세지를 설정하기 위하여 언어 파일을 application/language/english/form_validation_lang.php 에 생성하여 확장/오버라이드를 할 수 있습니다. (언어 클래스 Language Class 문서 참조), 또는 아래함수를 이용할 수 있습니다:

$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)를 넘겨주시면 됩니다.

필드의 사람이 알아보기 쉬운 이름을 포함한 경우나 특정한 룰을 가진 선택적인 파라미터를 포함한 경우에, If you’d like to include a field’s “human” name, or the optional parameter some rules allow for (such as 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.” 와 같이 될 것입니다.

Note

에러 메세지에서 %s 를 사용했던 sprintf() 함수는 여전히 작동할 것입니다. 그러나 그것은 위의 태그를 오버라이드합니다. 여러분은 둘 중 하나만을 사용해야 합니다.

위 callback 예제에서 에러 메세지는 함수 이름을 넘겨주어 설정했습니다 (“callback_” 접두어 제외):

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

필드명의 변환 Translating Field Names

set_rules() 함수에서 사용하였던 “사람이 알아보기 쉬운이름” 을 언어파일에 저장하여 필드이름 변환이 적용되도록 하고 싶다면 아래와 같이 합니다:

먼저, “사람이 알아보기 쉬운 이름(human)” 에 아래의 예제와 같이 lang: 이라는 접두어를 붙입니다 :

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

그런다음, 그 이름을 언어파일의 배열에 저장합니다(접두어는 붙이지 않습니다):

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

Note

여러분의 언어파일에 저장된 배열 아이템은 CI 에서 자동으로 로드하지않습니다. 컨트롤러에서 아래와 같이 로드하셔야 한다는 것을 기억하세요:

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

언어클래스(Language Class) 에 언어파일에 대해 더 자세한 정보가 있습니다.

에러 구분자의 변경 Changing the Error Delimiters

기본적으로 폼 검증 클래스는 에러 메세지를 <p> 태그로 감쌉니다. 여러분은 이를 전역적으로 적용되도록 바꿀 수도 있고 각각의 메세지에 적용되도록 바꿀 수도 있습니다.

  1. 에러구분자를 전역적으로 바꾸기 Changing delimiters Globally 컨트롤러에서 에러구분자를 전역적으로 바꾸는 것은 폼검증 클래스를 로드한 후 아래와 같은 함수 호출을 추가하시면 됩니다:

    $this->form_validation->set_error_delimiters('<div class="error">', '</div>');
    

    이 예제에서는 div 태그를 사용하도록 바꾸었습니다.

  2. 각각의 에러에 적용되도록 구분자 바꾸기 Changing delimiters Individually 아래 두 개의 에러생성함수를 통해서 각각의 에러에 적용되는 구분자를 설정할 수 있습니다:

    <?php echo form_error('field name', '<div class="error">', '</div>'); ?>
    

    또는:

    <?php echo validation_errors('<div class="error">', '</div>'); ?>
    
  3. 환경설정 파일에서 정하기 Set delimiters in a config file application/config/form_validation.php 에서 다음과 같이 설정할 수 있습니다:

    $config['error_prefix'] = '<div class="error_prefix">';
    $config['error_suffix'] = '</div>';
    

에러를 각각 보여주기 Showing Errors Individually

에러 메세지를 목록처럼 표시하지 않고 각 필드 옆에 표시하려면 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" />

에러가 없다면 아무것도 표시되지 않습니다.에러가 있다면 메세지가 표시되겠죠 .

Important

폼필드 이름으로 배열을 사용한다면, 함수 파라미터로 넘겨주는 이름도 배열 그대로라야 합니다. 예제:

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

더 많은 정보를 위해, 아래의 Using Arrays as Field Names 섹션을 참조해주세요.

배열 검증 Validating an Array (other than $_POST)

때때로 $_POST 데이터에서 오지 않은 배열을 확인하고 싶어할 수 있습니다.

이련 경우에, 당신은 검증 할 수 있는 배열을 지정할 수 있습니다:

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

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

폼검증 규칙을 생성하고 검증을 실행하고 에러 메세지를 받는 방법은 $_POST 데이터나 배열이나 같습니다.

Important

폼 검증 규칙을 정하기 전에 set_data() 함수를 호출하셔야 합니다.

Important

한 번의 실행 동안 하나 이상의 배열을 검증하고 싶으면, 새로운 배열의 규칙을 정하고 검증하기 전에 reset_validation() 함수를 호출하여야 합니다.

더 많은 정보를 원하시면, 아래의 클래스 레퍼런스 섹션을 참조해주세요.

Config 파일에 검증규칙을 저장하기 Saving Sets of Validation Rules to a Config File

폼 검증클래스의 장점중 하나는 프로그램에 사용되는 모든 검증규칙을 하나의 설정파일에 저장할 수 있다는점 입니다. 이런 규칙들을 그룹으로 묶을 수 있습니다. 이 그룹들은 필요할 때 여러분이 직접 로드 할 수도 있고, 일치하는 controller/function 가 호출되었을 때 자동으로 로드되게 할 수도 있습니다.

규칙을 저장하는 방법 How to save your rules

먼저 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 라야 합니다.

규칙 셋 생성하기 Creating Sets of Rules

검증규칙을 모아서 하나의 셋으로 만들려면 그것들을 하나의 “하위배열 (sub arrays)”로 만들어야 합니다. 아래 예제는 두 개의 규칙셋을 포함합니다. 하위 배열 이름인 “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'
                )
        )
);

특정한 규칙 그룹 호출하기 Calling a Specific Rule Group

특정규칙그룹을 호출하기 위해서는 그룹 이름을 run() 함수의 파라미터로 넘겨줍니다. 예를 들어, signup 규칙그룹을 호출하려면 아래와 같이 합니다:

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

규칙 그룹과 컨트롤러 메소드의 연관 Associating a Controller Method with a Rule Group

규칙 그룹을 호출할 때 좀 더 자동화된 방법을 사용할 수 있습니다. 컨트롤러의 class/function 이름 대로 규칙셋의 이름을 부여하시면 됩니다. 예를 들어, 컨트롤러 이름이 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() 함수만 호출해도 자동으로 적용됩니다.

필드명에 배열 사용하기 Using Arrays as Field Names

폼 검증 클래스는 필드명으로 배열을 사용할 수 있도록 지원합니다. 다음예제를 보시죠:

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

만약 필드이름으로 배열을 사용하신다면, 필드명을 요구하는 헬퍼함수(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][]'); ?>

규칙 참조 Rule Reference

다음은 CI에 내장된 규칙목록 입니다:

규칙 파라미터 설명 예제
required No 검사대상이 비어있으면 FALSE를 리턴 합니다.  
matches Yes 검사대상이 파라미터의 값과 일치하지않을 때 FALSE를 리턴 합니다. matches[form_item]
differs Yes 검사대상이 파라미터의 값과 다르지 않을 때 FALSE를 리턴 합니다. differs[form_item]
is_unique Yes 파라미터에서 테이블 및 필드이름이 유일하지 않다면 FALSE를 리턴합니다. Note: 이 규칙은 작업을 진행하기 위해 쿼리 빌더(Query Builder) 를 필요로 합니다. 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 검사대상이 1 이상의 자연수 이외의 문자를 포함할 때 FALSE를 리턴 합니다 (1, 2, 3, 등 인지 검사).  
valid_url No 검사대상이 유효한 URL 주소가 아닐때 FALSE를 리턴 합니다.  
valid_email No 검사대상이 유효한 Email 주소가 아닐때 FALSE를 리턴 합니다.  
valid_emails No 검사대상이 콤마(,)로 구분된 Email 주소일 경우에 사용하며 유효한 email 주소가 아닐때 FALSE를 리턴 합니다.  
valid_ip No 검사대상이 유효한 IP주소가 아닐때 FALSE를 리턴 합니다. IP 포맷을 검증하기 위해 ‘ipv4’ 또는 ‘ipv6’ 를 구별하는 파라미터를 받을 수 있습니다.  
valid_base64 No 검사대상이 Base64 에 사용되는 문자 이외의 문자를 포함할 때 FALSE를 리턴 합니다.  

Note

이 규칙들은 별도의 함수로서 호출할 수도 있습니다. 예제:

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

Note

PHP 내장함수중 하나의 파라미터를 받는 함수라면 어떤 것도 여기서 사용할 수 있습니다.

데이터준비 참조 Prepping Reference

다음목록은 사용 가능한 데이터준비함수들 입니다:

이름 파라미터 설명
prep_for_form No DEPRECATED: 폼필드에 표시될 수 있도록 특수문자를 변환합니다.
prep_url No URL에 “http://” 가 없으면 추가해 줍니다.
strip_image_tags No 이미지 태그를 제거하고 이미지 url 을 추출합니다.
encode_php_tags No PHP 태그를 HTML 엔터티로 변환합니다.

Note

하나의 파라미터만 받는 PHP 내장함수도 사용하실 수 있습니다. trim(), htmlspecialchars(), urldecode(), 등.

클래스 레퍼런스 Class Reference

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

위에서 설명한대로 검사규칙들을 설정할 수 있도록 해줍니다:

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

여러분만의 에러 메세지를 설정할 수 있습니다. 위의 에러 메세지 설정(Setting Error Messages) 을 참고해 주세요.

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

반환형:

문자열

에러 메세지를 문자열로 반환합니다. 그리고 개행문자로 구별됩니다.

error($field[, $prefix = ''[, $suffix = '']])
인수:
  • $field (string) – Field name
  • $prefix (string) – Optional prefix
  • $suffix (string) – Optional suffix
반환값:

Error message string

반환형:

문자열

특정 필드에 대한 에러 메세지를 반환합니다. 선택적으로 접두어나 접미어(보통 HTML 태그 형식으로)를 추가할 수 있습니다.

has_rule($field)
인수:
  • $field (string) – Field name
반환값:

TRUE if the field has rules set, FALSE if not

반환형:

bool

특정 필드에 설정된 규칙이 있는지 확인합니다.

헬퍼 참조 Helper Reference

다음 함수를 위해 폼(Form Helper) 매뉴얼을 참조해주세요:

이것은 절차적 함수들입니다, 그래서 $this->form_validation 와 함께 미리 로드할 것을 요구하지 않습니다.