php 分页总结

1 篇文章 0 订阅

每天用php做的最多的事差不多就是从db里取数据,展示数据了,有时以网页的形式(分页)展示,有时以csv格式导出数据。今天就对分页去数据做个总结。

根Model

class RModel {

    /**
     * @param $page  array 分页对象
     * @param $order string order by 排序
     */
    public function pagination($sql, $page, $order = null, $param = array()) {
        $countSql = "select count(*) from ({$sql}) c";
        $count = $this->createCommand($countSql)->queryCount($param);
        
        if(!empty($order))
            $sql .= ' order by ' . $order;
        
        if($page) {
            $start   = ($page['currentpage'] - 1) * $page['rownum'];
            $pagesize = $page['rownum'];
            $sql .= " limit {$start},{$pagesize} ";
        }
        $data = $this->createCommand($sql)->queryAll(true, $param);
        return array('list' => $data, 'total' => $count);
    }

    /**
    * 查询所有数据
    */
    public function listAll($sql, $order=null, $param=array()) {
        if(!empty($order))
            $sql .= (' order by ' . $order);
        return $this->createCommand($sql)->query($param);
    }
}
具体业务model

class ConcreteModel extends RModel {
    
    protected function _getQuerySql($param) {
        $sql = "";
        $bindParams = array();

        /*
        * 拼接sql
        */

        return array($sql, $bindParams);
    }

    public function listData($param, $page) {
        list($sql, $bindParams) = $this->_getQuerySql($param);

        return $this->pagination($sql, $page, 'id desec', $bindParams);
    }

    public function exportData($param) {
        list($sql, $bindParams) = $this->_getQuerySql($param);

        return $this->listAll($sql, 'id desec', $param);
    }
}

controller

class ConcreteController {
    public function actionConcrete() {
        $request = new Request();
        $model = new ConcreteModel();
        if($request->getParam('actionType') == 'export') {
            $dataReader = $model->exportData($request);
            $this->exportData($dataReader);
            exit;
        } 
        $page = Pagination::filterPageInfo($request);
        $data = $model->listData($request, $page);
        $this->render('test.html',$data);
    }

    /*
    * 以csv格式导出数据
    */
    private function exportData($dataReader) {
        
    }
}
在加一个分页小工具

class Pagination {

    public static function filterPageInfo($request, $defaultPagesize = 10) {;
        $pagenum    = intval($request->getParam('pageno', 1));
        $pagesize   = intval($request->getParam('pagesize', $defaultPagesize));

        $pagenum = $pagenum > 0 ? $pagenum : 1;
        $pagesize = $pagesize > 0 ? $pagesize : $defaultPagesize;

        return array('currentpage' => $pagenum, 'rownum' => $pagesize);
    }
}

这样,我们每次要做就是就根据查询参数,拼写sql,对取出的数据做单独的格式化展示就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值