PHPでのページング処理のサンプル。

手軽にページング処理するサンプル~。

リンク生成の部分とかは思いっきりハードコーディングしているし、ページ数が多い場合の省略処理とかもしていないけれど。

適当なページングクラス
class TekitouPager {

    private $base_uri = null; //ベースとなるURL
    private $page = null; //現在のページ番号
    private $per_page = null; //1ページに表示する件数
    private $max_row = null; //全データ件数
    private $max_page = null; //最大ページ数
    private $offset = null; //オフセット

    /*
     * 引数(全て必須)
     * $base_uri ベースとなるURL
     * $page ページ番号(数値)
     * $max_row 全データ件数(数値)
     * $per_page 1ページに表示する件数(数値)
     */

    function __construct($base_uri, $page, $max_row, $per_page) {
        $this->base_uri = $base_uri;
        $this->max_row = $max_row;
        $this->per_page = $per_page;
        $this->max_page = ($max_row == 0) ? 1 : ceil($max_row / $per_page); //最大ページ数を求める
        $this->page = ($page <= 0 or $this->max_page < $page ) ? 1 : $page; //$page の値が正しくない場合は1を与える
        $this->offset = ($this->page - 1) * $this->per_page; //オフセットを求める
    }

    //DBなどからデータを取得する場合のオフセット値を返す
    function getOffset() {
        return $this->offset;
    }

    //全データを配列として持っている場合に配列を渡す事で1ページ分の配列を返す
    function getPageData($data) {
        return array_slice($data, $this->offset, $this->per_page);
    }

    //現在のページ番号を返す
    function getPage() {
        return $this->page;
    }

    //最大ページ数を返す
    function getMaxPage() {
        return $this->max_page;
    }

    //前のページが存在する場合に前のページのリンクを返す
    function getPreviousNavi() {
        return (1 < $this->page) ? sprintf('<a href="%s%d">«</a>', $this->base_uri, $this->page - 1) : '';
    }

    //次のページが存在する場合に次のページのリンクを返す
    function getNextNavi() {
        return ($this->page < $this->max_page) ? sprintf('<a href="%s%d">»</a>', $this->base_uri, $this->page + 1) : '';
    }

    //ナビゲーションリンクを返す
    function getPageNavi() {
        $navi_link = '';
        for ($i = 1; $i <= $this->max_page; $i++) {
            if ($i != $this->page) {
                $navi_link .= sprintf('<a href="%s%d">%d</a>', $this->base_uri, $i, $i);
            } else {
                $navi_link .= sprintf('<b><a href="%s%d">%d</a></b>', $this->base_uri, $i, $i);
            }
        }
        return $navi_link;
    }

}


使い方

配列で全てのデータを持ってる場合

$page = isset($_GET['page']) ? intval($_GET['page']) : null; //ページ番号をGETで取得
//テスト用のデータ配列$all_data生成
$all_data = array();
for ($i = 1; $i <= 50; array_push($all_data, 'データ' . $i), $i++);
$base_url = 'http://example.com/index.php?page='; //ベースとなるURL
$max_row = count($all_data); //最大行数
$per_page = 10; // 1ページに表示する件数
$pager = new TekitouPager($base_url, $page, $max_row, $per_page); //値を渡す

/*
 * サンプル出力 
 */
echo '<pre>';
print_r($pager->getPageData($all_data));
echo '</pre>';
echo $pager->getPreviousNavi() . $pager->getPageNavi() . $pager->getNextNavi();
echo '<br>' . $pager->getMaxPage() . 'ページ中' . $pager->getPage() . 'ページ目を表示しています。';

結果は以下。

tekitoupager

データベースからデータを取得する場合

結果となる全データをSQLでカウントして渡す事で、SELECTのLIMITに表示行数と、getOffsetで取得可能なオフセット値を与えてやれば1ページ分のデータを取得出来る。
あとはナビゲーションを呼び出せばおっけー。

2011年06月27日  タグ:, ,

Leave a Reply