CI 묻고 답하기

제목 모델쪽에서 sql문에서 변수를 사용하면..
카테고리 CI 2, 3
글쓴이 창쓰 작성시각 2017/08/28 15:15:07
댓글 : 9 추천 : 0 스크랩 : 0 조회수 : 13658   RSS

모델쪽에서 sql문에다 변수를 사용하게 되면 읽어오지 못하는데..

뭐가 문제일까요??

 

소스 첨부합니다.

 

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

         $sword = '';

         if ($search_word != '') {
             // 검색어 있을 경우
             $sword = ' WHERE subject like "%' . $search_word . '%" or contents like "%' . $search_word . '%" ';
         }

         $limit_query = '';

         if ($limit != '' OR $offset != '') {
             // 페이징이 있을 경우 처리
             $limit_query = ' LIMIT ' . $offset . ', ' . $limit;
         }

         $sql = "SELECT * FROM " . $table . $sword . " ORDER BY id DESC " . $limit_query;
         $query = $this -> db -> query($sql);

         if ($type == 'count') {
             $result = $query -> num_rows();
         } else {
             $result = $query -> result();
         }

         return $result;
     }

 

이렇게 설정하고 접속하면

이렇게 SELECT*FROM ORDER BY id DESC 로 나옵니다.

원래는 중간에 $table 이랑, $sword를 넣으면 이렇게 오류가 납니다..

$sql = "SELECT * FROM " . $table . $sword . " ORDER BY id DESC " . $limit_query; 이 라인이 문제인데.

여기서 변수를 없애고 테이블명을 때려박으면,

$sql = "SELECT * FROM bookingdb ORDER BY id DESC " . $limit_query; 로는 정상작동을 합니다..

왜 이러는 건지 모르겠습니다.

검색기능을 넣을려다가 저 부분이 문제가 생겨서..

 

 다음글 password_helper 관련 질문입니다..! (4)
 이전글 CI와 jQuery를 접한지 일주일정도된 초보입니다..... (5)

댓글

배강민 / 2017/08/28 15:21:55 / 추천 0

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

사용처에서 첫번재 인수에 ''이 넘어갔을듯한데요?

넘어온 $table은 찍어보셨습니까?

 

변종원(웅파) / 2017/08/28 15:24:11 / 추천 0

테이블 변수가 안 넘어가서 그렇습니다. 모델함수에 bookingdb라고 명시되어 있더라도 아무 것도 명시 하지 않아야 작동됩니다.

get_list()라고 써야 작동된다는 이야기입니다.

창쓰 / 2017/08/28 15:24:29 / 추천 0
@배강민 넵! $table 찍어봤는데.. 넘어가지지가 않더라고요 ㅠㅠ 왜 이런건지..ㅠ
창쓰 / 2017/08/28 15:34:33 / 추천 0

@웅파님 다름이 아니라 제가 책을보고 따라하고 있는데.. 제가 이해 한게 맞는지 모르겠습니다.

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

이런 형식으로 변경하면 된다는 뜻인가요?? 이렇게 변경하면 변수값이 뭔지 모르기 때문에 안넘어가지지 않나요??

아니면,  밑에 형식처럼 사용하라는 말씀인가요??ㅠㅠ 

제가 이해를 잘못해서 죄송합니다..

 function get_list() {
         $table = 'bookingdb';
         $type = ''; 
         $offset = '';
         $limit = ''; 
         $search_word = '';
         $sword = '';

         if ($search_word != '') {
             // 검색어 있을 경우
             $sword = ' WHERE subject like "%' . $search_word . '%" or contents like "%' . $search_word . '%" ';
         }

    //이하생략

{

배강민 / 2017/08/28 15:41:31 / 추천 0

안넘어가는게 아니라 잘못된 값을 넘기시는 겁니다.

이전에 질문하셨던거 기억으로는 segment로 table값을 받으시던데, 그걸 잘못 받으셨거나 어쨋든 get_list로 넘기기전에 조작이되어서 비어지던가 뭔가 모델을 사용하기 전단의 문제입니다.

변종원(웅파) / 2017/08/28 16:18:01 / 추천 0

책이라면 세그먼트를 잘못 선언해서 주소에서 테이블명을 못가져오는 것입니다.

컨트롤러에서 테이블명을 출력해보세요. 주소에서 ci_board가 몇번째 세그먼트인지 세어보시구요.

창쓰 / 2017/08/28 21:49:46 / 추천 0

@변종원 @배강민님 답변주셔서 감사합니다.

하지만, 해결이 되지않았습니다.

책에 나온 예제 그대로를 적용시켜서 해봤는데도..

이렇게 테이블명을 불러오지못합니다 ㅠㅠ

/** 모델부분 **/
  /**
      * 목록 불러오기
      */
   class Board_m extends CI_Model {
    function __construct() {
        parent::__construct();
    }

    function get_list($table = 'ci_board', $type = '', $offset = '', $limit = '') {
        $limit_query = '';

        if ($limit != '' OR $offset != '') {
            // 페이징이 있을 경우 처리
            $limit_query = ' LIMIT ' . $offset . ', ' . $limit;
        }

        $sql = "SELECT * FROM " . $table . " ORDER BY board_id DESC " . $limit_query;
        $query = $this -> db -> query($sql);

        if ($type == 'count') {
            $result = $query -> num_rows();
        } else {
            $result = $query -> result();
        }

        return $result;
    }

}

/** 컨트롤러부분 **/
  /**
      * 목록 불러오기
      */
     public function lists() {
         $this -> load -> library('pagination');

         // 페이지 네이션 설정
         $config['base_url'] = '/bbs/board/lists/ci_board/page';
         // 페이징 주소
         $config['total_rows'] = $this -> board_m -> get_list($this -> uri -> segment(3), 'count');
         // 게시물 전체 개수
         $config['per_page'] = 5;
         // 한 페이지에 표시할 게시물 수
         $config['uri_segment'] = 5;
         // 페이지 번호가 위치한 세그먼트

         // 페이지네이션 초기화
         $this -> pagination -> initialize($config);
         // 페이지 링크를 생성하여 view에서 사용하 변수에 할당
         $data['pagination'] = $this -> pagination -> create_links();

         // 게시물 목록을 불러오기 위한 offset, limit 값 가져오기
         $page = $this -> uri -> segment(5, 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 -> board_m -> get_list($this -> uri -> segment(3), '', $start, $limit);
         $this -> load -> view('list_v', $data);
     }

 

변종원(웅파) / 2017/08/28 21:59:17 / 추천 0

주소가 빠졌네요. 책 다시 잘 보세요. board/lists/ciboard 형태가 정상형태입니다.

컨트롤러의 페이징주소 부분에도 나와있네요.

창쓰 / 2017/08/29 13:12:01 / 추천 0

@변종원 @이강민님 감사합니다. 잘 해결되었습니다.

제가 멍청하게 url에 db테이블명을 넣지않아서.. 끝까지 도움주셔서 감사합니다.