ページめくり機能


データベース機能を作ると欠かせないのが、ページめくり機能。膨大なデータのすべてを1ページで表現しようとすると、どうしてもムリが生じます。そんなときに、データを少しずつ表示させるのが、このページめくりです。


ページめくり機能の基本


SQL文でLIMITを用いることで、「第x番目」から「y件」取り出します、という宣言をします。このとき「第x番目」を変数にし、その変数値をリンクの際に受け渡しすることで、1ページに表示するデータを制御します。
とりあえずはデータベースを開き、「第x番目」の変数として$pを宣言しましょう。

 <!--データベースOPEN-->
 <?php
 $db = sqlite_open("db");
 ?>

 <!--変数宣言(「第x番目」=「$p」-->
 <?php
 $p = (isset($_GET['p']) ? $_GET['p'] :"0");
 ?>


SQL文の構成:LIMIT検索と全件検索


LIMITでy件を・・・ここでは、{$p}の値から始まって5件を取り出します。ちなみに、SQL文で変数を用いる場合は{ }で囲みます。
また同時に全件検索をしておき、その件数をsqlite_num_rows( )で数えておきましょう。この数が、「次のy件へ」というリンクを作るときなどに役立ちます。

 <!--SQL文_5件検索-->
 <?php
 $sql = "SELECT * FROM table ORDER BY column ASC, id LIMIT {$p}, 5";
 $result = sqlite_query($db, $sql);
 $number = sqlite_num_rows($result);
 ?>

 <!--表示数:開始-->
 第 <?php echohtmlspecialchars($p + 1, ENT_QUOTES); ?> 件目

 <!--表示数:終了-->
 第 <?php echohtmlspecialchars($p + $number, ENT_QUOTES); ?> 件目

 <!--SQL文_全件検索-->
 <?php
 $sql_all = "SELECT * FROM table ORDER BY column ASC, id";
 $result_all = sqlite_query($db, $sql_all);
 $number_all = sqlite_num_rows($result_all);
 ?>

 <!--表示数:全件-->
 全 <?php echohtmlspecialchars($number_all, ENT_QUOTES); ?> 件


1ページにy件ずつ表示


for文を用いて、1ページにcolumnの列をy件ずつ表示していきます。このプログラム自体はy件表示だろうが全件表示だろうが同じであり、sqlite_num_rows( )で用いる変数$resultがLIMITをかけたものか否かだけに依存します。

 <!--5件ずつを表示-->
 <?php
 for($i=0;$i< sqlite_num_rows($result); $i++) {
 $row[$i] = sqlite_fetch_array($result, SQLITE_ASSOC);
 echo htmlspecialchars($row[$i]['table.column'], ENT_QUOTES)
 }
 ?>


ページ移動のリンク


まずは、if文を用いて「前のy件へ」「次のy件へ」を表示する必要があるかどうか、チェックさせます。「前のy件へ」ならば変数$pが0ではない、あるいは0よりも大きいことを想定させ、「次のy件へ」ならば変数$pが「全件数 - y件」より小さい、すなわちまだ件数に余りがあることを想定させます。
次にリンクを貼り付けます。リンクは「a href」を使い、「前のy件へ」「次のy件へ」のそれぞれ変数$pに、「-y」「+y」という操作をすることで成立させます。同時にほかの変数もリンクで送信する必要があれば、変数$pのあとに「&」を使って次の変数を入力しましょう。

 <!--前の5件へリンク-->
 <?php
 if ($p > 0) {
 ?>
 < a href='db.php?p=<?php echo htmlspecialchars($p - 5, ENT_QUOTES);
 ?>'>[前の5件へ]</a>
 <?php
 }
 ?>

 <!--次の5件へリンク-->
 <?php
 if ($p < $number_all - 5) {
 ?>
 < a href='db.php?p=<?php echo htmlspecialchars($p + 5, ENT_QUOTES);
 ?>'>[次の5件へ]</a>
 <?php
 }
 ?>