【问题标题】:Paginating query results with Codeigniter使用 Codeigniter 对查询结果进行分页
【发布时间】:2012-12-21 12:31:59
【问题描述】:

我是 Codeigniter 和 PHP 的新手,所以请耐心等待。

我正在尝试使用 codeigniter 分页类对查询返回的结果进行分页。下面的代码适用于不需要传递任何参数的静态查询。但是,当尝试将变量作为 URL 中的参数传递时,它似乎崩溃了,例如

localhost/index.php/termsbyletter/index/a  

其中“a”是传递给控制器​​/模型的 $letter 变量。

PHP 没有输出任何错误,并且查询按预期执行,模型中的 record_count 函数也是如此。结果是所有的查询结果都显示出来了,但是都在同一个页面上,点击分页链接时保持不变。

另外,在模型中,有没有比运行两次查询更有效的返回行数的方法?我在这里读到这是必要的,我没有成功尝试以任何其他方式传递这个值。

这是我的控制器:

 <?php

class Termsbyletter extends CI_Controller
{
    public function __construct() {
        parent:: __construct();
        $this->load->helper("url");
        $this->load->model("terms_by_letter");
        $this->load->library("pagination");
    }

    public function index($letter) {

        $config = array();
        $config["base_url"] = base_url() . 'index.php/termsbyletter/index/' . $letter;
        $config["total_rows"] = $this->terms_by_letter->record_count($letter);
        $config["per_page"] = 3;
        $config["uri_segment"] = 5;

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

        $page = ($this->uri->segment(5)) ? $this->uri->segment(5) : 0;
        $data["results"] = $this->terms_by_letter->term($config["per_page"], $page, $letter);
        echo $this->pagination->create_links();

        $this->load->view("/templates/header"); 
        $this->load->view("/terms/index", $data);  
        $this->load->view("/templates/footer"); 
       }
}

和模型:

class Terms_by_letter extends CI_Model
 {
    public function __construct() {
        parent::__construct();
            $this->load->database();
          }

    public function record_count($letter) {

          $query = $this->db->query("SELECT * FROM news WHERE LEFT(slug, 1) = '$letter'");
             return $query->num_rows();      
          }

    public function term($limit, $start, $letter) {

          $this->db->limit($limit, $start);
          $query = $this->db->query("SELECT * FROM news WHERE LEFT(slug, 1) = '$letter'");


              if ($query->num_rows() > 0) {
              foreach ($query->result() as $row) {
                 $data[] = $row;

            }
            return $data;
        }
        return false;


    }
 }

我正在使用类似的东西在视图中输出结果:

 <?php
foreach($results as $data) {
    echo $data->slug "<br>";
}
?>
   <p><?php echo $links; ?></p>

【问题讨论】:

    标签: php mysql codeigniter pagination


    【解决方案1】:

    您正在尝试将活动记录与普通 CI 查询混合使用,但这是行不通的。将查询更改为:

    $query = $this->db->query("SELECT * FROM news WHERE LEFT(slug, 1) = '$letter' LIMIT $start, $limit");
    

    要么这样做,要么完全使用活动记录路线:

    $this->db->limit($limit, $start);
    $this->db->where('LEFT(slug,1)',$letter);
    $this->db->get('news');
    

    据我所知,没有办法通过单个查询返回您需要的所有结果,控制器需要总记录来计算分页,然后它只需要选择一页的记录。

    但是,您可以只编写一次查询并稍微更改参数。

    public function term($limit, $start, $letter) {
    if($limit > 0)
    {
        $this->db->limit($limit, $start);
    }
    $this->db->where('LEFT(slug,1)',$letter);
    $this->db->get('news');
    

    然后在你的控制器中你会得到这样的计数:

    $config["total_rows"] = $this->terms_by_letter->term(0,0,$letter);
    

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2019-12-23
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多