PHPのページネーション実装で、ページ切り替えのリンクを作成する方法を記しています。
PHPのページネーションで切り替えのテキストリンクを作る手順
PHPのページネーションで、ページの切り替えリンクを作成するにはhref属性を利用します。
まずは次のページへ遷移させるためのテキストリンクを作ります。
コードのサンプルとして、以下をコード※挿入します。
<a href="index.php?page=<?php print($page+1); ?>"><?php print($page+1); ?>ページ目へ</a>
※後述のindex.phpファイルの中の「</article>」前に挿入しました。
PHPの切り替えリンク作成手順
ページ切り替えのリンクを作成する、コードの内容について解説します。
手順1. ページ切り替え先のリンクを作成
href属性にて...の値(今回はURLパラメーターを指定)をテキストをリンクに設定します。
<a href="...">テキスト</a>
手順2. 遷移先のURLパラメーターを指定
index.php?pageに、print構文で遷移先のURLパラメーター($page+1)を指定しています。
index.php?page=<!?php print($page+1); ?>
手順3. 次ページ目へのテキストリンクを作成
手順2. で取得した値を利用して、次ページへのリンクを表示するために以下コードを作成します。
<?php print($page+1); ?>ページ目へ</a>
ここまで作成すれば
http://localhost:8888/Pagination/?page=1
にてページを開いたときに、「次ページへのリンク」を表示することができます。
前ページへの切り替えリンクを作る
次に、「前ページへ」の切り替えリンクを作成するために以下コードを、先のコード上に挿入します。
<a href="index.php?page=<?php print($page-1); ?>"><?php print($page-1); ?>ページ目へ</a>
前ページへ切り替えるコードの作成手順
「次ページへ」のテキストリンクは作成できたので、「前ページへ」のテキストリンクを表示させるためのコードを作成します。(href属性の説明は割愛!)
手順1. 1つ前のURLパラメーターを指定
index.php?pageに、print構文で※ URLパラメーター($page-1)を指定します。
index.php?page=<?php print($page-1); ?>
※ 現在表示されているページの「-1ページ」を指定します。
手順2. 前ページ目へのリンクを作成
手順1. で取得した値を利用して、前ページへのテキストリンクを表示します。
<?php print($page-1); ?>ページ目へ</a>
これで「前ページへ」のテキストリンクも表示することができました。
「 | 」を入力して、" 前ページ目へ | 次ページ目へ " といった表示にしています。
マイナスページ目への表示を修正する
ただし、上記のままでは1ページ目より前のページを開くと「マイナスページ目へ」の表示が出てしまうんですよね...
対策としてif文を使って、0ページのときはデータ出力しない設定にしてあげます。
<?php print($page-1); ?>ページ目へ</a>
if文でマイナスページ目の表示を修正する
「マイナスページ目へ」の表示をしないための、if文のコード内容を解説します。
$pageが2以上のときだけページ表示する
以下if文では、「$pageが2以上のときだけ表示させるコード」としています。
<?php if($page >= 2): ?>
<a href="index.php?page=<?php print($page-1); ?>"><?php print($page-1); ?>ページ目へ</a>
<?php endif; ?>
これで$pageが数値が2以上のときだけページ表示できるようになりました。
全データを取得して次ページ目への表示に制限をかける
ただ、ここまでの設定では「次ページ目へ」が永遠と表示されてしまいます。
なので登録されたデータの総数を元に、ページネーションの表示に制限をかけてあげる必要があるんですよね。
手順1. データの総数を取得する
まずはデータの総数を取得する必要があります。
現状ではindex.phpファイルの「prepare」メソッドにて、データベースphpMyAdminのテーブル" 部品登録 "に接続しています。
$entry = $db->prepare('SELECT * FROM 部品登録 ORDER BY 部品名 DESC LIMIT ?,10');
$entry->bindParam(1,$start,PDO::PARAM_INT);
$entry->execute();
しかし、データ取得数をLIMIT句で10件ずつに制限しているため、全てのデータベースの値を取得することができてません。
そこでページネーションの実装箇所に、全データを取得するSQLを作成・挿入します。
データ件数を取得するコード
SELECT COUNT(*)でテーブル部品登録のデータ件数を取得して、as cntで" cnt "という変数に取得したデータ件数を格納します。
- COUNT(*)でデータ件数を取得
- 変数cntに取得したデータ件数を格納
- データ件数をfetchして変数countへ格納
具体的には以下コードです。
<?php
$counts = $db->query('SELECT COUNT(*) as cnt FROM 部品登録');
$count = $counts->fetch();//1件のデータだけなので直接fetch
?>
手順2. ceilでデータ件数の切り上げを行う
さらにceilを使って指定した数字の端数を切り上げを行います。
ceil
ceil — 端数の切り上げ
参照:ceil
今回は10で割った数の、少数第一位を全て切り上げる計算を実装しました。
<?php
$counts = $db->query('SELECT COUNT(*) as cnt FROM 部品登録');
$count = $counts->fetch(); //1件のデータだけなので直接fetch
$max = ceil($count['cnt'] / 10); //ceilで少数点を切り上げて次ページへ
?>
ceilを利用した少数切り上げによる、ページ表示の関係は以下の通りです↓
データ件数 | ceil(cnt / 10) の算出値 | 表示ページ数 (少数切り上げ) |
---|---|---|
1 | 1 / 10 = 0.1 | 1ページ |
5 | 5 / 10 = 0.5 | 1ページ |
10 | 10 / 10 = 1 | 1ページ |
11 | 11 / 10 = 1.1 | 2ページ |
手順3. ifで最大ページ数より小さければページ表示させる
最後にif文を使って、最大ページ数よりceilの値が小さければ「次ページ目へ」を表示させるコードを書きます。
<?php
$counts = $db->query('SELECT COUNT(*) as cnt FROM 部品登録');
$count = $counts->fetch(); //1件のデータだけなので直接fetch
$max = ceil($count['cnt'] / 10); //ceilで少数点を切り上げて次ページへ
if($page < $max): //最大ページ数より小さければ"ページ目へ"を表示する
?>
<a href="index.php?page=<?php print($page+1); ?>"><?php print($page+1); ?>ページ目へ</a>
<?php endif; ?>
以上を設定することで、「次ページ目へ」が永遠表示されなくなります。
次ページ目へがずっと表示されないか動作検証
phpMyAdminにある「部品登録」のテーブルには22個のデータが登録してあります。
なので「4ページ目へ」が表示されていないか、動作検証してみました。
1ページ目にアクセス
以下を開いて1ページ目を表示してみます。
http://localhost:8888/Pagination/index.php?page=1
「0ページ目へ」という表示はなく、「2ページ目へ」のみが表示されていますね。
2ページ目にアクセス
以下を開いて2ページ目を表示してみます。
http://localhost:8888/Pagination/index.php?page=2
「1ページ目へ | 3ページ目へ」という表示が確認できます。
3ページ目にアクセス
以下を開いて3ページ目を表示してみます。
http://localhost:8888/Pagination/index.php?page=3
「| 2ページ目へ 」のみが表示されていることが確認できました!
参考:今回利用したファイルのコードサンプル
今回ページネーションを実行した環境を記します。
環境:MAMP(Mac)
index.phpファイル(ページ切り替え編集済)
<main>
<h2>登録した部品名一覧</h2>
<?php
require('connect.php');
//URLパラメーターが省略されたら1ページ目を返す
//数字が指定されなかった場合も1ページ目を返す
if(isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {
$page = $_REQUEST['page'];
}else{
$page = 1;
}
$start = 10 * ($page -1);
// 部品登録テーブルの部品名の値を降順に取得して$entryに格納
$entry = $db->prepare('SELECT * FROM 部品登録 ORDER BY 部品名 DESC LIMIT ?,10');
$entry->bindParam(1,$start,PDO::PARAM_INT);
$entry->execute();
?>
<article>
<?php while($resister = $entry->fetch()):?>
<p><a href="request.php?id=<?php print($resister['id']); ?>"><?php print(mb_substr($resister['部品名'],0,50)); ?></a></p>
<time><?php print($resister['登録日']); ?></time>
<hr size='3' color="#a9a9a9" width="450" align="left">
<?php endwhile; ?>
<!-- 次ページへ行くリンク -->
<?php if($page >= 2): ?>
<a href="index.php?page=<?php print($page-1); ?>"><?php print($page-1); ?>ページ目へ</a>
<?php endif; ?>
|
<?php
$counts = $db->query('SELECT COUNT(*) as cnt FROM 部品登録');
$count = $counts->fetch(); //1件のデータだけなので直接fetch
$max = ceil($count['cnt'] / 10); //ceilで少数点を切り上げて次ページへ
if($page < $max): //最大ページ数より小さければ"ページ目へ"を表示する
?>
<a href="index.php?page=<?php print($page+1); ?>"><?php print($page+1); ?>ページ目へ</a>
<?php endif; ?>
</article>
</main>
connect.phpファイル
<?php
try { // データーベースtestへ接続
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf8','root','root');
} catch (PDOException $e) {
// 接続できなかったらエラー表示
echo 'DB接続エラー!:' . $e->getMessage();
}
?>
request.phpファイル
<main>
<h2>登録した部品名の詳細画面</h2>
<?php
require('connect.php');
$id=$_REQUEST['id'];
if(!is_numeric($id) || $id <= 0){
print('1以上の数字で指定してください');
exit();
}
//安全に処理するためにprepareとREQUEST変数で処理する
$data = $db->prepare('SELECT * FROM 部品登録 WHERE id=?');
$data->execute(array($_REQUEST['id']));
$hyouji = $data->fetch();
?>
<article>
<pre><?php print($hyouji['部品名']);?></pre>
<a href="index.php">一覧画面へ戻る</a>
</article>
</main>
まとめ
PHPのページネーション実装にて、ページ切り替えのテキストリンクを実装する方法を記しました。
ちょうざっくり説明すると、
- href属性でリンクを作って
- $pageでURLパラメーターを取得して
- 前・次ページ目へのテキストリンクを作成
といった手順で、PHPのページネーションを実装することが可能です。
関連記事:【PHP】URLパラメーターをチェックする方法
関連記事:【PHP】データを10件ずつ表示するのにLIMIT句でやってみた
関連記事:PHPでrequireの使い方。他ファイルのプログラムを呼び出す方法