Notice: Undefined variable: mojiretu in /home/member/sitemix_55218/site/pageing.php on line 74
Notice: Undefined variable: genzai_page in /home/member/sitemix_55218/site/pageing.php on line 90
Notice: Undefined index: hyouji in /home/member/sitemix_55218/site/pageing.php on line 94
Notice: Undefined index: hyouji in /home/member/sitemix_55218/site/pageing.php on line 99
Notice: Undefined index: page in /home/member/sitemix_55218/site/pageing.php on line 107
現在のページは「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タイプに分かれます
どちらのタイプでも、データ作成と表示部分のプログラム部分は共通です。
「<< 前のページへ」、「次のページへ >>」の処理は非常に簡単です。
最初のページなら、「<< 前のページへ」を表示しない
最後のページなら、「次のページへ >>」を表示しないという処理を書くだけです
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>';
}
たった これだけです
リンク部分のソースは、ちょっとややこしいように見えますが
実はそんなに難しい事はしてません。
「表示が崩れるから・・・」とか、「何ページ目ならこういう処理」だとか
「最後のページより-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初心者の方には、少し難しく感じるかもしれませんが
実はそれほど難しい処理ではありません。
個人的には、カレンダー作成の方が難しい様に感じました
実際にページング処理が必要な場合は
大体データベースからデータを引き出すのでもうちょっとソースが短くなるのではないかと思います
表示する件数を変える 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>