【初学者向け】PHPで簡単なページネーションを作成する

今日はPHPで簡単なページネーションの作ります。

webアプリのindexページでは必ずと使用するので、簡単に抑えておきましょう。

僕のPHP学習ももだんだんwebアプリ作成に近づいてきました。

こうして毎日少しずつ学習していくと、成長を実感できるので楽しいですね。

今日の記事は、

  • ページネーションの仕組みを知りたい

端的にこんな方におすすめです。

それでは、やっていきましょう。

データベースを用意しよう

> create database profile;
> use profile;
> create table profiles (id int primary key auto_increment,
                         name text,
                         profile text
);
> insert into profiles set name="yamada", profile="こんにちは";
> insert into profiles set name="tanaka", profile="こんにちは";
> insert into profiles set name="saito", profile="こんにちは";
> insert into profiles set name="suzuki", profile="こんにちは";

詳しくは、【webアプリ初学者必見】MYSQLでデータベースを作成するを参照ください。

ページネーションを作ろう

ここからが今日の本題です。

以下完成コードになります。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>
    <main>
    <?php
      if (isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {
        $page = $_REQUEST['page'];
      } else {
          $page = 1;
      };
      $start = 3 * ($page - 1);
      $db = new PDO('mysql:dbname=profile;host=localhost;charset=utf8', 'root', '');
      $profiles = $db->prepare('select * from profiles limit ?,3');
      $profiles->bindParam(1, $start, PDO::PARAM_INT);
      $profiles->execute();
    ?>
    <article>
      <?php while ($profile = $profiles->fetch()): ?>
        <p><?php print($profile['name']);?></p>
        <p><?php print($profile['profile']);?></p>
        <p>-----------------------------------</p>
      <?php endwhile ?>
    </article>
    <?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 profiles');
      $count = $counts ->fetch();
      $max_page = ceil($count['cnt'] / 3);
      if ($page < $max_page):
    ?>
    <a href="index.php?page=<?php print($page+1);?>"><?php print($page+1)?>ページ目へ</a>
    <?php endif; ?>
    </main>
  </body>
</html>

PHPとMyAQLとの連携は、【PHP初学者必須】PHPとMySQLを連携するをご参照ください。

少し複雑ですが、重要なコードは以下2つです。

<?php
      if (isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {
        $page = $_REQUEST['page'];
      } else {
          $page = 1;
      };
      $start = 3 * ($page - 1);
      $db = new PDO('mysql:dbname=profile;host=localhost;charset=utf8', 'root', '');
      $profiles = $db->prepare('select * from profiles limit ?,3');
      $profiles->bindParam(1, $start, PDO::PARAM_INT);
      $profiles->execute();
    ?>

1ページに何投稿表示するかを決めています。

今回の場合は、1ページ3投稿にしています。

    <?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 profiles');
      $count = $counts ->fetch();
      $max_page = ceil($count['cnt'] / 3);
      if ($page < $max_page):
    ?>
    <a href="index.php?page=<?php print($page+1);?>"><?php print($page+1)?>ページ目へ</a>
    <?php endif; ?>

前後のページへの遷移リンクを作成しています。

まとめ

今日は、簡単にページネーションを作ってみました。

まとめというまとめは今日はありません。

ほとんどがライブライリで簡単に実装できるものなので、もしwordpressなどで「お気に入りのページネーションがない」と思った時に軽く参考にしてください。

参考:

PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門