ページ送り(ページネーション)とは
ページ送り(ページネーション)とは、ウェブアプリケーションの一覧ページや検索結果ページで大量のデータを表示する際に、ページを分けて出力するための機能です。
よく検索結果ページの下に、「次のページへ」「前のページへ」といったリンクや、ページ番号が振られたリンクを目にすることがあるかと思います。
これがページ送り(ページネーション)と呼ばれる機能を使って実現された機能となります。
ページ送り(ページネーション)機能がないと、場合によっては何万件に及ぶデータを1ページで表示しなくてはならないため、ウェブページがタイムアウトして何も表示されないなどの弊害が発生する懸念があります。
今回は、プレーンなPHPでこのページ送り処理を実装するサンプルをご紹介したいと思います。
プログラムの目標
今回は、MySQLから抽出したデータを想定して、ページ番号と配列データを引数として渡すと、該当ページのレコードとページリンクを生成するための前後のページ数を返すだけのシンプルなページネーション関数の作成を目指します。
ページ送りをするページでデータを取得すれば、あとは返還された配列をPHP側で処理して表示すればよいだけですので、汎用性は高いのではないかと思います。
ファイル構成
今回使うプログラムは、以下ふたつのPHPファイルで構成します。
- ・test.php・・・ページ数を取得して配列を関数に渡して戻り値を表示。
- ・pagenation.php・・・ページ数と配列から該当ページのレコードを戻す関数。
ページ送り処理関数の仕様
引数
ページ送り(ページネーション)処理を行う関数には、以下3つの情報を引数として渡します。
- ・$unit・・・1ページに表示するレコード数
- ・$num・・・現在のページ数
- ・$records・・・表示対象の全レコード
戻り値
関数を実行すると、以下のデータが戻り値として返されます。この戻り値を利用して、ページ送り処理のされたページを実現します。
- ・$pagenation[‘record’]・・・現在のページに該当するレコード
- ・$pagenation[‘before’]・・・現在のページの前のページ数
- ・$pagenation[‘after’]・・・現在のページの後のページ数
- ・$pagenation[‘pagenum’]・・・現在のページ数
- ・$pagenation[‘maxpage’]・・・全ページ数
- ・$pagenation[‘maxrecord’]・・・全レコード数
pagenation.php
<?php
function pageNation($unit, $num, $records){
if(!empty($records)){
//------ 全レコード数取得 -----
$max_record = count($records);
//------ 全ページ数抽出(小数点以下切り上げ) -----
$max_page = ceil($max_record / $unit);
//------ 表示開始レコード番号抽出 -----
if($num < 2){
$start_record_num = 1; // 1ページ目は開始番号を1に設定
} else {
$start_record_num = ($unit * ($num - 1)) + 1; // 2ページ目以降は表示開始のレコード番号を計算
}
//------ 戻り値の生成 -----
$pagenation = array();
$pagenation['before'] = "";
$pagenation['after'] = "";
$pagenation['pagenum'] = $num;
$pagenation['maxpage'] = $max_page;
$pagenation['maxrecord'] = $max_record ;
$pagenation['record'] = array();
// ページリンクデータ生成
if($num > 1){
$pagenation['before'] = $num - 1;
}
if($num < $max_page){
$pagenation['after'] = $num + 1;
}
// レコードデータ生成
for($i = $start_record_num; $i < $start_record_num + $unit; $i++){
if(!empty($records[$i])){ // 配列のデータ存在チェック
$pagenation['record'][$i] = $records[$i]; // 返還する配列に追加
}
}
//------ 返還 -----
return $pagenation;
}
}
?>
test.php
こちらが実際にページ送りを組み込む際の実装イメージとなります。
<?php
// 関数格納ファイルの読み込み
require_once('./pagenation.php');
// サンプルデータ
$recordss = array(
'1' => Array('id' => 1, 'field1' => 'field1'),
'2' => Array('id' => 2, 'field1' => 'field2'),
'3' => Array('id' => 3, 'field1' => 'field3'),
'4' => Array('id' => 4, 'field1' => 'field4'),
'5' => Array('id' => 5, 'field1' => 'field5'),
'6' => Array('id' => 6, 'field1' => 'field6'),
'7' => Array('id' => 7, 'field1' => 'field7'),
'8' => Array('id' => 8, 'field1' => 'field8'),
'9' => Array('id' => 9, 'field1' => 'field9'),
'10' => Array('id' => 10, 'field1' => 'field10'),
'11' => Array('id' => 11, 'field1' => 'field11'),
'12' => Array('id' => 12, 'field1' => 'field12'),
'13' => Array('id' => 13, 'field1' => 'field13'),
'14' => Array('id' => 14, 'field1' => 'field14'),
'15' => Array('id' => 15, 'field1' => 'field15'),
'16' => Array('id' => 16, 'field1' => 'field16'),
'17' => Array('id' => 17, 'field1' => 'field17'),
'18' => Array('id' => 18, 'field1' => 'field18')
);
// 関数の実行と戻り値の取得
$result = pageNation(5, $_GET['page'], $recordss);
// 取得データの表示
print_r($result);
?>
最後に
非常にシンプルな作りですが、こちらをもとにいろいろと機能追加したページ送り機能などを作成して頂けると幸いです。