実際のところ、データベースはページネーションアルゴリズムとあまり関係がありません。どのデータベースまたはデータベース ドライバが使用されていても、またはデータベースがまったく含まれていなくても、どちらが同じになります。
考え方さえわかれば、どんなドライバーでも構いません。厳密に言えば、データベース操作は 2 つの呼び出しだけで済み、どのドライバーでも簡単に実装できます。
データベースから、データ自体とレコードの総数が必要になります。
これらを取得するために、2 つの MySQL 機能を使用します。
SQL_CALC_FOUND_ROWS
/FOUND_ROWS()
行の総数を取得する
LIMIT
選択したデータの量を制限する句、
ページへのリンクを表示するには、現在のページとページの総数を知る必要があります。
<?php
$per_page = 10;
//let's get the page number
$cur_page = 1;
if (isset($_GET['page']) && $_GET['page'] > 0)
{
$cur_page = $_GET['page'];
}
// then define starting record
$start = ($cur_page - 1) * $per_page;
//now let's get the data
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM Board LIMIT ?, ?";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $start,PDO::PARAM_INT);
$stmt->bindParam(2, $per_page,PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetchAll();
// and total number of rows
$stmt = $pdo->query("SELECT FOUND_ROWS()");
$rows = $stmt->fetchColumn();
// here we calculate number of pages.
$num_pages = ceil($rows / $per_page);
//we have to define this variable to display list of pages
$page = 0;
include 'template.tpl.php';
さて、すべてのデータの準備が整うとすぐに、ネイティブ PHP をテンプレートとして使用して、データを公開できます。
Records found: <b><?=$rows?></b><br><br>
<? foreach ($data as $row): ?>
<?=++$start?>.
<a href="?id=<?=$row['id']?>">
<?=$row['title']?>
</a>
<br>
<? endforeach ?>
<br>
Pages:
<? while ($page++ < $num_pages): ?>
<? if ($page == $cur_page): ?>
<b><?=$page?></b>
<? else: ?>
<a href="?page=<?=$page?>"><?=$page?></a>
<? endif ?>
<? endwhile ?>
ただし、表示されるページ数の削減や追加の WHERE パラメーターのサポートなどの重要な部分がないことを含め、これは最低限のことです。
PDO を使用すると少し冗長になります。そのため、より洗練されたドライバーを入手することをお勧めします。