まず、ページごとに個別のサーバースクリプトを用意しないでください。これは、ただの狂気です。ほとんどのアプリケーションは、URLのページネーションパラメータを使用してページネーションを実装します。次のようなもの:
http://yoursite.com/itempage.php?page=2
リクエストされたページ番号には、$_GET['page']
からアクセスできます。 。
これにより、SQLの定式化が非常に簡単になります:
// determine page number from $_GET
$page = 1;
if(!empty($_GET['page'])) {
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
if(false === $page) {
$page = 1;
}
}
// set the number of items to display per page
$items_per_page = 4;
// build query
$offset = ($page - 1) * $items_per_page;
$sql = "SELECT * FROM menuitem LIMIT " . $offset . "," . $items_per_page;
たとえば、ここでの入力がpage=2
の場合 、1ページに4行の場合、クエリは「
SELECT * FROM menuitem LIMIT 4,4
これがページ付けの基本的な問題です。これで、ページの総数を理解する必要があるという追加の要件があります(これにより、「次のページ」を表示するかどうか、またはリンクを介してページXに直接アクセスできるようにするかどうかを決定できます)。
>これを行うには、テーブルの行数を理解する必要があります。
実際の制限されたレコードセットを返す前に、DB呼び出しを使用してこれを行うことができます(要求されたページが存在することを明らかに検証したいので、BEFOREと言います)。
これは実際には非常に簡単です:
$sql = "SELECT your_primary_key_field FROM menuitem";
$result = mysqli_query($con, $sql);
$row_count = mysqli_num_rows($result);
// free the result set as you don't need it anymore
mysqli_free_result($result);
$page_count = 0;
if (0 === $row_count) {
// maybe show some error since there is nothing in your table
} else {
// determine page_count
$page_count = (int)ceil($row_count / $items_per_page);
// double check that request page is in range
if($page > $page_count) {
// error to user, maybe set page to 1
$page = 1;
}
}
// make your LIMIT query here as shown above
// later when outputting page, you can simply work with $page and $page_count to output links
// for example
for ($i = 1; $i <= $page_count; $i++) {
if ($i === $page) { // this is current page
echo 'Page ' . $i . '<br>';
} else { // show link to other page
echo '<a href="/menuitem.php?page=' . $i . '">Page ' . $i . '</a><br>';
}
}