codeigniter的分页偏移不起作用

时间:2013-05-04 16:09:57

标签: codeigniter pagination

在CI的分页中,数据索引应遵循偏移量。例如:如果限制为10,那么第二个索引应该有10个偏移量,这意味着索引将从11到20开始。

我遵循了一些教程,但我仍然无法让这个偏移的东西正常工作。 每次点击不同的分页索引时,我的索引始终重置为1

这是我的分页代码注意,我试图回应$offset,值为 true (第二个索引= 10,第三个index = 20,$limit = 10)所以我不知道为什么它不起作用

public function index($offset = 0) {
        //check authorization
        if(!isset($_SESSION['username']))
            redirect('backend_umat/login');

            // the $offset value is true, but the index is still reseted to 1   
        echo $offset;
        $limit = 10;
        $result = $this->umat_m->get_umat($limit, $offset);

        //pagination
        $config['base_url'] = site_url('/backend_umat/index');
        $config['total_rows'] = $result['num_rows'];
        $config['per_page'] = $limit; 
        $config['uri_segment'] = 3;
        $config['full_tag_open'] = '<div id="pagination">';
        $config['full_tag_close'] = '</div>';

        $this->pagination->initialize($config); 

        $data['pagination'] = $this->pagination->create_links();

这是我的模特:

public function get_umat($limit, $offset) {
        $this->db->select('*')->from('msumat')->limit($limit, $offset)->
        join('mskelas', 'msumat.kelas_id = mskelas.kelas_id');

$q = $this->db->get();
            $result['rows'] = $q->result();

            $result['num_rows'] = $this->db->select('*')->from('msumat')->
                                  join('mskelas', 'msumat.kelas_id = mskelas.kelas_id')
                                  ->get()->num_rows();

return $result;

感谢您的帮助:D

3 个答案:

答案 0 :(得分:1)

    public function index() {
        //check authorization
        if(!isset($_SESSION['username']))
            redirect('backend_umat/login');

        // the $offset value is true, but the index is still reseted to 1   


    //pagination
    $config['base_url'] = base_url().'backend_umat/index';
    // basically you need a separate query to return only numrows
    $config['total_rows'] = ?;
    $config['per_page'] = 10; 
    $config['uri_segment'] = 3;
    $config['full_tag_open'] = '<div id="pagination">';
    $config['full_tag_close'] = '</div>';

    $this->pagination->initialize($config); 
    $offset = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;

    $result = $this->umat_m->get_umat( $config['per_page'], $offset);

    $data['pagination'] = $this->pagination->create_links();

在这里尝试一下,我改变了一些代码希望这个有效。基本上我首先将分页配置初始化,然后从模型中调用任何内容。只需单独查询即可获得数量。

答案 1 :(得分:1)

控制器 site.com/<controller>/index/<page>

public function index($offset = 0) {
    //check authorization
    if(!isset($_SESSION['username']))
        redirect('backend_umat/login');

    $limit   = 10;
    $offset = (int) $offset;
    $result  = $this->umat_m->get_umat($limit, $offset);

    //pagination
    $config['base_url']       = site_url('/backend_umat/index');
    $config['total_rows']     = $result['num_rows'];
    $config['per_page']       = $limit; 
    $config['uri_segment']    = 3;
    $config['full_tag_open']  = '<div id="pagination">';
    $config['full_tag_close'] = '</div>';

    $this->pagination->initialize($config); 

    $data['pagination'] = $this->pagination->create_links();

模型

public function get_umat($limit, $offset) {
    $result['rows'] = $this->db
        ->select('SQL_CALC_FOUND_ROWS, msumat.*, mskelas.*', FALSE)
        ->limit($limit, $offset == 1 ? 0 : $offset)
        ->join('mskelas', 'msumat.kelas_id = mskelas.kelas_id')
        ->get('msumat')
        ->result();

    $req = $this->db->query('SELECT FOUND_ROWS()')->row_array(); 
    $result['num_rows'] = $req['FOUND_ROWS()']; 

    return $result;
}

如果请求不包含LIMIT语句,则不必重写第二个sql req,可以使用SQL_CALC_FOUND_ROWS检索总数。但这可能比两个请求慢。

我在FALSE中使用select()作为第二个参数,以便CI不会尝试使用反引号来保护字段或表名。

->select('*'):如果您想要所有字段,则无用,如果未调用select方法,CI将默认执行此操作。

->get()->num_rows():改为使用->count_all_results([table])

答案 2 :(得分:0)

首先,感谢tomexsans和lighta的帮助。对不起,我犯了一个“愚蠢”的错误 - 大概需要2-3个小时来实现 - 索引不跟随$ offset,因为我忘了使用那个变量。我使用一个整数,每次页面加载时我都会重置为1,因此索引将永远重置为1:P