CI 묻고 답하기

제목 페이지 네이션 궁금한거 다시 올립니다 전체 소스 controllers, models
글쓴이 일성 작성시각 2014/08/14 10:36:42
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 14463   RSS
class Meat_model extends CI_Model {

    //생성자
    function __construct(){
        parent::__construct();
    }
    function get_kind($no){
        $query =  $this->db->query("SELECT * FROM `recipe` WHERE kind ={$no} ORDER BY no DESC LIMIT 12 ;");
    
        if ($query->num_rows() > 0) {
            return $query->result_array();    
        }
        return FALSE;
    }
    
    function get_lis($no){
        $query =  $this->db->query("SELECT * FROM `recipe` WHERE kind ={$no} ORDER BY no DESC LIMIT 3;");
    
        if ($query->num_rows() > 0) {
            return $query->result_array();    
        }
        return FALSE;
    }
    
    function gallery($no){
        $query =  $this->db->query("SELECT * FROM `recipe` WHERE kind ={$no} ORDER BY no DESC LIMIT 9;");
    
        if ($query->num_rows() > 0) {
            return $query->result_array();    
        }
        return FALSE;
    }
    
    function get_item($no) {
        $query =  $this->db->query("SELECT * FROM `recipe` WHERE no={$no};");
            if($query) {
                if ($query->num_rows() > 0) {    
                    return $query->row_array(); 
                }
            }
            return FALSE;;
    }
    
    function get_list($s, $n) {//$s는 게시판 개수 $n는 가지고오는수 
        $query = $this->db->query("SELECT * FROM `recipe`  ORDER BY no DESC LIMIT {$s}, {$n};");
        if($query) {//쿼리분이 정상적으로 들어 간는지 확인
            if ($query->num_rows() > 0) {//$query->num_rows(): 쿼리의 계수    
                return $query->result_array();
            }
        }
        return FALSE;
    
    }
    function all_count($no) {
    
        //$this->db->where('kind', 1);
        //DB전체 값을 전부 받아온다
        //return $this->db->count_all('recipe'); 
        //원하는값을 전체 값을 받아 온다
        
        $query =  $this->db->query("SELECT * FROM recipe WHERE kind LIKE {$no} ;");
    
        if($query){
            return $query->num_rows();
        }
        return 0;
        
        
    }
}



controllers

class Meat extends CI_Controller {

    function __construct() {
        parent::__construct();
        
        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');
        $this->load->library('pagination');
        $this->load->model('meat_model',"i_obj",TRUE);
    }    

    public function index(){
        
        $data['meat'] = $this->i_obj->get_kind(1);
        $data['ite'] = $this->i_obj->get_lis(1);
        $data['gallery'] = $this->i_obj->gallery(1);    

        //$this->load->view('meat_view',$data);
        $this->page();
    }
    
    public function view(){
        if($this->session->userdata('logged_in') == TRUE){
            $no = $this->uri->segment(3,0);
            
            if($no > 0) {
                $data['meat_item'] = $this->i_obj->get_item($no);
                
                $this->load->view('meat_content_view', $data);
            }
            
        
        }
        else{
            echo "";
            echo "";
            redirect(site_url('login'), 'refresh');    
    
        }
    }
    public function  page() {
        $data['meat'] = $this->i_obj->get_list($this->uri->segment(3,0),12);
        $data['ite'] = $this->i_obj->get_lis(1);
        $data['gallery'] = $this->i_obj->gallery(1);    
        
        //CI에서 제공해주는 페이지 네이션 환경설정
        $config['total_rows'] = $this->i_obj->all_count(1);
        $config['per_page'] = 12; 
        $config['base_url'] = site_url('/meat/page');
        
        $config['full_tag_open'] = '
  • ';
            $config['full_tag_close'] = '
';        

        $config['num_tag_open'] = '
  • ';
            $config['num_tag_close'] = '
  • ';

            $config['cur_tag_open'] = '
  • ';
            $config['cur_tag_close'] = '
  • ';

            $config['first_link'] = '처음';
            $config['first_tag_open'] = '
  • ';
            $config['first_tag_close'] = '
  • ';
            
            $config['last_link'] = '끝';
            $config['last_tag_open'] = '
  • ';
            $config['last_tag_close'] = '
  • ';
            
            $config['prev_link'] = '이전';
            $config['prev_tag_open'] = '
  • ';
            $config['prev_tag_close'] = '
  • ';
            
            $config['next_link'] = '다음';
            $config['next_tag_open'] = '
  • ';
            $config['next_tag_close'] = '
  • ';

            
            $this->pagination->initialize($config);
            $data['page'] = $this->pagination->create_links(); 
            
            $this->load->view('meat_view',$data);


        }
        
    }
    이런식으로 했는되 안되더라고요
    페이지네이션을 작동하는되 db에 있는 recipe테이블에서 마지막부터 64개 만 가지고 오던라고요 뭐 어떻게하면 위에서 말한것 같이 된수있나요  초보입니다 불가 시작한지 5개월 ,,,,
     
 다음글 쿼리 작성시 질문 입니다. (2)
 이전글 body공백 (1)

댓글

letsgolee / 2014/08/15 11:21:22 / 추천 0
기본이 안되어 있으면 솔직히 설명하려해도 맨붕이 됩니다. mysql 쿼리문 작성하는 것부터 배워야 할듯요... 한가지만 설명할께요... 나머지는 패스... 위 코드 중에서

function all_count($no) {   
        //$this->db->where('kind', 1);
        //DB전체 값을 전부 받아온다
        //return $this->db->count_all('recipe'); 
        //원하는값을 전체 값을 받아 온다
        
        $query =  $this->db->query("SELECT * FROM recipe WHERE kind LIKE {$no} ;");
    
        if($query){
            return $query->num_rows();
        }
        return 0;
              
    }
를 보면 다음의 문제점이 있습니다.
단순히 rows count를 가져오는데 모든 데이터 값을 가져오려고 합니다. 만일 데이터 값이 1,000,000,000개의 rows라면 아마 서버가 미쳐버리겠죠??? 단순 count를 가져오려면 쿼리는 이렇게 됩니다:
function all_count($no) {
    $sql = "select count(*) as cnt from recipe where kind = ".$this->db->escape($no);
    $query = $this->db->query($sql);
    if ($query->num_rows() > 0) {
        $row = $query->row();
        return $row->cnt;
    }
    return false;
}
그런데 이미 코드이그나이터에서는 위의 방식을 간단히 하는 코드를 제공하고 있습니다.

http://codeigniter-kr.org/user_guide_2.1.0/database/active_record.html
위의 링크에서 count_all_results가 그겁니다. 따라서 위의 코드를 단순하게 작업하면
$this->db->where('kind', $no);
$this->db->from('recipe');
return $this->db->count_all_results();

이렇게 하면 됩니다. 위에서 like를 안쓰고 where를 쓴 것은 kind값이 1만 들어가는 상황인 것 같아 like를 사용하지 않았습니다. 전체적으로 코드이그나이터보다는 mysql 사용법부터 배우시길 권해드립니다.