Codeigniter

소스 : 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'); }
						?>	

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

승리를 잘 유지하는 사람은 강하면서 약한 것 같이 행동한다. -열자

댓글 ( 4)

댓글 남기기

작성