ページングサンプル

現在のページは「1」です。

1個目から10個目のデータを表示しています

PHPでページング処理 1個目のデータ
PHPでページング処理 2個目のデータ
PHPでページング処理 3個目のデータ
PHPでページング処理 4個目のデータ
PHPでページング処理 5個目のデータ
PHPでページング処理 6個目のデータ
PHPでページング処理 7個目のデータ
PHPでページング処理 8個目のデータ
PHPでページング処理 9個目のデータ
PHPでページング処理 10個目のデータ

    [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 最後へ

表示数

PHPでページング処理して、クールなサイトを作ろう

データベースや掲示板,グーグルでよく見かけるページング(上のサンプルみたいなやつ)
膨大なデータを1ページに収めるには きびしい場合に使います

PHP初心者の方は、<<前のページへ 次のページへ>>みたいなページングからはじめると 理解が深まりよいと思います

まずは、テストなので適当なレコードを作ります

ちょっとややこしいデータの作り方をしてますけど、
テストなので適当で結構です $hairetu = array(1,2,3,4,5....);とかでOK

//適当にレコードを作る(テストだからなんでもよい)
$i=1;
while($i<=200){
	$mojiretu .= $i.' ';//数字に半角スペースをつけて繰り返して文字列を作成している
	$i++;
}
$mojiretu = trim($mojiretu);//最後についた半角スペース除去
$kakunou = explode(' ',$mojiretu);//半角スペースで区切って$kakunouに1個づつ格納した
//配列に格納したものに個目のレコードとつけるユーザー関数を作成
function kome($str){
	return 'PHPでページング処理 '.$str.'個目のデータ';
}
$hairetu = array_map("kome",$kakunou);
//↑先ほど作成したユーザー関数をarray_map()関数で配列全体に処理を施す
$cnt = count($hairetu);//レコード数をカウントしておきます
//テスト用、適当レコード作成ここまで

内容を表示する部分

次は内容を表示する部分の作成です
ここでのポイントは1つだけ、
表示する数が最終ページで半端になった場合に表示できなくなるので
ceil関数で切り上げ処理をします

//ここから表示する内容を作成
//↓はじめてこのページにやってきたら「1ページ目だよ」とやさしく教えてあげる
if($genzai_page == ""){
	$genzai_page = 1;
	$start = 0;//このスタートは配列の中の何個目から取り出すのか?
}
$hyouji_kazu = 10;//表示する数
$max_page = ceil($cnt/$hyouji_kazu);//ceilは切り上げ($max_pageは表示最大ページ数)

//↓すでにこのページにいたら・・・
if($_GET['page'] <> ""){
	$genzai_page = $_GET['page'];//$_GETでもらった数字が現在のページ
//↑サンプルコードでは $_GET['page']をエスケープ処理してませんが本番ではして下さい
	$start = ($genzai_page-1)*$hyouji_kazu;//表示スタート数(何個目から表示するか?)
}
//↓現在のページと何個のデータを表示しているのか表示する部分
$pageing_mes = '<p>現在のページは「'.$genzai_page.'」です。</p>'.
'<p>'.($start+1).'個目から'.(($start)+$hyouji_kazu).'個目のデータを表示しています</p>';

//↓これをつけないと 場合によっては 1ページ目とか最後のページで表示件数がおかしくなる
if($genzai_page == $max_page){
$pageing_mes = '<p>現在のページは「'.$genzai_page.'」です。</p>'.
'<p>'.($start+1).'個目から'.$cnt.'個目のデータを表示しています</p>';
}
//↓データがない場合の処理(本番では必要です)
if($cnt == 0){
	$pageing_mes = '現在登録されているデータはありません';
}

echo $pageing_mes;

$naiyou = array_slice($hairetu,$start,$hyouji_kazu);//表示する数と内容

//↓データ内容を表示する部分
foreach($naiyou as $val){
	echo $val.'<br />';
}
//↑内容を表示する部分終り

ここから下は、ページングの種類によって 2タイプに分かれます
どちらのタイプでも、データ作成と表示部分のプログラム部分は共通です。

ページングのリンク部分の作成 タイプ1 (前のページ、次のページバージョン)

「<< 前のページへ」、「次のページへ >>」の処理は非常に簡単です。
最初のページなら、「<< 前のページへ」を表示しない
最後のページなら、「次のページへ >>」を表示しないという処理を書くだけです

if($genzai_page != 1){
	echo '<a href="pageing.php?page='.($genzai_page-1).'"><< 前のページへ</a> ';
}
if($genzai_page != $max_page){
	echo '<a href="pageing.php?page='.($genzai_page+1).'">次のページへ >></a>';
}
たった これだけです

ページングのリンク部分の作成 タイプ2 (10個のリンクを作成するバージョン)

リンク部分のソースは、ちょっとややこしいように見えますが
実はそんなに難しい事はしてません。

「表示が崩れるから・・・」とか、「何ページ目ならこういう処理」だとか
「最後のページより-5ページ以内」ならこういう処理だとか・・・面倒な処理ですけど難しい事はしてません。

//↓表示最大数が10未満でページ表示数が1(表示数1ならページングする必要がない)でなければ・・・
if(($max_page <= 10) && ($max_page != 1)){
echo '       ';//表示があまり乱れないように全角空スペース4個を入れておく
for($i=1;$i<=$max_page;$i++){
	echo '<a href="pageing.php?page='.$i.'">['.$i.']</a> ';
	}
	
//↓最大表示数が10以上で現在のページが6未満なら・・・	
}elseif(($max_page > 10) && ($genzai_page<6)){
echo '    ';//表示があまり乱れないように全角空スペース4個を入れておく
	for($a=1;$a<=10;$a++){
		echo '<a href="pageing.php?page='.$a.'">['.$a.']</a> ';
	}
	
//↓最大表示数が10以上かつ、現在のページが6以上かつ最終ページより5ページ以内にいなければ・・・	
}elseif(($max_page > 10) && ($genzai_page>=6) && (($genzai_page+5) < $max_page)){
	echo '<a href="pageing.php?page=1">最初へ</a>';
	for($a=1;$a<=5;$a++){
	echo '<a href="pageing.php?page='.($genzai_page-5+$a).'">['.($genzai_page-5+$a).']</a> ';
	}
	for($a=1;$a<=5;$a++){
	echo '<a href="pageing.php?page='.($genzai_page+$a).'">['.($genzai_page+$a).']</a> ';
	}
echo '<a href="pageing.php?page='.$max_page.'">最後へ</a>';

//↓最大表示数が10以上かつ、現在のページも6以上かつ、
//↓現在のページが最終ページから5ページ以内にいる場合の処理
}elseif(($max_page > 10) && ($genzai_page>=6) && (($genzai_page+5) >= $max_page)){
	echo '<a href="pageing.php?page=1">最初へ</a> ';
	$b = $max_page-10;
	while($b <= $max_page){
	echo '<a href="pageing.php?page='.$b.'">['.$b.']</a> ';
	$b++;
	}
}

更にページングをわかりやすくするために 現在ページのリンク色を替える

現在見ているページをわかりやすくするために 現在ページのリンク色を変えます

スタイルシートを使うこと、そして少しだけ上のプログラムを改造するだけです

//↓表示最大数が10未満でページ表示数が1(表示数1ならページングする必要がない)でなければ・・・
if(($max_page <= 10) && ($max_page != 1)){
echo '       ';//表示があまり乱れないように全角空スペース4個を入れておく
for($i=1;$i<=$max_page;$i++){
	if($genzai_page == $i){
	echo '<a class="pageing2" href="pageing.php?page='.$i.'">['.$i.']</a> ';
	}else{
	echo '<a class="pageing" href="pageing.php?page='.$i.'">['.$i.']</a> ';
		}
	}
}elseif{
.............以下続く

上の例のように $i$genzai_page が同じならば 色を変えるという処理を順番に入れます

スタイルシート部分
<style>
a.pageing {
	text-decoration : none;
	font-weight : bold;
	color : #4970AB;
}
a.pageing2 {
	text-decoration : none;
	font-weight : bold;
	color : #FF917A;
}
</style>
PHPでのページングについて

ソースは長いように感じますけど、実はコメントが多くてそんなに長くありません!

ページング処理はPHP初心者の方には、少し難しく感じるかもしれませんが
実はそれほど難しい処理ではありません。

個人的には、カレンダー作成の方が難しい様に感じました

実際にページング処理が必要な場合は
大体データベースからデータを引き出すのでもうちょっとソースが短くなるのではないかと思います


ページング おまけ

表示する件数を変える selectメニューですが、
PHPではセレクトメニューで選んだ時点でページを変更するということができないので
JavascriptとPHPのセッションを組み合わせて実装します

セレクトメニューで選んだ時点でページを変更するJavascriptのソースを載せておきます

<!-- selectメニューでページ移動 -->
<form name="hyouji">
<select name="menu" onchange="javascript:location=document.hyouji.menu.options[document.hyouji.menu.selectedIndex].value;">
<option value="./pageing.php?hyouji=5&page=1">5件</option>
<option value="./pageing.php?hyouji=10&page=1">10件</option>
<option value="./pageing.php?hyouji=20&page=1">20件</option>
<option value="./pageing.php?hyouji=30&page=1">30件</option>
<option value="./pageing.php?hyouji=50&page=1">50件</option>
</select>
</form>

Ads by Sitemix