ページめくり機能
データベース機能を作ると欠かせないのが、ページめくり機能。膨大なデータのすべてを1ページで表現しようとすると、どうしてもムリが生じます。そんなときに、データを少しずつ表示させるのが、このページめくりです。
ページめくり機能の基本
SQL文でLIMITを用いることで、「第x番目」から「y件」取り出します、という宣言をします。このとき「第x番目」を変数にし、その変数値をリンクの際に受け渡しすることで、1ページに表示するデータを制御します。
とりあえずはデータベースを開き、「第x番目」の変数として$pを宣言しましょう。
とりあえずはデータベースを開き、「第x番目」の変数として$pを宣言しましょう。
<!--データベースOPEN-->
<?php
$db = sqlite_open("db");
?>
<!--変数宣言(「第x番目」=「$p」-->
<?php
$p = (isset($_GET['p']) ? $_GET['p'] :"0");
?>
<?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件へ」というリンクを作るときなどに役立ちます。
また同時に全件検索をしておき、その件数を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); ?> 件目
<?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); ?> 件
<?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)
}
?>
<?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のあとに「&」を使って次の変数を入力しましょう。
次にリンクを貼り付けます。リンクは「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
}
?>
<?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
}
?>
