【PHP】ページネーションでページ切り替えのリンクを実装する方法

【PHP】ページネーションでページ切り替えのリンクを実装する方法php

PHPのページネーション実装で、ページ切り替えのリンクを作成する方法を記しています。

ページネーションでページが切り替わるGIF

 補足
【PHP】URLパラメーターをチェックする方法を読んでおくとさらに理解が深まります!

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); ?>

 補足 $pageには今表示されているページ数が入ります。

 

後述のコードで確認できますが、$pageの値が省略されたり数字以外の値が入力されると、1を返す仕様となっています。

参考:PHPでURLパラメーターをチェックする方法

 

手順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以上のときだけページ表示できるようになりました。

ページ取得の値が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 “という変数に取得したデータ件数を格納します。

  1. COUNT(*)でデータ件数を取得
  2. 変数cntに取得したデータ件数を格納
  3. データ件数を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) の算出値表示ページ数 (少数切り上げ)
11 / 10 = 0.11ページ
55 / 10 = 0.51ページ
1010 / 10 = 11ページ
1111 / 10 = 1.12ページ
 

手順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; ?>

以上を設定することで、「次ページ目へ」が永遠表示されなくなります。

OYAKUN
OYAKUN
やっとかんせい…!

次ページ目へがずっと表示されないか動作検証

phpMyAdminにある「部品登録」のテーブルには22個のデータが登録してあります。

 

なので「4ページ目へ」が表示されていないか、動作検証してみました。

 

1ページ目にアクセス

以下を開いて1ページ目を表示してみます。

http://localhost:8888/Pagination/index.php?page=1

2ページ目へのみが表示されている

「0ページ目へ」という表示はなく、「2ページ目へ」のみが表示されていますね。

2ページ目にアクセス

以下を開いて2ページ目を表示してみます。

http://localhost:8888/Pagination/index.php?page=2

1ページ目と3ページ目が表示されている

1ページ目へ | 3ページ目へ」という表示が確認できます。

3ページ目にアクセス

以下を開いて3ページ目を表示してみます。

http://localhost:8888/Pagination/index.php?page=3

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のページネーション実装にて、ページ切り替えのテキストリンクを実装する方法を記しました。

 

ちょうざっくり説明すると、

  1. href属性でリンクを作って
  2. $pageでURLパラメーターを取得して
  3. 前・次ページ目へのテキストリンクを作成

といった手順で、PHPのページネーションを実装することが可能です。

OYAKUN
OYAKUN

次回は、データがないページの次ページへの表示を無くす方法を紹介します!

>【PHP】URLパラメーターをチェックする方法

>【PHP】データを10件ずつ表示するのにLIMIT句でやってみた

>PHPでrequireの使い方。他ファイルのプログラムを呼び出す方法

コメント

タイトルとURLをコピーしました