はじめに#
PHPを使ったページネーションの実装方法について勉強しましたので、備忘録として残していきます。
ページを遷移させるだけですが、素のPHPで書こうと思うと結構ロジックを考えなければなりません。なるべく丁寧にまとめていきますのでよろしくお願いします。
ページネーションとは#
ページネーションとは、ECサイトの商品件数や掲示板のコメントなど件数が多い場合に、一気に表示させるのではなく、ページ遷移を行うことで数件〜数十件ずつ取得していく手法のことです。普段何気無く使っている機能ですが、実装しようとすると結構ロジックを考えなければなりません。
何か機能を作る場合は、まず言語化することが大切です。今回の場合は下記のように言語化できるでしょう。ECサイトの商品件数を例としてあげていきます。
①商品件数を1〜10件だけ取得する。
②GET通信でページ数の値を与える
③リンクを作成する
④リンク先の値をチェック
このような順序で進めていきます。
それでは実際にやっていきましょう。
商品件数を1〜10件だけ取得する##
データベースから商品情報を取ってくる際は、SQLを使います。その際に、LIMIT句を使います。LIMIT 0,10とすることで商品情報の1〜10件目を取得することができます。10,10とすれば次の10件、20,10とすればさらにその次の10件が取得できます。なんだか出来そうな気がしてきましたね。ちなみに書き方は下記のようになります。
SELECT * FROM items LIMIT 0,10;
注意点は、1件目から取得するのに1,10とするのではなく、0,10とすることです。コンピュータの世界は0から数えるのが基本ですので間違えないようにしましょう。
GET通信でページ数の値を与える##
それでは次に、LIMIT句の開始点を動的に変化させていきます。そのためにはプレースホルダーを使っていきます。LIMIT ?,10として、?の部分に開始点を入れることで変化させていきます。この部分には、URLパラメータを使っていきます。GET通信の際に、URLの後ろに〜?page=1とすることで、スーパーグローバル変数$_GET['page']に1という値が入ります。この調子で2,3,4と作っていきたいところですが、先ほど説明の通りLIMIT句の開始点には0,10,20という数字を入れていきたいです。次のように書いてみましょう。
$page = $_GET['page'];
$page = ($page - 1)*10
こうすることで、$pageにはページが進むごとに0,10,20という数字が入っていきます。あとはこれをLIMIT句に当てはめていくだけですね。
リンクを作成する##
さて、ここまでくればあとはリンクを貼っていくだけです。
HTMLのaタグを使用しましょう。1ページ目にはpage=1、2ページ目にはpage=2・・・あれ、どこまでリンクを作れば良いのでしょうか・・・?もう少し考える必要がありますね。ここでは繰り返し構文を使うのが便利です。(繰り返し構文の具体的な書き方はこちら)
しかし、繰り返し構文を使うには、何回繰り返せば良いのかという情報を取得する必要があります。今回の場合は、ページの上限数を取得してくる必要があります。まずはSELECT文で全ての件数を取得します。SELECT COUNT(*)とすることで、件数を取得することができます。
try {
$dbh = new PDO($dsn, $username, $password);
$sql = 'SELECT COUNT(*) as cnt from items';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$rows = $stmt->fetch();
} catch (PDOException $e) {
echo '接続できませんでした。理由:'.$e->getMessage();
}
そうして取得した件数を1ページに表示させたい件数で割ります。今回は10件表示させたいので10で割ります。こうすると、例えば全件数が20件の場合は2ページ、30件の場合は3ページといった具合にページ数が割り出せます。それでは、35件の場合はどうでしょうか。あれ、割り切れないですね。そんな時に便利な関数がceil関数です。小数点以下を繰り上げることができますので、35件の場合は4となります。
$count = ceil($rows['cnt']/10);
このようにして全ページ数を取得できれば、あとはその数だけ繰り返しをするだけです。
リンク先の値をチェック#
ここまでくれば一応ページネーション機能自体は完成です。しかしまだ問題が残っています。今回はURLパラメータを使ってページ遷移をしているので、URLに直接値を入力することができます。例えばページ上限の値より大きい値を入れられてしまった場合や、マイナスの数字を入れられてしまった場合は画面が真っ白になってしまいます。これを回避するために、値のチェックを入れることにします。
if($page < 1){
$page=1;
}elseif($page > $count){
$page=$count;
}
このようにすることで、ページ数が1より少ない時は$pageに1を、最大ページ数より多い時は$countを代入してエラーを防ぎます。
まとめ#
今回はページネーションの実装方法についてまとめていきました。結構大変だと思いますが、一つずつ丁寧に読み解いていくと問題なく実装できると思いますので挫けずに頑張りましょう。