php 分頁總結

每天用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,對取出的數據做單獨的格式化展示就行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章