この例では、PHP で使用するデータベースとして一般的な MySQL を使用します。一般的な原則は他のデータベースにも当てはまりますが、SQL を使用して結果を得る正確な方法は異なります。
ページネーションの本質は、たとえば 105 などの多数のレコードがあり、一度に表示するレコードの数をより少なく、管理しやすい数 (たとえば 10) だけにしたいということです。これを行うには、レコードの総数を調べる方法と、レコードのサブセットのみを選択する方法を知る必要があります。
まず、レコードがいくつあるかを調べます。このために、COUNT(*) を使用して、テーブル内のレコードをカウントします。テーブルが Users という名前の場合:
SELECT COUNT(*) FROM Users;
テーブルには 105 個のレコードがあると言ったので、これは結果を返し105
ます。各ページには 10 個のレコードがあると言ったので、合計で何ページあるかを計算します。105 / 10 = 10.5; 10 ページの後の余分なレコードには独自のページが必要なため、切り上げて 11 にします。ということで、全部で11ページ。Web ページには、ユーザーが 1 から 11 までのページを選択できるコントロールが表示されます。
すべてのレコードをフェッチする代わりに、一度に 1 ページだけをフェッチします。MySQL では、通常、LIMIT
キーワードを使用してこれを行います。これにより、レコードの範囲を選択できます。LIMIT
構文は次のように機能します: LIMIT $SKIP, $COUNT
、$SKIP
はスキップする結果セット内のレコード数、$COUNT
は返す数です。(実際には、利用可能なレコードが少ない場合に備えて、レコードまで取得します。) $COUNT
ユーザーはページ 6 を要求しました。これは、表示したい結果の前に 5 ページをスキップする必要があることを意味します。それぞれ 10 レコードのページで、これは 5 * 10 レコード、つまり 50 レコードをスキップすることを意味します。つまり、$SKIP = ($PAGE_NUMBER - 1) * $PAGE_SIZE
. クエリは次のようになります。
SELECT User_ID, UserName, City, State from Users LIMIT 50, 10;
これにより、テーブルのレコード 51 ~ 60 が得られます。
LIMIT の仕組みの詳細については、ドキュメントを参照してください。
http://dev.mysql.com/doc/refman/5.5/en/select.html
これで、1 ページのレコードができました。ただし、レコードの番号付けは順序によって異なります。上記のクエリでは、順序が定義されていないため、予測できない結果が得られます。(データベースは、特定の順序を使用するように指示しない限り、任意の順序でレコードを返すことができます。) したがって、ページ付けを行うには、レコードの順序を定義する必要があります。ORDER BY を使用して順序を定義します。
SELECT User_ID, UserName, City, State from Users ORDER BY UserName LIMIT 50, 10;
これにより、結果のさまざまなページを表示することができ、6 ページを表示すると、5 ページのレコードの後と 7 ページのレコードの前のレコードが含まれていることが常にわかります。
(レコードに自然な順序付けがない場合は、これを正しく機能させるために任意の順序付けを定義する必要があります。)
ページネーションを説明するために PHP について言及する必要はないと思うので、この回答では PHP について言及することはまったく避けました。ページネーションは、完全にデータの処理の問題です。これを理解したら、チュートリアルを読んで理解できると思います。そうすれば、これを行うための PHP の書き方を理解することができます。