Wrong paging on Codeigniter

Asked

Viewed 414 times

2

I have 15 Ads on my website and I have made pagination for 10 Ads per page. Okay, Codeigniter is paging with 10 Ads/Page, but on the second and last page Codeigniter is showing 10, when it should show only 5. This is the Controller code:

function index($offset = 0) {
      // load pagination library 

        $this->load->library('pagination'); 
        $limit = 10;
        $config = array();
        $config['base_url']             = base_url('');
        $config['uri_segment']          = 1;
        $config['total_rows']           = $this->classificados_model->somarTodos($f_estado, $f_cidade); 
        $config['per_page']             = $limit;
        $config['use_page_numbers']     = TRUE;
        $config['num_links']            = 2;
        $config['first_link']           = 'Primeiro';
        $config['last_link']            = 'Último';
        $config['next_link']            = '»';
        $config['prev_link']            = '«';
        $config['first_tag_open']       = '<li>';
        $config['first_tag_close']      = '</li>';
        $config['last_tag_open']        = '<li>';
        $config['last_tag_close']       = '</li>';
        $config['prev_tag_open']        = '<li>';
        $config['prev_tag_close']       = '</li>';
        $config['next_tag_open']        = '<li>';
        $config['next_tag_close']       = '</li>';
        $config['cur_tag_open']         = '<li class="active"><a href="javascript:">';
        $config['cur_tag_close']        = ' <span class="sr-only">(current)</span> </a></li>';
        $config['full_tag_open']        = '<nav>
                <ul class="pagination">';
            $config['full_tag_close']   = '</ul>
        </nav>';
        $config['num_tag_open']         = '<li>';
        $config['num_tag_close']        = '</li>';      
        $this->pagination->initialize($config);
        $dados['anuncios']          =   $this->classificados_model->buscaAnuncios($limit, $offset, $f_estado, $f_cidade);
        $dados['paginacao']         =   $this->pagination->create_links();  
}

Model: Standard Model

function buscaAnuncios($limit, $offset, $f_estado, $f_cidade) {
        $this->db->limit($limit, $offset);
        $where = array(
            'estados.sigla'                 =>  $f_estado, 
            'cidades.nome'                  =>  $f_cidade,
            'anuncios.anuncio_ativo'        =>  '1',
            'usuarios.bloqueado_usuario'    =>  '0',
            'usuarios.ativado_usuario'      =>  '1'
        );

        $this
            ->db
            ->select("*")
            ->from("usuarios")
            ->join("anuncios", "anuncios.usuario_anuncio_id = usuarios.id_usuario", "inner")
            ->join("estados", "estados.id = usuarios.estado_usuario", "inner")
            ->join("cidades", "cidades.id = usuarios.cidade_usuario AND estados.id = cidades.id_uf", "inner")


            ->order_by("anuncios.data_anuncio","desc");

            $query = $this->db->get_where('', $where);


        return $query->result_array();
    }

Result of page 2 query procedure:

SELECT *
FROM (`usuarios`)
INNER JOIN `anuncios` ON `anuncios`.`usuario_anuncio_id` = `usuarios`.`id_usuario`
INNER JOIN `estados` ON `estados`.`id` = `usuarios`.`estado_usuario`
INNER JOIN `cidades` ON `cidades`.`id` = `usuarios`.`cidade_usuario` AND estados.id = cidades.id_uf
WHERE `estados`.`sigla` =  'rj'
AND `cidades`.`nome` =  'rio de janeiro'
AND `anuncios`.`anuncio_ativo` =  '1'
AND `usuarios`.`bloqueado_usuario` =  '0'
AND `usuarios`.`ativado_usuario` =  '1'
ORDER BY `anuncios`.`data_anuncio` desc
LIMIT 2, 10

Prints:

Page 1:

prntscr.com/6n4t5x

prntscr.com/6n4sra

Page 2:

prntscr.com/6n4tat

prntscr.com/6n4tg4

Thanks in advance!

  • your limit is wrong LIMIT 2, 10 should be LIMIT 10.20

  • The "limit" would be the amount I want per page, right, but it is not right to appear that amount on the second, since the remaining 15 would be only 5 Ads on the second page..

1 answer

2


I suggest two amendments:

function buscaAnuncios($limit, $offset, $f_estado, $f_cidade) {

    $where = array(
        'estados.sigla'                 =>  $f_estado, 
        'cidades.nome'                  =>  $f_cidade,
        'anuncios.anuncio_ativo'        =>  '1',
        'usuarios.bloqueado_usuario'    =>  '0',
        'usuarios.ativado_usuario'      =>  '1'
    );

    $this
        ->db
        ->select("*")
        ->from("usuarios")
        ->join("anuncios", "anuncios.usuario_anuncio_id = usuarios.id_usuario", "inner")
        ->join("estados", "estados.id = usuarios.estado_usuario", "inner")
        ->join("cidades", "cidades.id = usuarios.cidade_usuario AND estados.id = cidades.id_uf", "inner")
        ->order_by("anuncios.data_anuncio","desc");

    // Definindo o limite e o offset APÓS o select;
    //
    // Imaginando que $limit seja a PÁGINA ATUAL (e comece em 1),
    // o offset dela é a quantidade de ítens nas páginas anteriores
    // (Página atual - 1) -> Páginas anteriores.
    // Remover o menos 1 se houver página 0.
    // Págs. Anteriores * limite -> Total de ítens "que passaram".
    $this->db->limit($limit, (($offset-1)*$limit));

    $query = $this->db->get_where('', $where);

    return $query->result_array();
}
  • Hi @Fernando Cordeiro, or is missing close a parenthesis in "$this->db->limit($limit, (($offset-1)*$limit);", or has to take a parenthesis from this beginning. Although I did both, neither of the two went well.. I am checking here the error that is giving and I answer already.

  • It was a mistake. D

  • Now it’s giving limit wrong.. LIMIT -10, 10

  • Thank you Fernando, it worked perfectly!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.