만들면서 배우는 CodeIgniter Q&A

제목 $search_word가 넘어오질 않습니다.
글쓴이 PCB 작성시각 2017/11/02 12:08:32
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 10582   RSS

게시판에 검색어를 입력하고 검색을 실행하면 검색어가 있는데 쿼리에 적용이 안됩니다. 

DB에서

검색어 쿼리를 실행하면 정상적으로 실행되어 리스트는 나옵니다. 

 

콘트롤에서 

$data['list'] = $this->board_m->get_list($this->uri->segment(3), '', $start, $limit, $search_word='8');

임의로 검색어를 '8'로 적용하면 해당하는 검색어 리스트가 출력됩니다.

 

증상)

콘트롤러에서 

$data['list'] = $this->board_m->get_list($this->uri->segment(3), '', $start, $limit, $search_word);

 

모델에서 

function get_list($table='ci_board', $type='', $offset='', $limit='', $search_word='')

$search_word로 콘트롤러에서 넘어오질 않는것으로 판단됩니다.

 

질문 1. 2번전과 3번전에 차이가 있는건지요? (현재 3버전에서 테스트 중입니다.)

질문2. 프로파일러에서 $_POST['search_word']  / URI STRING 다 넘어오는것을 확인 됩니다. 

 

근데 왜 안되는지 모르겠습니다. 

 다음글 No such file or directory [ 경고... (5)
 이전글 bbs 글 쓰기시 익스플로러에서 이중등록되는 문제 (1)

댓글

변종원(웅파) / 2017/11/02 14:23:41 / 추천 0

컨트롤러에서는 파라미터가 4개, 모델에선 파라미터가 5개입니다.

수정을 덜 하셨네요. ^^

PCB / 2017/11/02 21:24:19 / 추천 0

// 컨트롤러에서는 파라미터가 4개, 모델에선 파라미터가 5개입니다.

$config['total_rows'] = $this->board_m->get_list($this->uri->segment(3), 'count', '', '', $search_word);

$data['list'] = $this->board_m->get_list($this->uri->segment(3), '', $start, $limit, $search_word);

원본 소스에도 컨트롤러에 파라미터 5개, 모델에서도 5개로 나오는데

콘트롤러에서 4개라는 건 어떤걸 말씀하시는건지요?

변종원(웅파) / 2017/11/03 10:06:30 / 추천 0

본문 수정하신 것 같네요. 

컨트롤러에서 넘어온 $seach_word와 모델에서 받은 $seach_word 출력해보세요.

값 출력해보는 것은 아주 원초적이지만 제일 강력하고 쉬운 디버깅 방법입니다.

8이라는 값을 명시했을 때 검색된다는 것과 $_POST 변수에서는 있다는 것으로 미뤄봐서

컨트롤러에서 $seach_word 라는 값을 할당하지 않은 것 같네요. 컨트롤러 해당 소스를 올려보세요.

PCB / 2017/11/03 10:36:34 / 추천 0
답변 주셔서 감사하고 다시한번 확인 부탁드립니다. ^^
 
그동안 답변을 주신 내용을 정리하면
컨트롤러에 파라미터4개 -> 페이지네이션 적용시 말씀인것으로 예상
컨트롤러에 파라미터 개수와 순서가 잘 못 됐다 -> 요 부분은 원본 소스와 똑같이 적용했는데 안됩니다. ㅠㅠ
 
컨트롤러 소스
public function lists()
{
$this->output->enable_profiler('TURE');
 
// 검색어 초기화
$search_word = $page_url = '';
$uri_segment = 5;
 
// 주소 중에서 q (검색어) 세그먼트가 있는지 검사하기 위해 주소를 배열로 변환
$uri_array = $this->segment_explode($this->uri->uri_string());
 
if( in_array('q', $uri_array) ) 
{
// 주소에 검색어가 있을 경우의 처리, 즉 검색 시
$search_word = urldecode($this->url_explode($uri_array, 'q'));
 
// 페이지네이션용 주소
$page_url = '/q/'.$search_word;
$uri_segment = 7;
}
 
// 페이지네이션 라이브러리 로딩 추가
$this->load->library('pagination');
 
// 페이지네이션 설정
$config['base_url'] = '/bbs/personal/lists/learn'.$page_url.'/page/'; //페이지 주소
$config['total_rows'] = $this->personal_m->get_list($this->uri->segment(3), 'count', '', '', $search_word); // 게시물 전체 개수
 
// 게시물 전체 갯수
$config['per_page'] = 12; // 한 페이지에 표시할 게시물 수
$config['uri_segment'] = $uri_segment; // 페이지 번호가 위치한 세그먼트
 
// 페이지네이션 초기화
$this->pagination->initialize($config);
// 페이징 링크를 생성하여 view에서 사용할 변수에 할당
$data['pagination'] = $this->pagination->create_links();
 
// 게시물 목록을 불러오기 위한 offset, limit 값 가져오기 
$data['page'] = $page = $this->uri->segment($uri_segment, 1);
 
if ( $page > 1 )
{
$start = (($page/$config['per_page'])) * $config['per_page'];
}
else
{
$start = ($page-1) * $config['per_page'];
}
 
$limit = $config['per_page'];
 
$data['list'] = $this->personal_m->get_list($this->uri->segment(3), '', $start, $limit, $search_word);
$this->load->view('learn/personal_list', $data);
}
 
모델 소스
function get_list($table='learn', $type='', $offset='', $limit='', $search_word='')
    {
      echo $search_word;
      
      $sword = ' WHERE learn_type = 1';
 
      if ( $search_word != '' ) 
      {
        // 검색어가 있을 경우의 처리
        $sword = ' WHERE title LIKE "%'.$search_word.'%" OR item LIKE "%'.$search_word.'%" AND learn_type = 1';
      }
 
        $limit_query = '';
 
        if ( $limit != '' OR $offset != '' )
        {
          // 페이징이 있을 경우의 처리
          $limit_query = ' LIMIT '.$offset.', '.$limit;
        }
 
        $sql = "SELECT * FROM ".$table.$sword." ORDER BY board_id DESC".$limit_query;
 
        $query = $this->db->query($sql);
 
        if ( $type == 'count') 
        {
          // 리스트를 반환하는 것이 아니라 전체 게시물의 개수를 반환
          $result = $query->num_rows();
 
          // $this->db->count_all($table);
        }
        else 
        {
          // 게시물 리스트 반화
          $result = $query->result();
        }   
      
        return $result;
 
    }
변종원(웅파) / 2017/11/03 13:55:55 / 추천 0

컨트롤러에서 아래 부분이 주소에서 검색어를 가져오는 부분입니다.

주소에 q 라는 부분이 없으면 $search_word를 찾아오지 못합니다. 주소를 확인해보세요.

 

// 주소에 검색어가 있을 경우의 처리, 즉 검색 시
$search_word = urldecode($this->url_explode($uri_array, 'q'));
PCB / 2017/11/03 14:25:30 / 추천 0

답변을 계속 주시는데 틀린점을 찾지 못해서 계속 헤메고 있습니다. ㅠㅠ

 

$search_word = urldecode($this->url_explode($uri_array, 'q'));

말씀하신 부분은 소스에 적용되어 있고, 검색어 입력 후 URL("personal/lists/learn/q/8/page/1", 프로파일에서도 정상적으로 검색어 보여집니다. ) 주소에도 표시는 됩니다. 

위의 코드는 $page_url로 받아서 url에 표시되는걸로 알고 있습니다.

 

프로그램언어라는게 참 어렵습니다!!! ㅜㅠ

변종원(웅파) / 2017/11/03 14:47:28 / 추천 0
컨트롤러에서 출력을 해보세요.