programing

MySQL LIMIT, OFFSET을 사용한 페이지 번호 매기기

shortcode 2022. 11. 6. 17:27
반응형

MySQL LIMIT, OFFSET을 사용한 페이지 번호 매기기

한 페이지당 4개 항목만 표시하도록 데이터를 제한하는 코드가 있습니다.제가 사용하고 있는 칼럼에는 20~30개 정도의 아이템이 있기 때문에 여러 페이지에 걸쳐서 작성해야 합니다.

첫 페이지에는 다음과 같은 내용이 있습니다.

    $result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4");
{
  echo "<tr>";
  echo "<td align='center'><img src=\"" . $row['picturepath'] . "\" /></td>";
  echo "<td align='center'>" . $row['name'] . "</td> <td align='center'> <input type='button' value='More Info'; onclick=\"window.location='more_info.php?';\"> </td>";
  echo "<td align='center'>" . $row['price'] . "</td> <td align='center'> <input type='button' value='Add to Order' onclick=''> </td>";
  echo "</tr>";
 }
echo "</table>";

mysqli_close($con);

    ?> 

    <table width="1024" align="center" >
        <tr height="50"></tr>
            <tr>
                <td width="80%" align="right">
                    <a href="itempage2.php">NEXT</a>
                </td>
                <td width="20%" align="right">
                    <a href="">MAIN MENU</a>
                </td>
            </tr>
    </table>

페이지 하단에 앵커 태그가 두 번째 페이지인 "itempage2.php"가 나열되어 있는 것을 알 수 있습니다.2페이지 항목에는 4의 오프셋이 있는 것을 제외하고 동일한 코드가 있습니다.

$result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4 offset 4");

이렇게 하면 데이터베이스에 미리 정해진 개수의 항목이 있을 때 작동합니다.하지만 그렇게 좋진 않아요.지금처럼 하드코드가 아닌 항목이 더 많은 경우에만 새 페이지를 만들어야 합니다.

어떻게 하면 새로운 페이지를 하드코드하여 오프셋하지 않고 여러 페이지를 작성할 수 있을까요?

우선, 페이지 마다 서버 스크립트를 따로 두지 말아 주세요.그것은 미친 짓입니다.대부분의 응용 프로그램은 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, 과 같습니다

SELECT * FROM menuitem LIMIT 4,4

그것이 페이지 매김의 기본적인 문제입니다.이것으로, 페이지수의 합계를 파악하는 요건이 추가되었습니다(「NEXT PAGE」를 표시할 것인지, 링크를 개입시켜 X페이지에 직접 액세스 할 것인지를 결정할 수 있습니다).

그러기 위해서는 표의 행 수를 이해해야 합니다.

실제 제한된 레코드 세트를 반환하기 전에 DB 호출을 사용하여 이 작업을 수행할 수 있습니다(요청된 페이지가 존재하는지 확인하고 싶기 때문에 이전이라고 합니다).

이것은 실제로 매우 간단합니다.

$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>';
   }
}

로 쓰면 큰 가 되지 .OFFSET그요.OFFSET퍼포먼스에 악영향을 미칩니다.이는 건너뛴 모든 행을 매번 읽어야 하기 때문입니다.

어디서 멈췄는지 기억하는 것이 좋다.

심플하게 하고 싶다면, 이것을 사용해 보세요.

$page_number = mysqli_escape_string($con, $_GET['page']);
$count_per_page = 20;
$next_offset = $page_number * $count_per_page;
$cat =mysqli_query($con, "SELECT * FROM categories LIMIT $count_per_page OFFSET $next_offset");
while ($row = mysqli_fetch_array($cat))
        $count = $row[0];

나머지는 너에게 달렸어.두 테이블에서 결과를 얻으면 다른 방법을 시도해 볼 것을 제안합니다.

.. LIMIT :pageSize OFFSET :pageStart

서 ★★★★★:pageStart는 _page_index(첫 페이지의 경우 0 등)* 페이지당 번호_of_par_pages(예: 4)에 바인드되어 있습니다.:pageSize는, 페이지 마다 number_of_par_par_pages 에 바인드 됩니다.

"페이지 수가 더 많다"를 검출하려면 SQL_CALC_FOUND_ROWS를 사용하거나.. LIMIT :pageSize OFFSET :pageStart + 1누락된 마지막(pageSize+1) 레코드를 검출합니다.물론 인덱스가 0 이상인 페이지에는 이전 페이지가 존재합니다.

페이지 인덱스 값이 URL(예: "prev page" 및 "next page" 링크)에 포함되어 있는 경우 해당 값을 적절한 방법으로 얻을 수 있습니다.$_GET아이템을 선택합니다.

언급URL : https://stackoverflow.com/questions/20364349/pagination-using-mysql-limit-offset

반응형