在CodeIgniter中使用分页时数据量不一致

时间:2012-04-25 10:22:01

标签: php sql codeigniter codeigniter-form-helper

我想在CodeIgniter中使用分页库执行大量数据。我一直在实施它,它的工作原理。但是,我有一个问题 - 每页的数据量不一致。

这是我用它制作的简单代码......

控制器

class Buku_con extends Controller {

    public function Buku_con() {
        parent::__construct();
        $this->load->model('buku_model');
        $this->load->library('pagination'); //call pagination library
    }

    function getBuku() {
        //count the total rows of tb_book
        $this->db->select('*');
        $this->db->from('tb_book');
        $getData = $this->db->get('');
        $a = $getData->num_rows();
        $config['base_url'] = base_url().'index.php/Buku_con/getBuku/'; //set the base url for pagination
        $config['total_rows'] = $a; //total rows
        $config['per_page'] = '10'; //the number of per page for pagination
        $config['uri_segment'] = 3; //see from base_url. 3 for this case
        $config['full_tag_open'] = '<p>';
        $config['full_tag_close'] = '</p>';
        $this->pagination->initialize($config); //initialize pagination
        $data['detail'] = $this->buku_model->getBuku($config['per_page'],$this->uri->segment(3));
        $this->load->view('buku_view', $data);
    }

}

模型

class Buku_model extends Model {

    function Buku_model() {
        parent::Model();
    }

    function getBuku($perPage,$uri) { //to get all data in tb_book
        $title=$this->session->userdata('title');
        $this->db->select('*');
        $this->db->from('tb_book');
        $this->db->where('title','$title');
        $this->db->order_by('id','DESC');
        $getData = $this->db->get('', $perPage, $uri);
        if($getData->num_rows() > 0)
            return $getData->result_array();
        else
            return null;
    }
}

查看

if(count($detail) > 0) { 

//... html for table .....

foreach($detail as $rows) {
    echo 
    .... $rows['id'] .....
    .... $rows['title'] .....
    .... $rows['author'] .....
    ....
} 
echo $this->pagination->create_links(); ....

分页效果很好,但每页数据量与我在控制器中定义的不一致。我认为问题是由我在模型中使用的查询引起的 - 标题会话。

我希望数据每页执行10个数据,但在第1页中只有5个数据,第2页只有4个数据 - 不一致。也许这个问题也在视野中。我该怎么办?非常感谢你。

3 个答案:

答案 0 :(得分:0)

您尚未正确计算偏移量。你可以试试这个:

$offset = ( $this->uri->segment(3) - 1 ) * $config['per_page']; 

$data['detail'] = $this->buku_model->getBuku($config['per_page'], $offset);

答案 1 :(得分:0)

您可能希望使用codeigniter分页库来查看此页面的正确分页 https://stackoverflow.com/a/10123424/876117

您没有获得每个请求的所有数据。您需要仅获取指定了分页库生成的链接中的偏移量的数据。

答案 2 :(得分:0)

老兄,你的控制器上有很多疑问。还有模特(科西嘉)。

首先:尝试几乎只使用控制器上的功能。您在模型上创建的函数。多数民众赞成是正确的MVC方式。

关于你的分页问题:

尝试使用和滥用GET变量。好的,你可以通过这样的网址: http://site.com/controller/function?p=2

请参阅? “?p = 2时”?这样我就可以对我的控制器说我想在列表中看到第二页。你知道,我可以传递更多的GET变量,例如: http://site.com/controller/function?p=2&cat=romance&year=2010

以及你将如何处理这些变量:

让我们来看第二个例子(“?p = 2&amp; cat = romance&amp; year = 2010”)

$page = $this->input->get('p'); // this is more secure too. avoid use $_GET or $_POST
$category = $this->input->get('cat');
$year = $this->input->get('year');

现在,您可以使用一些函数来获取与值匹配的书籍列表:

$data['books'] = $this->book->get_by_search($page, $category, $year);

PS:在这个例子中,你加载了一个模型'book'that,它包含一个名为'get_by_search'的函数。你必须这样做才能使代码正常工作。

提示:我们永远不知道搜索可以获得多少变量。因此,您可以创建一些接收这些可能变量的模型函数。看: // model Book

public function get_by_search($page = NULL, $cat = NULL, $year = NULL, $author = NULL)
{
    $perpage = 10;
    // the NULL is to prevent an error if the function is called without them.
    if ( ! is_numeric($page) || $page < 0)
    {
        $qtd    = $perpage;
        $offset = 0;
    }
    else
    {
        $qtd    = $page * perpage;
        $offset = $perpage;
    }
    $this->db->where('category', $cat);
    $this->db->where('year', $year);
    return $this->db->get('books', $perpage, $offset);
    // if you want to debug your queries, do the same above, but with no return
    // and then use this:
    echo this->db->last_query(); die; // stop here and see the query string.
}    
好吧,我希望它可以帮助你。还有更多要告诉你,但我认为你告诉我更多关于你的代码进展的更好。这个答案只是解决方案的一部分。看到?多数民众赞成不是那么简单,但我知道如何。如果您需要更多帮助,请告诉我,好吗?

嗯abraço!