用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4262|回复: 5
收起左侧

[已解决] 分页后为啥没办法LIMIT?附图+原始码

[复制链接]
发表于 2013-5-11 11:54:13 | 显示全部楼层 |阅读模式
本帖最后由 Loading... 于 2013-5-11 12:50 编辑

先说明一下我的问题,我在第一个分页取得是2笔资料正确,但是为啥到了第二页就不受限制了?如下图
使用 sqlsrv 驱动 mssql

1.png


2.png

我的控制器
PHP复制代码
 
$this->load->model('coil_model');
$this->load->library('pagination');
 
$config['base_url'] = base_url('rod/index');
$config['total_rows'] = $this->coil_model->record_count();
$config['per_page'] = 2;
$config["uri_segment"] = 3;
 
$this->pagination->initialize($config);
$page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
               
$data['coil']=$this->coil_model->fetch_data($config["per_page"], $page);
$data['links'] = $this->pagination->create_links();
 
$this->load->view('rod/index',$data);
 
复制代码


模型
PHP复制代码
 
function record_count($condition=NULL){
                if($condition>0){
                        $this->db->where($condition);
                }
                $query = $this->db->get('view_COIL8MM');
                return count($query->result());
        }
 
function fetch_data($limit,$start,$condition=NULL){
            if($condition>0){
                    $this->db->where($condition);
            }
            $this->db->order_by('id','desc');
            $this->db->limit($limit, $start);
            $query = $this->db->get("view_COIL8MM");
           
            if($query->num_rows() > 0){
                    return $query->result();
            }else{
                    return NULL;
            }
    }
 
复制代码




 楼主| 发表于 2013-5-11 12:53:21 | 显示全部楼层
解决方法,修改了sqlsrv这个驱动的 function _limit,


PHP复制代码
function _limit($sql, $limit, $offset)
    {
 
        $str=strtolower(str_replace("\n",' ',$sql));
        $strtemp=substr($str,strpos(strtolower($str),'from ')+5);
        $tablename=substr($strtemp,0,stripos($strtemp,' '));
        $orderby=substr($str,strpos(strtolower($str),'order by ')+9);
 
        $sql = "
        SELECT *
          FROM
              ( SELECT *, ROW_NUMBER() OVER (ORDER BY $orderby) as NroFila
                FROM  $tablename
               ) AS PAG_TABLEXXX
          WHERE
          NroFila BETWEEN "
.($offset?$offset+1:1)." AND ".($offset+$limit)."
      "
;
        return $sql;
        }
复制代码
发表于 2013-5-11 12:55:15 | 显示全部楼层
本帖最后由 kuailewang 于 2013-5-11 13:02 编辑
Loading... 发表于 2013-5-11 12:53
解决方法,修改了sqlsrv这个驱动的 function _limit,

这个修改了ci核心,不好
还是看手册的好
$this->db->limit();

限制查询所返回的结果数量:
$this->db->limit(10);

// 生成: LIMIT 10

第二个参数设置的是结果偏移量。
$this->db->limit(10, 20);

// 生成: LIMIT 20, 10 (仅限MySQL中。其它数据库有稍微不同的语法)

第二和第三个参数允许你设置一个结果集每页纪录数(limit)和结果集的偏移(offset)
$query = $this->db->get('mytable', 10, 20);

// Produces: SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)

注意:第二参数是每页纪录数,第三个参数是偏移
//---------------------------------------------------------------------------------------------------------------------------
//当:
$config['use_page_numbers'] = TRUE;
//后,你就要考虑limit,offset了
 楼主| 发表于 2013-5-11 13:05:35 | 显示全部楼层
本帖最后由 Loading... 于 2013-5-11 13:18 编辑
kuailewang 发表于 2013-5-11 12:55
这个修改了ci核心,不好
还是看手册的好
$this->db->limit();

我现在使用的是mssql 才有这个问题,语法部分肯定没问题,因为我倒着用也是错的...
limit(2,5) 我取得7笔资料
limit(5,2) 我也是取得7笔资料,如一楼图所示,
图一 limit(2,0),
图二 limit(2,2)

之前我用mysql,同样的分页技巧,就没问题...所以跟文档没多大关系

不知道有没有其他避免修改核心代码的方式
发表于 2013-7-2 20:10:08 | 显示全部楼层
Loading... 发表于 2013-5-11 12:53
解决方法,修改了sqlsrv这个驱动的 function _limit,

支持,mssql我也这么用的。
发表于 2013-7-3 09:26:09 | 显示全部楼层
我能说我的SQL SERVER2000,不支持ROW_NUMBER()么。

正想办法弄分页呢

本版积分规则