PHP $_GETを使用したページング(ページネーション)の作り方

  • このエントリーをはてなブックマークに追加

以前「フォームやURLのパラメータから値を取得する$_GETの使い方」の記事で簡単なページングの例を作成しましたが、この記事ではもう少し実用的なページング(ページネーション)を紹介したいと思います。良いものができたら随時追加していく予定です。

前回のおさらい

前回は下記のような一番シンプルなページングを作成しました。

<?php
 
$totalPage = 10;
if (
  isset($_GET["page"]) &&
  $_GET["page"] > 0 &&
  $_GET["page"] <= $totalPage
) {
  $page = (int)$_GET["page"];
} else {
  $page = 1;
}
 
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプル</title>
</head>
<body>
  <p>現在 <?php echo $page; ?> ページ目です。</p>
 
  <p>
    <?php if ($page > 1) : ?>
      <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a>
    <?php endif; ?>
    <?php if ($page < $totalPage) : ?>
      <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a>
    <?php endif; ?>
  </p>
 
</body>
</html>

» 実行結果

解説

$totalPage = 10;

3行目でトータルのページ数を指定しています。

if (
  isset($_GET["page"]) &&
  $_GET["page"] > 0 &&
  $_GET["page"] <= $totalPage
) {
  $page = (int)$_GET["page"];
} else {
  $page = 1;
}

4~12行目では、「URLのパラメータにpageが存在しない場合」「pageが0以下」「pageがトータルページを超えている場合」に1ページ目を表示するように処理しています。9行目では悪意のある値を受け付けないように数値にキャスト(変換)しています。

  <p>現在 <?php echo $page; ?> ページ目です。</p>

22行目では現在のページを表示しています。

    <?php if ($page > 1) : ?>
      <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a>
    <?php endif; ?>

25〜27行目では、現在のページが2ページ目以降であれば1ページ戻るリンクを表示するようにしています。

    <?php if ($page < $totalPage) : ?>
      <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a>
    <?php endif; ?>

28〜30行目では、現在のページがトータルページより小さければ1ページ進むリンクを表示するようにしています。

前後に指定したページ数を表示する

前後に指定したページ数を表示する方法です。

<?php
 
$totalPage = 20;
$range = 3;
if (
  isset($_GET["page"]) &&
  $_GET["page"] > 0 &&
  $_GET["page"] <= $totalPage
) {
  $page = (int)$_GET["page"];
} else {
  $page = 1;
}
 
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプル</title>
</head>
<body>
  <p>現在 <?php echo $page; ?> ページ目です。</p>

  <p>
    <?php if ($page > 1) : ?>
      <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a>
    <?php endif; ?>

    <?php for ($i = $range; $i > 0; $i--) : ?>
      <?php if ($page - $i < 1) continue; ?>
      <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a>
    <?php endfor; ?>

    <span><?php echo $page; ?></span>

    <?php for ($i = 1; $i <= $range; $i++) : ?>
      <?php if ($page + $i > $totalPage) break; ?>
      <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a>
    <?php endfor; ?>

    <?php if ($page < $totalPage) : ?>
      <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a>
    <?php endif; ?>
  </p>

</body>
</html>

» 実行結果

解説

$totalPage = 10;
$range = 3;

3行目でトータルのページ数を指定、4行目で前後に表示するページ数を指定しています。

if (
  isset($_GET["page"]) &&
  $_GET["page"] > 0 &&
  $_GET["page"] <= $totalPage
) {
  $page = (int)$_GET["page"];
} else {
  $page = 1;
}

5~13行目では、「URLのパラメータにpageが存在しない場合」「pageが0以下」「pageがトータルページを超えている場合」に1ページ目を表示するように処理しています。10行目では悪意のある値を受け付けないように数値にキャスト(変換)しています。

  <p>現在 <?php echo $page; ?> ページ目です。</p>

23行目では現在のページを表示しています。

    <?php if ($page > 1) : ?>
      <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a>
    <?php endif; ?>

26〜28行目では、現在のページが2ページ目以降であれば1ページ戻るリンクを表示するようにしています。

    <?php for ($i = $range; $i > 0; $i--) : ?>
      <?php if ($page - $i < 1) continue; ?>
      <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a>
    <?php endfor; ?>

30〜33行目では、$iに$rangeを代入し、$iを1ずつマイナスしながら0になるまでforで繰り返しを行います。
現在のページから$iを引いた数値が0以下になる場合、そのページは存在しないためcontinueでスキップします。1以上の場合はそのページへのリンクを表示します。

    <span><?php echo $page; ?></span>

35行目では、現在のページを表示しています。

    <?php for ($i = 1; $i <= $range; $i++) : ?>
      <?php if ($page + $i > $totalPage) break; ?>
      <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a>
    <?php endfor; ?>

37〜40行目では、$iに1を代入し、$iを1ずつプラスしながら$rangeになるまでforで繰り返しを行います。
現在のページに$iを足した数値がトータルページを超える場合、そのページは存在しないためbreakでループを終了します。超えない場合はそのページへのリンクを表示します。

    <?php if ($page < $totalPage) : ?>
      <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a>
    <?php endif; ?>

42〜44行目では、現在のページがトータルページより小さければ1ページ進むリンクを表示するようにしています。

前後に指定したページ数を表示する(その2)

上記と同じく前後に指定したページ数を表示する方法ですが、前に表示するページ数がなければその分を後ろに(後ろに表示するページ数がなければその分前に)表示する方法です。表示される件数が常に同じになります。

<?php

$totalPage = 20;
$range = 3;
if (
  isset($_GET["page"]) &&
  $_GET["page"] > 0 &&
  $_GET["page"] <= $totalPage
) {
  $page = (int)$_GET["page"];
} else {
  $page = 1;
}

$prevDiff = 0;
if ($page - $range < 1) {
  $prevDiff = $range - $page + 1;
}

$nextDiff = 0;
if ($page + $range > $totalPage) {
  $nextDiff = $page + $range - $totalPage;
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプル</title>
  <meta name="robots" content="noindex, nofollow" />
</head>
<body>
  <p>現在 <?php echo $page; ?> ページ目です。</p>

  <p>
    <?php if ($page > 1) : ?>
      <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a>
    <?php endif; ?>

    <?php for ($i = $range + $nextDiff; $i > 0; $i--) : ?>
      <?php if ($page - $i < 1) continue; ?>
       <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a>
    <?php endfor; ?>

     <span><?php echo $page; ?></span>

    <?php for ($i = 1; $i <= $range + $prevDiff; $i++) : ?>
      <?php if ($page + $i > $totalPage) break; ?>
       <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a>
    <?php endfor; ?>

    <?php if ($page < $totalPage) : ?>
     <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a>
    <?php endif; ?>
  </p>

</body>
</html>

» 実行結果

解説

$totalPage = 20;
$range = 3;

3行目でトータルのページ数を指定、4行目で前後に表示するページ数を指定しています。

if (
  isset($_GET["page"]) &&
  $_GET["page"] > 0 &&
  $_GET["page"] <= $totalPage
) {
  $page = (int)$_GET["page"];
} else {
  $page = 1;
}

5~13行目では、「URLのパラメータにpageが存在しない場合」「pageが0以下」「pageがトータルページを超えている場合」に1ページ目を表示するように処理しています。10行目では悪意のある値を受け付けないように数値にキャスト(変換)しています。

$prevDiff = 0;
if ($page - $range < 1) {
  $prevDiff = $range - $page + 1;
}

$nextDiff = 0;
if ($page + $range > $totalPage) {
  $nextDiff = $page + $range - $totalPage;
}

15〜23行目では、前に表示するページ数がない場合に後ろに持っていくための差分と、後ろに表示するページ数がない場合に前に持っていくための差分を変数($prevDiffと$nextDiff)に代入しています。

  <p>現在 <?php echo $page; ?> ページ目です。</p>

34行目では現在のページを表示しています。

    <?php if ($page > 1) : ?>
      <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a>
    <?php endif; ?>

37〜39行目では、現在のページが2ページ目以降であれば1ページ戻るリンクを表示するようにしています。

    <?php for ($i = $range + $nextDiff; $i > 0; $i--) : ?>
      <?php if ($page - $i < 1) continue; ?>
       <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a>
    <?php endfor; ?>

41〜44行目では、$iに$rangeと$nextDiffを代入して$iを1ずつマイナスしながら0になるまでforで繰り返しを行います。
現在のページから$iを引いた数値が0以下になる場合、そのページは存在しないためcontinueでスキップします。1以上の場合はそのページへのリンクを表示します。

     <span><?php echo $page; ?></span>

46行目では、現在のページを表示しています。

    <?php for ($i = 1; $i <= $range + $prevDiff; $i++) : ?>
      <?php if ($page + $i > $totalPage) break; ?>
       <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a>
    <?php endfor; ?>

48〜51行目では、$iに1を代入し、$iを1ずつプラスしながら$range+$prevDiffになるまでforで繰り返しを行います。
現在のページに$iを足した数値がトータルページを超える場合、そのページは存在しないためbreakでループを終了します。超えない場合はそのページへのリンクを表示します。

    <?php if ($page < $totalPage) : ?>
     <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a>
    <?php endif; ?>

53〜55行目では、現在のページがトータルページより小さければ1ページ進むリンクを表示するようにしています。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*

Translate »