만들면서 배우는 CodeIgniter Q&A

제목 게시판에 다중 검색 조건을 넣고 싶은 경우
글쓴이 비바람 작성시각 2014/03/20 18:47:35
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 12956   RSS
  안녕하세요. Codeigniter 초보 입니다. 

'배우면서 만드는...' 책을 구매하여 참고하면서 개발을 하고 있는데요 
아래 코드와 같이 검색어를 입력하면 url을 parsing하여 검색 결과를 돌려주게되어 있는데 
한 단어 검색에서는 아래의 방법이 좋은것 같습니다. 

if( in_array('q', $uri_array)){
$search_word = urldecode($this->url_explode($uri_array, 'q'));
$page_url = '/q/'.$search_word;
$uri_segment = 7;
}

그런데 검색 조건이 여러개 일때... 예를 들어 날짜나 특정 조건들이 들어가서 3~4가지의 조건을 
검색에 반영할때는 어떻게 하는것이 좋은지 몰라 문의 드립니다. 

예를들어 
"2014년 1월 부터 5월까지의 게시물 중 "코드이그나이터"라는 단어가 들어가고 "code"라는 유저가 작성한 게시물"을 검색한다고 할 때 관련된 값들을 url로 넘기는 것은 비효율적일 것 같은데요 _GET이나 _POST를 병행해서 써야되는지 아니면 오브젝트 등으로 넘길 수 없는지 궁금 합니다. 

감사합니다. 

 
 다음글 p87질문입니다. (5)
 이전글 그림4-1결과화면에서 한글이 전부 깨져서 나오네여. (6)

댓글

변종원(웅파) / 2014/03/20 18:53:50 / 추천 0
제 경우 파라미터가 많은 경우엔 혼용방식으로 사용합니다.

a.com/controller/method/?a=1&b=2&c=3 형태로요.

책에서 부록 config.php 부분 보시면 주소 관련된 셋팅이 있습니다. 참고하세요.
timothy / 2014/04/16 00:42:54 / 추천 0
컨트롤러에 get방식으로 넘기고, 컨트롤러에서 segment_explode함수로 배열을 받아, in_array함수로 'q'라고 검색어를 찾듯이,
세그먼트를 추가하여 if문으로 특정 조건의 검색어를 받습니다.

이때에는 페이지네이션 설정과 관련된 추가작업이 발생합니다.

또는 아시겠지만, 검색어를 파싱하는 방법이 있는데요.

아스키코드 중 D와 닮은 값'Ð'이 있습니다.
(저는 이클립스 PDT를 쓰지만, 요 때에는 에디트플러스 참조)검색어로 사용가능성이 낮은 구분자를 통해, 파싱해서 사용하실 수도 있습니다.

모델에 넘길 때에는 배열로 넘깁니다.
timothy / 2014/04/16 15:36:17 / 추천 0
컨트롤러: lists()멤버 함수에서

검색어가 있는 경우에 따라서...
if( in_array('q', $uri_array)){
 $search_word = urldecode($this->url_explode($uri_array, 'q')); 
}
if( in_array('kword', $uri_array)){
 $kword = urldecode($this->url_explode($uri_array, 'kword'));
}
if( in_array('sword', $uri_array)){
 $sword = urldecode($this->url_explode($uri_array, 'sword'));
}


위와 같이 처리를 하고 각각의 if안에 flag를 체크하여, 세 가지 경우에 따라
페이지네이션 처리에 사용할 $page_url, $uri_segment을 값을 조정합니다.

예를 들어 세 개의 조건을 모두 만족한다면, 아래와 같이 처리가 될 것입니다.

$page_url = '/q/'.$search_word.'/kword/'.$kword.'/sword/'.$sword;
$uri_segment = 10; // 검색어 세그먼트 수에 따라 값 변경

모델의 get_list()를 통해 위의 검색어들에 해당하는 인자 값을 넘깁니다.
$this->board_m->get_list('테이블명', 'count', '', '', $search_word, $kword, $sword);


모델: 인자로 넘겨받은 값이 유효한지 체크를 한 뒤, 쿼리에 이용합니다.

모델에 넘길 때, 아래처럼, post된 값을  배열에 담아서 넘길 수도 있습니다.
예를 들어,
컨트롤러:
// 배열에 담기
$ary_sword = array(
'tbl' => '테이블명',
'cnt'=>'count',
...
'num' => $this->input->post('num', TRUE), // 게시물 번호
'search_word' => $this->input->post('search_word', TRUE),
'kword' => $this->input->post('kword', TRUE),
'sword' => $this->input->post('sword', TRUE)
);

// 모델에 배열 넘기기
$this->event_m->edtEvent($ary_sword);


모델:
/**
* 이벤트 수정
* @param array $data DB에 업데이트할 내용
* @return DB결과
*/
function edtEvent($data){
 // $data 유효성 체크...
 // 값 사용
 $result = $this->db->update($data['tbl'], ......);
 return $result;
}
위와 같은 예로 배열을 통해 처리하실 수도 있습니다.

저의 경우, POST나 GET방식 모두 사용하는데요.
POST로 받으면 이를 배열로 담아서 모델에 넘겼습니다.

GET방식으로 받으면 url_explode을 통해 처리를 했습니다.

timothy / 2014/04/16 15:53:00 / 추천 0
만일 쿼리스트링으로 작업을 하신다면,
config/config.php의
$config['enable_query_strings'] = FALSE; 값을 변경하시면 됩니다.