소스 : https://github.com/braverokmc79/Codeigniter_project2
test.php
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
기타 테스트용 컨트롤러
*/
class Test extends CI_Controller{
function __construct()
{
parent::__construct();
}
//주소에서 메서드가 생략되었을 때 실행되는 기본 메서드
public function index()
{
$this->forms();
}
/*
사이트 헤더, 푸터가 자동으로 추가 된다.
*/
public function _remap($method)
{
//헤더 include
$this->load->view('header_v');
if(method_exists($this, $method))
{
$this->{"{$method}"}();
}
//푸터 include
$this->load->view('footer_v');
}
//폼 검증 테스트
public function forms()
{
// $this->ouput->enable_profiler(TRUE);
//폼 검증 라이브러리 로드
$this->load->library('form_validation');
//폼 검증할 필드와 규칙 사전 정의
$this->form_validation->set_rules('username', '아이디', 'trim|required|min_length[5]|max_length[12]|htmlspecialchars');
$this->form_validation->set_rules('passconf', '비밀번호 확인', 'trim|required|md5|htmlspecialchars');
$this->form_validation->set_rules('password', '비밀번호', 'trim|required|matches[passconf]|md5|htmlspecialchars');
$this->form_validation->set_rules('email', '이메일', 'trim|required|valid_email|htmlspecialchars');
//numeric 검사 대상이 숫자 이외의 문자를 포함할 때 FALSE 를 리턴합니다.
$this->form_validation->set_rules('count', '기본 값', 'numeric');
$this->form_validation->set_rules('myselect', '셀렉트값', '');
$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
{
//폼 검증이 실패했을 경우 또는 일반 입력 페이지
$data['test'] = array(
'username'=>$this->input->post('username', TRUE),
'password'=> $this->input->post("password", TRUE),
'passconf'=>$this->input->post("passconf", TRUE),
'email'=>$this->input->post('email', TRUE),
'count'=>$this->input->post('count', TRUE),
'myselect'=>$this->input->post('myselect', TRUE),
'mycheck'=>$this->input->post('mycheck[]', TRUE),
'myradio'=>$this->input->post('myradio', TRUE)
);
//폼 검증이 성공했을 때 보여줄 페이지
$this->load->view('test/form_success_v', $data);
}
}
}
form_v.php
set_value('필드 이름')
폼의 필드 이름과 동일하게 set_value('필드 이름') 을 value 에 선언해 주는 것만으로도 폼 데이터가 복원됩니다.
폼 데이터 복원에 사용되는 함수는 다음 표와 같습니다.
함수종류 | 설명 |
set_value() | input 이나 textarea 의 폼 데이터 복원에 사용합니다. 첫 번째 파라미터로 필드 이름을 넘겨줘야 합니다. 두번째 파라미터에 값을 입력할 경우 폼이 처음 로드될 때 기본 값으로 사용됩니다. |
set_select() | <select> 태그를 사용할 때 선택했던 값을 표시해줍니다. 첫 번째 파라미터는 select 의 name, 이며, 두 번째 파라미터는 각 아이템의 값이며, 세 번째 파라미터에는 TRUE 또는 FALSE 를 설정 할 수 있습니다. TRUE 로 설정할 경우 선택된 값이 됩니다. |
set_checkbox() | 전송할 당시의 체크박스의 값을 복원합니다. 첫 번째 파라미터는 체크박스 필드 이름이며, 두 번째 파라미터는 선택된 값입니다. 세 번째는 불린(TRUE?FALSE) 값으로 선택된 값을 나타냅니다. |
set_radio() | 라디오 버튼을 전송할 당시의 값으로 복원합니다. 사용법은 set_checkbox() 와 동일합니다. |
input box
<input type="text" class="form-control" name="count" value="<?php echo set_value('count' , '0'); ?>" />
선택 박스
<select name="myselect" class="form-control">
<option value="one" <?php echo set_select('myselect', 'one' ) ;?>>Oen</option>
<option value="two" <?php echo set_select('myselect', 'two', TRUE); ?> >Two</option>
<option value="three" <?php echo set_select('myselect', 'three' ) ; ?> >Three</option>
</select>
체크박스
<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="control-group">체크박스를 선택하세요.</p>
</div>
라디오 박스
<label class="control-label">라디오 박스</label>
<input type="radio" name="myradio" value="1" <?php echo set_radio('myradio', '1', TRUE) ?> >
<input type="radio" name="myradio" value="2" <?php echo set_radio('myradio', '2'); ?> >
</div>
<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="text" 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="text" 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" id="input04"
value="<?php echo set_value('email'); ?>" class="form-control">
<p class="help-block">이메일을 입력하세요</p>
</div>
<!-- set_value 폼이 처음 로딩될 때 기본 값을 '0' 이 설정되어 보여집니다. -->
<div class="control-group">
<label class="control-label">기본값 0 설정</label>
<input type="text" class="form-control" name="count" value="<?php echo set_value('count' , '0'); ?>" />
</div>
<!-- set_select . 첫 번째 아이템의 세 번째 파라미터가 TRUE 이므 one 로선택된 값입니다. -->
<div class="control-group">
<label class="control-label">선택박스</label>
<select name="myselect" class="form-control">
<option value="one" <?php echo set_select('myselect', 'one' ) ;?>>Oen</option>
<option value="two" <?php echo set_select('myselect', 'two', TRUE); ?> >Two</option>
<option value="three" <?php echo set_select('myselect', 'three' ) ; ?> >Three</option>
</select>
</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="control-group">체크박스를 선택하세요.</p>
</div>
</div>
<!-- set_radio. set_checkbox 와 동일 -->
<div class="control-group">
<label class="control-label">라디오 박스</label>
<input type="radio" name="myradio" value="1" <?php echo set_radio('myradio', '1', TRUE) ?> >
<input type="radio" name="myradio" value="2" <?php echo set_radio('myradio', '2'); ?> >
</div>
<p></p>
<input type="submit" value="전송" class="btn btn-primary" />
</form>
</article>
form_success.php
<?php
echo "유저이름 ".$test['username'];
echo "<br>";
echo "패스워드 ".$test['password'];
echo "<br>";
echo "패스워드 확인 " .$test['passconf'];
echo "<br>";
echo "이메일".$test['email'];
echo "<br>";
echo "계산 " .$test['count'];
echo "<br>";
echo "선택박스 ".$test['myselect'];
echo "<br>";
echo "체크박스 " ;
echo implode(",",$test['mycheck']);
echo "<br>";
echo "라디오박스 ".$test["myradio"];
echo "<br>";
?>
5.4 콜백 함수
콜백 함수는 컨트롤러 set_rule() 의 세 번째 파라미터에 선언하여 사용합니다. 예를 들어 회원가입 시에 ID 중복 여부를 체크하는 사용합니다.
그 외에 다양한 용도로 사용합니다.
$this->form_validation->set_rules('username', '아이디', 'callback_username_check');
아이디 중복 여부를 체크하는 함수를 만들 것이라 MySQL 콘솔에 접속하여 users 테이블을 먼저 생성하고 샘플 유저를 입력합니다.
CREATE TABLE USERS(
id int(10) AUTO_INCREMENT PRIMARY KEY UNIQUE ,
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 ('braverokmc', '1111', '마카로닉스', 'braverokmc@gmail.com' , '2017-08-18 20:55:55' );
test.php
//폼 검증할 필드와 규칙 사전 정의
$this->form_validation->set_rules('username', '아이디', 'trim|required|min_length[5]|max_length[12]|htmlspecialchars|callback_username_check');
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
기타 테스트용 컨트롤러
*/
class Test extends CI_Controller{
function __construct()
{
parent::__construct();
}
//주소에서 메서드가 생략되었을 때 실행되는 기본 메서드
public function index()
{
$this->forms();
}
/*
사이트 헤더, 푸터가 자동으로 추가 된다.
*/
public function _remap($method)
{
//헤더 include
$this->load->view('header_v');
if(method_exists($this, $method))
{
$this->{"{$method}"}();
}
//푸터 include
$this->load->view('footer_v');
}
//폼 검증 테스트
public function forms()
{
// $this->ouput->enable_profiler(TRUE);
//폼 검증 라이브러리 로드
$this->load->library('form_validation');
//폼 검증할 필드와 규칙 사전 정의
$this->form_validation->set_rules('username', '아이디', 'trim|required|min_length[5]|max_length[12]|xss_clean||htmlspecialchars|callback_username_check');
$this->form_validation->set_rules('passconf', '비밀번호 확인', 'trim|required|md5|htmlspecialchars|xss_clean');
$this->form_validation->set_rules('password', '비밀번호', 'trim|required|matches[passconf]|md5|htmlspecialchars|xss_clean');
$this->form_validation->set_rules('email', '이메일', 'trim|required|valid_email|htmlspecialchars|xss_clean');
//numeric 검사 대상이 숫자 이외의 문자를 포함할 때 FALSE 를 리턴합니다.
$this->form_validation->set_rules('count', '기본 값', 'numeric');
$this->form_validation->set_rules('myselect', '셀렉트값', '');
$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
{
//폼 검증이 실패했을 경우 또는 일반 입력 페이지
$data['test'] = array(
'username'=>$this->input->post('username', TRUE),
'password'=> $this->input->post("password", TRUE),
'passconf'=>$this->input->post("passconf", TRUE),
'email'=>$this->input->post('email', TRUE),
'count'=>$this->input->post('count', TRUE),
'myselect'=>$this->input->post('myselect', TRUE),
'mycheck'=>$this->input->post('mycheck[]', TRUE),
'myradio'=>$this->input->post('myradio', TRUE)
);
//폼 검증이 성공했을 때 보여줄 페이지
$this->load->view('test/form_success_v', $data);
}
}
}
//폼 검증할 필드와 규칙 사전 정의
1. $this->form_validation->set_rules('username', '아이디', 'trim|required|min_length[5]|max_length[12]|htmlspecialchars|xss_clean|callback_username_check');
2. public function username_check($id)
{
3. $this->load->database();
if($id)
{
$result=array();
4. $sql="SELECT id FROM USERS WHERE username = '".$id."'";
$query=$this->db->query($sql);
$result=@$query->row();
5. if($result)
{
$this->form_validation->set_message('username_check', $id.'은(는) 중복된 아이디 입니다.');
return FALSE;
}
else
{
6. return TRUE;
}
}
else
{
7. return FALSE;
}
}
1. set_rule() 함수의 세 번째 파라미터에 콜백 함수를 뜻하는 접두사 callback 을 붙인 callback_username_check 를 추가합니다. 콜백 함수 username_check 를 실행하여 데이터를 검증하겠다라는 의미입니다.
2. 컨틀롤러 내에 username_check 함수를 새로 만들고 내용을 입력합니다. username 필드명으로 받은 변수의 값을 username_check 함수에
$id 변수로 전달합니다.
3. 데이터베이스를 로딩합니다.
4. users 테이블에서 폼 전송된 아이디로 검색을 하는 쿼리를 작성하여 실행합니다.
5. 중복된 아이디가 있다면 에러 메시지를 새로 정의합니다.
6. 중복된 아이디가 없다면 TRUE 를 반환하여 폼 검증을 마칩니다.
7. 폼 전송된 값이 없을 경우의 에러 처리를 위한 부분입니다.
|xss_clean| 을 사용할경우 스크립트 형식의 xss 는 remove 로 처리 된다.
5.5.2 에러 메시지를 개별적으로 표시하기
폼 검증의 에러 메시지를 표현하는 방법에는 두 가지가 있습니다. 지금까지 소스에 적용된 validation_errors()를 이용해 에러
메시지를 한번에 리스트로 표현하는 방법과 form_error() 를 이용해 개별적으로 표시하는 방법입니다.
개별적으로 표시할 경우 에러 메시지를 각 필드 아래나 옆에 표기할 수 있으므로 사용자가 에러 메시지와 항목을 매칭하기 편합니다.
뷰 파일을 수정하여 에러 메시지를 각각 표시해보겠습니다.
forms_v.php
<?php //echo validation_errors(); ?>
<?php
if(form_error('username')){
$error_username= form_error('username');
}else
{
$error_username=form_error('username_check');
}
?>
<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="text" 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="text" name="passconf" class="input-xlarge" id="input03" >
<p class="help-block">
<?php if(form_error('passconf')==FALSE){ echo "비밀번호를 한번 더 입력하세요.";}
else { echo form_error('passconf');}
?>
</p>
</div>
1. 기존 에러 메시지를 주석 처리합니다.
<?php //echo validation_errors(); ?>
2. 콜백 함수에서 username_check 룰에 대해 에러 메시지를 선언하기 때문에 작동할 때와 하지 않을 때 두 가지 경우를 모두 처리하기
위해 분기처리합니다.
<?php
if(form_error('username')){
$error_username= form_error('username');
}else
{
$error_username=form_error('username_check');
}
?>
=> 교재는 위와 같이 나와있으나 굳이 이렇게 하지 않아도 되며 다른 에러 처리 방법과 같은 방법으로 해도 된다.
<?php if(form_error('username')){ echo "아이디를 입력하세요.";}
else { echo form_error('username');}
?>
3. 처음 접속하면 "아이디를 입력하세요" 를 출력하고, 폼 검증을 거친 후에는 폼 검증 메시지를 출력합니다.
<?php if($error_username==FALSE){ echo "아이디를 입력하세요.";}
else { echo $error_username; }
?>
4. form_error() 함수를 직접 이용해 에러 메시지가 있는 경우에는 에러를 표시하고 처음 접속한 경우에는 "비밀번호를 입력하세요".
를 표시합니다.
<?php if(form_error('password')==FALSE){ echo "비밀번호를 입력하세요";}
else { echo form_error('password'); }
?>
댓글 ( 4)
댓글 남기기