CI 묻고 답하기

제목 검색 후 페이지네이션에 관련해서 질문입니다.
글쓴이 씨아이조 작성시각 2014/10/30 16:41:20
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 13198   RSS
CI 책 읽고 혼자서 게시판 만드는 중입니다

다중 조건 검색을 만들고 있는데

검색한 후에 굳이 페이지네이션이 필요없는 갯수에도

전체 글 수를 기준으로 페이지가 생성됩니다

그래서 쿼리를 봤더니

SELECT FROM toylist ORDER BY toy_no DESC
SELECT FROM toylist WHERE description LIKE "%사운드%" and cartegory=110 and recom_age=5  ORDER BY toy_no DESC LIMIT 05

이런식으로 두개의 쿼리가 생성되어 있었습니다

이것과 페이지네이션이 생성된 것이 관련있을까요?

먼저 작업한 게시판은 검색해보니

밑의 긴 쿼리에서 뒤에 limit부분만 제거된 쿼리가 나와서

제대로 페이지네이션이 작동하던데요
왜 여러가지 조건문 주고나서는 잘 안작동할까요?

밑에 모델부분 소스 남겨봤습니다!

초보에다가 코드 정리도 안해서 조금 더럽더라도 이해해주세요 ㅠㅠㅠ

function get_list($table = 'toylist', $type='', $offset='', $limit='', $search_word='',$sfl='', $ctg='', $age=''){
        $sword = '';
        
        //검색어가 있을 경우 처리  
        if($search_word != ''){
            switch($sfl) {
                case "nam":
                    if($ctg != '' && $age != '') {
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" and cartegory='.$ctg.' and recom_age='.$age.' ';                      
                    } else if($ctg != ''){
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" and cartegory='.$ctg.' ';
                    } else if($age != ''){
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" and recom_age='.$age.' ';
                    } else {
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" ';
                    }                    
                    break;
                case "con":
                    if($ctg != '' && $age != '') {
                        $sword = ' WHERE description LIKE "%'.$search_word.'%" and cartegory='.$ctg.' and recom_age='.$age.' ';                      
                    } else if($ctg != ''){
                        $sword = ' WHERE description LIKE "%'.$search_word.'%" and cartegory='.$ctg.' ';
                    } else if($age != ''){
                        $sword = ' WHERE description LIKE "%'.$search_word.'%" and recom_age='.$age.' ';
                    } else {
                        $sword = ' WHERE description LIKE "%'.$search_word.'%" ';
                    } 
                    break;
                case "all":
                    if($ctg != '' && $age != '') {
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" or description like "%'.$search_word.'%" and cartegory='.$ctg.' and recom_age='.$age.' ';                      
                    } else if($ctg != ''){
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" or description like "%'.$search_word.'%" and cartegory='.$ctg.' ';
                    } else if($age != ''){
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" or description like "%'.$search_word.'%" and recom_age='.$age.' ';
                    } else {
                        $sword = ' WHERE toy_name LIKE "%'.$search_word.'%" or description like "%'.$search_word.'%" ';
                    }                    
                    break;                
            }          
        } else if($ctg != '' && $age != '') {
            $sword = ' WHERE cartegory='.$ctg.' and recom_age='.$age.'';                      
        } else if($ctg != ''){
            $sword = ' WHERE cartegory='.$ctg.'';
        } else if($age != ''){
            $sword = ' WHERE recom_age='.$age.'';
        }
        $limit_query = '';
        
        if ($limit != '' OR $offset != ''){
            //페이징이 있을 경우의 처리
            $limit_query = " LIMIT ".$offset.", ".$limit;
        }
        $sql = "SELECT * FROM ".$table.$sword." ORDER BY toy_no DESC".$limit_query;        
        $query = $this->db->query($sql);
        if($type == 'count'){
            //리스트를 반환하는 것이 아니라 전체 게시물의 개수를 반환
            $result = $query->num_rows();           
        } else {
            //게시물 리스트 반환
            $result = $query->result();
        }        
        return $result;        
    }    
 다음글 URL에서 컨트롤러, 메서드를 빼고 싶습니다. (1)
 이전글 urlencode 된 파일 불러오기 질문입니다 (4)

댓글

kaido / 2014/10/30 16:56:51 / 추천 0
표면적으로 보기에는 큰 문제는 없어 보입니다만... 

일단 조언을 몇개 해 드리겠습니다.

limit가 붙는 <span 0,="" 0);="" font-family:consolas,monaco,bitstream="" vera="" sans="" mono,courier="" new,courier,monospace"="">get_list 함수는 그대로 사용 하시고
limit 가 안붙는 totol_list는 따로 함수를 빼서 불러오시는것이 더 보기에도 사용하기에도 좋습니다.

굳이 페이지네이션이 사용되고 안되고를 분리를 하실거면 모델에서 분리를 하기 보다는 
컨트롤러에서 조건을 넣으시는게 더 편리 하실 것입니다.

그리고 테스트를 안해봐서 모르겠습니다만 if 조건문이 정말 원하는 대로 나오는지 하나씩 테스트 해보셔야 될것 같습니다.
not 연산자와 else 이 만나면 생각지 못한 골룸한 조건이 되는 경우가 있습니다.

아참 그리고 get이나 세그먼트 방식이시면 검색어의 urlencode 확인도 해보셔야 합니다.
씨아이조 / 2014/10/30 17:24:24 / 추천 0
kaido님 답변 감사합니다
비록 답은 아니었지만 좋은 것 배워서 갑니다! 제 코드가 한층 더 향상되겠네요!!

그리고 질문 올린들에 대한 자답입니다...

쿼리가 2개인건 모델을 두번 호출해서 이군요 하하
이런 기초적인 것도 몰랐다니
문제가 발생한건 서로 인자값의 갯수가 달라서 였습니다
두군데 인자갑 모두 동일하게 처리해주니  해결되었습니다!