ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeIgniter] 5. 폼 검증하기
    Web/CodeIgniter 2015. 8. 24. 15:00

    4장에서 게시판의 기본 골격을 만들었습니다. 5장에서는 CodeIgniter의 라이브러리 중 하나인 form_validation 을 이용해 값의 존재유무, 데이터 형식(한글, 영문, 숫자 등), 최소, 최대 길이 제한, 중복 아이디 체크나 비밀번호 입력 여부 등을 검증해보겠습니다.





    5.1 기본 형태

     4장의 검색이나 글쓰기 소스에서는 자바스크립트를 이용해 뷰 단에서 체크했습니다.


     CodeIgniter 폼 검증은 프로그램 단에서 검증하는 것이라 전송 후에 체크하고 설정된 룰을 통과하지 못할 경우 다시 뷰에 에러 메세지를 표시하는 형태입니다.


     자바스크립트로 뷰 단에서 체크하는 것보다 한번 전송되고 다시 폼이 표시되는 형태라 서버 리소스를 차지할 수 있습니다. 


     그럼에도 프로그램 단에서 체크하는 폼 전송 형태를 사용하는 것은 뷰 단에서의 체크는 변조가 가능하기 때문입니다. 그렇기 때문에 뷰 단에서 체크했다고 하더라도 프로그램 단에서 한 번 더 체크해야 합니다.


     테스트할 소스는 아래와 같습니다. 아래 경로의 test.php 파일을 만들어서 작성하세요.




     * bbs/application/controllers/test.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  기타 테스트용 컨트롤러
     */
     
    class Test extends CI_Controller {
     
        function __construct() {
            parent::__construct();
        }
     
        public function index() {
            $this -> forms();
        }
     
        public function _remap($method) {
            $this -> load -> view('header_v');
     
            if (method_exists($this$method)) {
                $this -> {"{$method}"}();
            }
     
            $this -> load -> view('footer_v');
        }
        
        /**
         * 폼 검증 테스트
         */
        public function forms() {
            $this->output->enable_profiler(TRUE);
            
            // Form validation 라이브러리 로드
            $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('test/forms_v');
            } else {
                $this->load->view('test/form_success_v');
            }
        }
     
    }
     
    cs



     Line 35: 폼 검증 라이브러리를 로드합니다.

     Line 38 ~ 41: 검증 룰을 선언합니다. 프로그램 단에서 체크하는 것이라 이곳에서 선언합니다.



     뷰에서 다시 돌려받은 값을 어떻게 표시하고 에러 메세지를 표시하는지 알아봅니다.




     * bbs/application/views/test/forms_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <article id="board_area">
        <header><h1></h1></header>
        <?php echo validation_errors();?>
        
        <form method="POST" class="form-horizontal">
            <fieldset>
                <legend> 폼 검증</legend>
                <div class="control-group">
                    <label class="control-label" for="input01">아이디</label>
                    <div class="controls">
                        <input type="text" name="username" class="input-xlarge" id="input01" />
                        <p class="help-block">아이디를 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input02">비밀번호</label>
                    <div class="controls">
                        <input type="password" name="password" class="input-xlarge" id="input02" />
                        <p class="help-block">비밀번호를 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input03">비밀번호 확인</label>
                    <div class="controls">
                        <input type="password" name="passconf" class="input-xlarge" id="input03" />
                        <p class="help-block">비밀번호를 한 번 더 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input04">이메일</label>
                    <div class="controls">
                        <input type="text" name="email" class="input-xlarge" id="input04" />
                        <p class="help-block">이메일을 입력하세요.</p>
                    </div>
                </div>
            </fieldset>
            
            <div><input type="submit" value="전송" class="btn btn-primary"/></div>
        </form>
    </article>
     
    cs





     * bbs/application/views/test/form_success_v.php


    1
    2
    3
    4
    5
    6
     
    <article id="board_area">
        <header><h1></h1></header>
        <h1> 전송 성공 !</h1>
    </article>
     
    cs





     주소 http://localhost/bbs/test/ 에 접속하여 검증절차를 진행해봅니다.

















     

     username, password, passconf, email 필드의 룰 설정이 required 로 되어 있기 때문에 4개의 필드에 모두 내용이 있어야 성공 화면을 볼 수 있습니다.


     


     









     이상으로 폼 검증의 기본 형태에 대해 알아보았습니다. 다음 절에서는 다양한 검증 규칙(길이, 입력 형식 검토, 이메일, IP 체크 등)을 적용하는 방법에 대해 알아보겠습니다.








    5.2 검증 규칙 설정

     검증 규칙은 원하는 순서대로 원하는 만큼 선언할 수 있습니다. callback 함수를 지원하여 데이터 중복 여부 체크 등 전처리를 할 수도 있습니다.


     검사 규칙은 set_rules() 함수를 사용해 설정합니다.





      $this->form_validation->set_rules('field_name', 'err_msg', 'valid_rules');





     set_rules() 함수는 세 가지 파라미터를 사용합니다.


     첫 번째 파라미터는 필드 이름이고 뷰의 폼에서 설정한 필드 이름과 일치해야 합니다. 두 번째 파라미터는 필드 이름에 대해 에러 메세지를 표시할 내용입니다. 세 번째 파라미터에 폼 검증에 필요한 검사 규칙을 선언합니다.


     기존 컨트롤러의 검증 규칙을 아래와 같이 수정하도록 하겠습니다.



     * test.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  기타 테스트용 컨트롤러
     */
     
    class Test extends CI_Controller {
     
        function __construct() {
            parent::__construct();
        }
     
        public function index() {
            $this -> forms();
        }
     
        public function _remap($method) {
            $this -> load -> view('header_v');
     
            if (method_exists($this$method)) {
                $this -> {"{$method}"}();
            }
     
            $this -> load -> view('footer_v');
        }
        
        /**
         * 폼 검증 테스트
         */
        public function forms() {
            $this->output->enable_profiler(TRUE);
            
            // Form validation 라이브러리 로드
            $this->load->library('form_validation');
            
            // 폼 검증 필드와 규칙 사전 정의
            $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');        
            
            if ($this->form_validation->run() == FALSE) {
                $this->load->view('test/forms_v');
            } else {
                $this->load->view('test/form_success_v');
            }
        }
     
    }
     
    cs




     Line 39: 아이디 검증 규칙에 최소 5 글자, 최대 12 글자 이내로 제한하는 규칙을 추가했습니다.

     Line 40: passconf 필드와 일치하는지의 여부를 체크하는 규칙을 추가했습니다.

     Line 42: 입력한 이메일이 이메일 규칙에 맞는지 체크하는 규칙을 추가했습니다.







     5.2.1 형식 검토

      폼에서 입력한 필드의 내용에 대해 적용되는 검토의 종류는 다음 표와 같습니다.





     규칙

     파라미터 

      설명 

     required

     No 

      검사 대상이 비어있으면 FALSE

     matches

     Yes 

      검사 대상이 파라미터 값과 일치하지 않으면 FALSE 

     is_unique

     Yes 

      파라미터에서 테이블 및 필드 이름이 유일하지 않으면 FALSE 

     alpha

     No

      검사 대상이 알파벳 이외의 문자를 포함할 때 FALSE 

     alpha_numeric

     No

      검사 대상이 알파벳이나 숫자가 아닌 문자를 포함할때 FALSE 

     alpha_dash

     No

      검사 대상이 알파벳, 숫자, 밑줄(_), 대시(-) 이외의 문자를 포함할 때 FALSE 

     numeric

     No

      검사 대상이 숫자 이외의 문자를 포함할 때 FALSE 

     integer

     No

      검사 대상이 정수 이외의 문자를 포함할 때 FALSE 

     decimal

     Yes 

      검사 대상이 소수 이외의 문자를 포함할 때 FALSE 

     is_natural

     No

      검사 대상이 자연수 이외의 문자를 포함할 때 FALSE 

     is_natural_no_zero

     No

      검사 대상이 1 이상의 자연수 이외의 문자를 포함할 때 FALSE

     valid_email

     No

      유효한 이메일 주소가 아닐 때 FALSE 

     valid_emails

     No

      검사 대상이 콤마(,)로 구분된 이메일 주소일 경우에 사용하며 유효한 이메일 주소가 아닐 때 FALSE 

     valid_ip

     No

      유효한 IP 주소가 아닐 때 FALSE 



     다음으로는 각 규칙과 더불어 위에서 언급하지 않은 규칙들 중에 에러 메세지를 출력 할 때의 출력 메세지를 보여주는 php 파일입니다.




     * system/language/english/form_validation_lang.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <?php
     
    $lang['required']            = "The %s field is required.";
    $lang['isset']                = "The %s field must have a value.";
    $lang['valid_email']        = "The %s field must contain a valid email address.";
    $lang['valid_emails']        = "The %s field must contain all valid email addresses.";
    $lang['valid_url']            = "The %s field must contain a valid URL.";
    $lang['valid_ip']            = "The %s field must contain a valid IP.";
    $lang['min_length']            = "The %s field must be at least %s characters in length.";
    $lang['max_length']            = "The %s field can not exceed %s characters in length.";
    $lang['exact_length']        = "The %s field must be exactly %s characters in length.";
    $lang['alpha']                = "The %s field may only contain alphabetical characters.";
    $lang['alpha_numeric']        = "The %s field may only contain alpha-numeric characters.";
    $lang['alpha_dash']            = "The %s field may only contain alpha-numeric characters, underscores, and dashes.";
    $lang['numeric']            = "The %s field must contain only numbers.";
    $lang['is_numeric']            = "The %s field must contain only numeric characters.";
    $lang['integer']            = "The %s field must contain an integer.";
    $lang['regex_match']        = "The %s field is not in the correct format.";
    $lang['matches']            = "The %s field does not match the %s field.";
    $lang['is_unique']             = "The %s field must contain a unique value.";
    $lang['is_natural']            = "The %s field must contain only positive numbers.";
    $lang['is_natural_no_zero']    = "The %s field must contain a number greater than zero.";
    $lang['decimal']            = "The %s field must contain a decimal number.";
    $lang['less_than']            = "The %s field must contain a number less than %s.";
    $lang['greater_than']        = "The %s field must contain a number greater than %s.";
     
     
    /* End of file form_validation_lang.php */
    /* Location: ./system/language/english/form_validation_lang.php */
    cs





     5.2.2 입력 길이

      폼에서 입력한 필드의 길이에 대한 검토표는 아래와 같습니다.



      규칙 

     파라미터 

      설명 

     min_length

     Yes 

       파라미터 값보다 작을 때 FALSE

     max_length

     Yes

       파라미터 값보다 클 때 FALSE 

     exact_length

     Yes

       파라미터 값과 다를 때 FALSE 

     greater_than

     Yes

       지정된 값보다 작거나 숫자가 아닌 경우 FALSE 

     less_than

     Yes

       지정된 값보다 크거나 숫자가 아닌 경우 FALSE 











    5.3 폼 데이터 복원하기

     이전 절까지 진행하면서 폼 검증에서 필수 요소 중 하나인 폼 데이터 복원이 빠져 있습니다. 


     폼을 검증하고 에러 메세지를 화면에 출력하는 데 이전에 입력했던 폼 데이터는 복원되지 않았습니다.


     아래 소스와 같이 추가된 부분을 통해서 폼 데이터가 복원 됩니다.


     * bbs/application/views/test/forms_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <article id="board_area">
        <header><h1></h1></header>
        <?php echo validation_errors();?>
        
        <form method="POST" class="form-horizontal">
            <fieldset>
                <legend> 폼 검증</legend>
                <div class="control-group">
                    <label class="control-label" for="input01">아이디</label>
                    <div class="controls">
                        <input type="text" name="username" class="input-xlarge" id="input01" 
                            value="<?php echo set_value('username'); ?>"/>
                        <p class="help-block">아이디를 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input02">비밀번호</label>
                    <div class="controls">
                        <input type="password" name="password" class="input-xlarge" id="input02" />
                        <p class="help-block">비밀번호를 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input03">비밀번호 확인</label>
                    <div class="controls">
                        <input type="password" name="passconf" class="input-xlarge" id="input03" />
                        <p class="help-block">비밀번호를 한 번 더 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input04">이메일</label>
                    <div class="controls">
                        <input type="text" name="email" class="input-xlarge" id="input04" 
                            value="<?php echo set_value('email'); ?>"/>
                        <p class="help-block">이메일을 입력하세요.</p>
                    </div>
                </div>
            </fieldset>
            
            <div><input type="submit" value="전송" class="btn btn-primary"/></div>
        </form>
    </article>
     
    cs












     위 소스의 set_value() 함수와 같이 폼 데이터 복원에 사용되는 함수 표는 다음과 같습니다.




     함수 종류

      설명 

     set_value()

     input 이나 textarea의 폼 데이터 복원에 사용합니다. 첫 번째 파라미터로 필드 이름을 넘겨줘야 합니다. 두 번째 파라미터에 값을 입력할 경우 폼이 처음 로드될 때 기본 값으로 사용됩니다. 

     set_select()

     <select> 태그를 사용할 때 선택했던 값을 표시해 줍니다. 첫 번째 파라미터는 select의 name 이며, 두 번째 파라미터는 각 아이템의 값이며, 세 번째 파라미터에는 TRUE 또는 FALSE를 설정할 경우 선택된 값이 됩니다. 

     set_checkbox()

     전송할 당시의 체크박스의 값을 복원합니다. 첫 번째 파라미터는 체크박스 필드 이름이며, 두 번째 파라미터는 선택된 값입니다. 세 번째 파라미터는 불리언 값으로 선택된 값을 나타냅니다.

     set_radio()

     라디오 버튼을 전송할 당시의 값으로 복원합니다. 사용법은 set_checkbox()와 동일합니다.




     다음은 set_select(), set_checkbox(), set_radio() 를 application/views/test/forms_v.php 에 적용한 결과는 다음과 같습니다.



     * test.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  기타 테스트용 컨트롤러
     */
     
    class Test extends CI_Controller {
     
        function __construct() {
            parent::__construct();
        }
     
        public function index() {
            $this -> forms();
        }
     
        public function _remap($method) {
            $this -> load -> view('header_v');
     
            if (method_exists($this$method)) {
                $this -> {"{$method}"}();
            }
     
            $this -> load -> view('footer_v');
        }
        
        /**
         * 폼 검증 테스트
         */
        public function forms() {
            // $this->output->enable_profiler(TRUE);
            
            // Form validation 라이브러리 로드
            $this->load->library('form_validation');
            
            // 폼 검증 필드와 규칙 사전 정의
            $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');        
            $this->form_validation->set_rules('count''기본 값''numeric');
            $this->form_validation->set_rules('myselect''select 값''');
            $this->form_validation->set_rules('mycheck[]''체크 박스 값''');
            $this->form_validation->set_rules('myradio''라디오 버튼 값''');
            
            
            if ($this->form_validation->run() == FALSE) {
                $this->load->view('test/forms_v');
            } else {
                $this->load->view('test/form_success_v');
            }
        }
     
    }
     
    cs






     * forms_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    <article id="board_area">
        <header><h1></h1></header>
        <?php echo validation_errors();?>
        
        <form method="POST" class="form-horizontal">
            <fieldset>
                <legend> 폼 검증</legend>
                <div class="control-group">
                    <label class="control-label" for="input01">아이디</label>
                    <div class="controls">
                        <input type="text" name="username" class="input-xlarge" id="input01" 
                            value="<?php echo set_value('username'); ?>"/>
                        <p class="help-block">아이디를 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input02">비밀번호</label>
                    <div class="controls">
                        <input type="password" name="password" class="input-xlarge" id="input02" />
                        <p class="help-block">비밀번호를 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input03">비밀번호 확인</label>
                    <div class="controls">
                        <input type="password" name="passconf" class="input-xlarge" id="input03" />
                        <p class="help-block">비밀번호를 한 번 더 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input04">이메일</label>
                    <div class="controls">
                        <input type="text" name="email" class="input-xlarge" id="input04" 
                            value="<?php echo set_value('email'); ?>"/>
                        <p class="help-block">이메일을 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input05">기본 값 설정</label>
                    <div class="controls">
                        <input type="text" name="count" class="input-xlarge" id="input05" 
                            value="<?php echo set_value('count', 0); ?>"/>
                        <p class="help-block">기본 값이 출력됩니다.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input06">Select 값 복원</label>
                    <div class="controls">
                        <select name="myselect" id="input06">
                            <option value="one" <?php echo set_select('myselect''one', TRUE);?>>
                                One
                            </option>
                            <option value="two" <?php echo set_select('myselect''two');?>>
                                Two
                            </option>
                            <option value="three" <?php echo set_select('myselect''three');?>>
                                Three
                            </option>
                        </select>
                        <p class="help-block">선택 하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input07">체크박스</label>
                    <div class="controls">
                        1번 <input type="checkbox" name="mycheck[]" id="input07" value="1" 
                            <?php echo set_checkbox('mycheck[]''1', TRUE);?> />
                        2번 <input type="checkbox" name="mycheck[]" id="input07" value="2" 
                            <?php echo set_checkbox('mycheck[]''2');?> />
                        <p class="help-block">체크박스를 선택하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input08">라디오</label>
                    <div class="controls">
                        1번 <input type="radio" name="myradio" id="input08" value="1" 
                            <?php echo set_radio('myradio''1', TRUE);?> />
                        2번 <input type="radio" name="myradio" id="input08" value="2" 
                            <?php echo set_radio('myradio''2');?> />
                        <p class="help-block">라디오 버튼을 선택하세요.</p>
                    </div>
                </div>
            </fieldset>
            
            <div><input type="submit" value="전송" class="btn btn-primary"/></div>
        </form>
    </article>
     
    cs











    5.4 콜백 함수

     콜백 함수(callback function)는 컨트롤러 set_rule() 의 세 번째 파라미터에 선언하여 사용합니다. 예를 들어 회원가입 시에 ID 중복 여부를 체크하는데 사용합니다. 


     콜백 함수는 접두사로 callback_을 사용합니다. callback_username_check라고 선언했을 경우 실제 사용되는 함수는 username_check() 입니다. 컨트롤러에 콜백 함수 체크 부분을 추가해보겠습니다.


     아이디 중복 여부를 체크하는 함수를 만들 것이라 MySQL 콘솔에 접속하여 users 테이블을 먼저 생성하고 샘플 유저를 입력합니다.






     CREATE TABLE users (

    id INT(10) NULL AUTO_INCREMENT PRIMARY KEY,

    username VARCHAR(50) NULL COMMENT '아이디',

    password VARCHAR(50) NULL COMMENT '비밀번호',

    name VARCHAR(50) NULL COMMENT '이름',

    email VARCHAR(50) NULL COMMENT '이메일',

    reg_date DATETIME NULL COMMENT '가입일'

     )


     COMMENT = '회원테이블'

     COLLATE = 'utf8_general_ci'

     ENGINE = MyISAM

     ROW_FORMAT = DEFAULT;


     INSERT INTO users(username, password, name, email, reg_date) VALUES ('advisor', '1234', 'palpit', 'zhfldi4@gmail.com', '2015-08-24 13:11:21');





     test 컨트롤러를 수정합니다.


     * test.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  기타 테스트용 컨트롤러
     */
     
    class Test extends CI_Controller {
     
        function __construct() {
            parent::__construct();
        }
     
        public function index() {
            $this -> forms();
        }
     
        public function _remap($method) {
            $this -> load -> view('header_v');
     
            if (method_exists($this$method)) {
                $this -> {"{$method}"}();
            }
     
            $this -> load -> view('footer_v');
        }
        
        /**
         * 폼 검증 테스트
         */
        public function forms() {
            // $this->output->enable_profiler(TRUE);
            
            // Form validation 라이브러리 로드
            $this->load->library('form_validation');
            
            // 폼 검증 필드와 규칙 사전 정의
            $this->form_validation->set_rules('username''아이디''callback_username_check');        
            $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');        
            $this->form_validation->set_rules('count''기본 값''numeric');
            $this->form_validation->set_rules('myselect''select 값''');
            $this->form_validation->set_rules('mycheck[]''체크 박스 값''');
            $this->form_validation->set_rules('myradio''라디오 버튼 값''');
            
            
            if ($this->form_validation->run() == FALSE) {
                $this->load->view('test/forms_v');
            } else {
                $this->load->view('test/form_success_v');
            }
        }
        
        public function username_check($id) {
            $this->load->database();
            
            if ($id) {
                $result = array();
                $sql = "SELECT * FROM users WHERE username = '".$id."'";
                $query = $this->db->query($sql);
                $result = @$query->row();
                
                if ($result) {
                    $this->form_validation->set_message('username_check'$id.'은(는) 중복된 아이디 입니다.');
                    return FALSE;
                } else {
                    return TRUE;
                }
            } else {
                return FALSE;
            }
        }
     
    }
     
    cs




     users 테이블에 아이디 advisor를 미리 입력해 놓은 상태라 아래와 같이 중복된 아이디라고 폼 검증을 볼 수 있습니다.


     










    5.5 에러 메세지 설정과 표시

     CodeIgniter의 모든 내장 에러 메세지는 system/language/english에 위치하며 폼 검증 에러 메세지는 form_validation_lang.php 입니다.


     기본 언어는 영어로 설정되어 있습니다. 이번 절은 에러 메세지를 개별적으로 표시하기 위한 방법을 알아봅시다.



     5.5.1 에러 메세지 개별적으로 표시하기

      폼 검증의 에러 메세지를 표현하는 방법에는 두 가지가 있습니다. 


      지금까지 소스에 적용된 validation_errors() 를 이용해 에러 메세지를 한번에 리스트로 표현하는 방법과 form_error()를 이용해 개별적으로 표시하는 방법입니다.


      뷰 파일을 수정하여 에러 메세지를 각각 표시해보겠습니다.



     * forms_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    <article id="board_area">
        <header><h1></h1></header>
        <?php //echo validation_errors(); ?>
        <?php
            if ( form_error('username')) {
                $error_username = form_error('username');
            } else {
                $error_username = form_error('username_check');
            }
       ?>
        
        <form method="POST" class="form-horizontal">
            <fieldset>
                <legend> 폼 검증</legend>
                <div class="control-group">
                    <label class="control-label" for="input01">아이디</label>
                    <div class="controls">
                        <input type="text" name="username" class="input-xlarge" id="input01" 
                            value="<?php echo set_value('username'); ?>"/>
                        <p class="help-block">
                            <?php 
                            if ($error_username == FALSE) {
                                echo "아이디를 입력하세요";
                            } else {
                                echo $error_username;
                            }
                           ?>
                        </p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input02">비밀번호</label>
                    <div class="controls">
                        <input type="password" name="password" class="input-xlarge" id="input02" />
                        <p class="help-block">
                            <?php
                                if (form_error('password'== FALSE) {
                                    echo "비밀번호를 입력하세요.";
                                } else {
                                    echo form_error('password');
                                }
                           ?>
                        </p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input03">비밀번호 확인</label>
                    <div class="controls">
                        <input type="password" name="passconf" class="input-xlarge" id="input03" />
                        <p class="help-block">비밀번호를 한 번 더 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input04">이메일</label>
                    <div class="controls">
                        <input type="text" name="email" class="input-xlarge" id="input04" 
                            value="<?php echo set_value('email'); ?>"/>
                        <p class="help-block">이메일을 입력하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input05">기본 값 설정</label>
                    <div class="controls">
                        <input type="text" name="count" class="input-xlarge" id="input05" 
                            value="<?php echo set_value('count', 0); ?>"/>
                        <p class="help-block">기본 값이 출력됩니다.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input06">Select 값 복원</label>
                    <div class="controls">
                        <select name="myselect" id="input06">
                            <option value="one" <?php echo set_select('myselect''one', TRUE);?>>
                                One
                            </option>
                            <option value="two" <?php echo set_select('myselect''two');?>>
                                Two
                            </option>
                            <option value="three" <?php echo set_select('myselect''three');?>>
                                Three
                            </option>
                        </select>
                        <p class="help-block">선택 하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input07">체크박스</label>
                    <div class="controls">
                        1번 <input type="checkbox" name="mycheck[]" id="input07" value="1" 
                            <?php echo set_checkbox('mycheck[]''1', TRUE);?> />
                        2번 <input type="checkbox" name="mycheck[]" id="input07" value="2" 
                            <?php echo set_checkbox('mycheck[]''2');?> />
                        <p class="help-block">체크박스를 선택하세요.</p>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="input08">라디오</label>
                    <div class="controls">
                        1번 <input type="radio" name="myradio" id="input08" value="1" 
                            <?php echo set_radio('myradio''1', TRUE);?> />
                        2번 <input type="radio" name="myradio" id="input08" value="2" 
                            <?php echo set_radio('myradio''2');?> />
                        <p class="help-block">라디오 버튼을 선택하세요.</p>
                    </div>
                </div>
            </fieldset>
            
            <div><input type="submit" value="전송" class="btn btn-primary"/></div>
        </form>
    </article>
     
    cs











    5.6 게시판 입력 기능에 폼 검증 추가하기

     이번 절에서는 4.4 절의 입력 기능에 폼 검증을 추가해 게시판의 완성도를 높여보겠습니다. 


     먼저 컨트롤러에 폼 검증 라이브러리(form_validation)를 로딩하고 룰을 설정합니다. board.php의 쓰기 부분을 수정합니다.



     * bbs/application/controllers/board.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  게시판 메인 컨트롤러
     */
     
    class Board extends CI_Controller {
     
     
        ....
     
     
     
        /**
         * 게시물 쓰기
         */
        function write() {
            
            // 폼 검증 라이브러리 로드
            $this->load->library('form_validation');
            
            // 폼 검증할 필드와 규칙 사전 정의
            $this->form_validation->set_rules('subject''제목''required');
            $this->form_validation->set_rules('contents''내용''required');
            
            echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
     
            if ( $this->form_validation->run() == TRUE) {
                // 글쓰기 POST 전송 시
     
                $this -> load -> helper('alert');
     
                // 주소 중에서 page 세그먼트가 있는지 검사하기 위해 주소를 배열로 반환
                $uri_array = $this -> segment_explode($this -> uri -> uri_string());
     
                if (in_array('page'$uri_array)) {
                    $pages = urldecode($this -> url_explode($uri_array'page'));
                } else {
                    $pages = 1;
                }
     
                if (!$this -> input -> post('subject', TRUE) AND !$this -> input -> post('contents', TRUE)) {
                    // 글 내용이 없을 경우, 프로그램 단에서 한 번 더 체크
                    alert('비정상적인 접근입니다.''/bbs/board/lists/' . $this -> uri -> segment(3) . '/page/' . $pages);
                    exit ;
                }
     
                // var_dump($_POST);
                $write_data = array(
                    'subject' => $this -> input -> post('subject', TRUE), 
                    'contents' => $this -> input -> post('contents', TRUE), 
                    'table' => $this -> uri -> segment(3)
                );
     
                $result = $this -> board_m -> insert_board($write_data);
                
                if ($result) {
                    alert("입력되었습니다.",'/bbs/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
                    exit;
                } else {
                    alert("다시 입력해주세요.",'/bbs/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
                    exit;
                }
            } else {
                // 쓰기 폼 view 호출
                $this->load->view('board/write_v');
            }
        }
        
     
        .......
     
     
    }
     
    cs

     






     * write_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <article id="board_area">
        <header>
            <h1></h1>
        </header>
        <form class="form-horizontal" method="post" action="" id="write_action">
            <fieldset>
                <legend>
                    게시물 쓰기
                </legend>
                <div class="control-group">
                    <label class="control-label" for="input01">제목</label>
                    <div class="controls">
                        <input type="text" class="input-xlarge" id="input01" name="subject"
                            value="<?php echo set_value('subject'); ?>">
                        <p class="help-block">
                            게시물의 제목을 써주세요.
                        </p>
                    </div>
                    <label class="control-label" for="input02">내용</label>
                    <div class="controls">
                        <textarea class="input-xlarge" id="input02" name="contents" rows="5"><?php echo set_value('contents');?></textarea>
                        <p class="help-block">
                            게시물의 내용을 써주세요.
                        </p>
                    </div>
     
                    <div class="controls">
                        <p class="help-block"><?php echo validation_errors();?></p>
                    </div>
     
                    <div class="form-actions">
                        <button type="submit" class="btn btn-primary" id="write_btn">
                            작성
                        </button>
                        <button class="btn" onclick="document.location.reload()">
                            취소
                        </button>
                    </div>
                </div>
            </fieldset>
        </form>
    </article>
     
    cs




     뷰 부분 적용 방법은 간단합니다. 기존 소스 상단의 jQuery로 작성된 폼 검증 역할을 삭제하시고, 폼 데이터 복원과 에러 메세지 출력 부분을 추가하였습니다.









    * 이 포스트는 서적 '만들면서 배우는 CodeIgniter 프레임워크'를 참고하여 작성하였습니다

    댓글

Designed by Tistory.