CodeIgniter3

14. [CodeIgniter3] 폼 유효성 검사 (form validation)

drizzle0925 2022. 1. 3. 09:45
728x90

사용자가 입력한 내용을 주로 form을 통해서 데이터베이스로 전송됩니다.

이상한 데이터가 데이터베이스에 저장되지 않도록 데이터베이스에 저장하기 전에 전송된 데이터를 확인해야 하는 작업이 필요합니다. 이러한 검사를 유효성 검사라 부릅니다.

 

코드 이그나이터에는 양식의 유효성 검사를 도와주는 내장 라이브러리가 있습니다. 

이 라이브러리의 사용법에 대해서 알아봅시다.

 

이제까지는 helper함수와 library를 매번 컨트롤러의 생성자에서 호출해서 사용했습니다.

 

이번에는 autoload 기능을 이용해서 helper와 library를 호출하는 방식으로 해보겠습니다.

application/config/autoload.php 파일을 열면 아래와 같은 코드가 있습니다.

$autoload['helper'] = array();

 

이 부분을 아래와 같이 수정합니다.

$autoload['helper'] = array('form', 'url');

 

이번에는 라이브러리를 수정해줍니다. 아래 코드를 autoload.php에서 찾습니다.

$autoload['libraries'] = array();

 

아래와 같이 수정합니다.

$autoload['libraries'] = array('form_validation');

 

Controller

application/controllers/Form.php 파일을 만듭니다.

<?php 
class Form extends CI_Controller
{
    public function __construct()
    {
        // CodeIgniter의 기본 생성자 호출
        parent::__construct();

        // autoload를 사용하면 아래와 같이 생성자에서 선언할 필요가 없습니다.
        // $this->load->helper(array('form'));
        // $this->load->library(array('form_validation'));

    }

    public function form()
    {
        // 검사 규칙을 정하기 위해서 set_rules 함수를 사용합니다.
        // 인수1: 필드이름
        // 인수2: 에러 메시지에 삽입될 이름
        // 인수3: 폼에 필요한 검사규칙들 
        // 인수4: 현재 필드의 어떤 룰에 대한 커스텀 에러메시지. 설정하지 않으면 기본 에러메세지가 출력됩니다.
        $this->form_validation->set_rules('name','Name','required');
        $this->form_validation->set_rules('email','Email','required');

        // 검증규칙파일은 run() 함수를 호출하면 자동으로 로드되어 적용됩니다.
        // 규칙그룹 이름이 클래스/함수 이름과 완전히 동일하다면 run() 함수만 호출해도 자동으로 적용됩니다.
        if($this->form_validation->run() == FALSE)
        {
            $this->load->view('form');
        }
        else
        {
            $this->load->view('success');
        }
    }
}
?>

 

View

application/views/form.php 파일을 만들고 아래 코드를 입력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Form</title>
</head>
<body>
    <form method="post">
        <?php echo validation_errors(); ?>
        <h5>Name</h5>
        <input type="text" name="name" value="<?php echo set_value('name'); ?>" />
        <h5>Email</h5>
        <input type="email" name="email" value="<?php echo set_value('email'); ?>" />
        <div><input type="submit" value="Submit" /></div>
    </form>
</body>
</html>

 

그리고 폼 데이터를 정상적으로 입력했을때 표시할 view 파일도 생성합니다.

application/views/success.php 파일을 만들고 아래 코드를 입력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Success</title>
</head>
<body>
    <h1>Form Submitted Successfully</h1>
</body>
</html>

 

아무것도 입력하지 않고 submit 버튼을 누르면 아래와 같이 표시됩니다.

 

필드에서 발생한 오류를 개별적으로 알아볼수있도록 아래와 같이 코드를 수정합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Form</title>
</head>
<body>
    <form method="post">
        <?php // echo validation_errors(); ?>
        <h5>Name</h5>
        <input type="text" name="name" value="<?php echo set_value('name'); ?>" />
        <?php if(form_error('name'))
        {
            echo '<span style="color:red">'.form_error('name').'</span>';
        }
        ?>
        <h5>Email</h5>
        <input type="email" name="email" value="<?php echo set_value('email'); ?>" />
        <?php if(form_error('email'))
        {
            echo '<span style="color:red">'.form_error('email').'</span>';
        }
        ?>
        <div><input type="submit" value="Submit" /></div>
    </form>
</body>
</html>

 

에러 발생시 해당 필드 아래에만 에러 내용이 표시됩니다.

 

name에 대한 유효성검사를 다음과 같이 수정할 수 있습니다.

좌우 여백 제거, 필수 값, 최소 4글자, 최대 10글자

$this->form_validation->set_rules('name', 'Name', 'trim|required|min_length[4]|max_length[10]');

 

email에 대한 유효성 검사를 다음과 같이 수정할 수 있습니다.

필수 값, 이메일 양식 확인, 파라미터에서 테이블 및 필드 이름이 유일하지 않다면 FALSE를 리턴(users테이블의 email칼럼)

$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');

 

Github : https://github.com/jun0925/study/commit/ff7120653d4d662d4fb2312e7c1bd3f30147a913

728x90