[PHP] 게시판 만들기 (7/10) - 다음 페이지로 이동 링크(페이징) 생성하기

2022. 10. 26. 04:16무료강좌&튜토리얼/PHP

[PHP] 게시판 만들기 (7/10) - 다음 페이지로 이동 링크(페이징) 생성하기

 

앞에서생성한 게시물 목록의 쪽수를 출력하는 [184_nextPageLink.php] 파일을 만들어보자.

게시물의 페이지 기능은 위와 같이 구성된다.

[처음] 링크는 첫페이지로 이동하는 링크이다.

[이전] 링크는 현재 페이지의 이전 페이지로 이동하는 링크이다.

[페이지수] 링크는 현재 페이지를 기준으로 앞페이지 5개를 표시하고 뒷 페이지 5개를 표시한다.

[다음] 링크는 현재 페이지의 다음 페이지로 이동하는 링크이다.

[끝] 링크는 가장 마지막 페이지로 이동하는 링크이다.

 

이전 페이지가 없는 경우에는 [이전] 링크를 표시하지 않으며 다음 페이지가 없는 경우 [다음] 링크를 표시하지 않는다.

[처음] 링크와 [끝] 링크는 항상 표시하게 한다.

 

다음은 페이징 기능의 예제이다.

[예제: 184_nextPageLink.php ]

<?php
  //전체 레코드 수 구하기
  $sql = "SELECT count(boardID) FROM board";
  $result = $dbConnect->query($sql);

  $boardTotalCount = $result->fetch_array(MYSQLI_ASSOC);
  $boardTotalCount = $boardTotalCount['count(boardID)'];

  //총 페이지 수
  $totalPage = ceil($boardTotalCount / $numView);

  //처음 페이지 이동 링크
  echo "<a href='./183_list.php?page=1'>처음</a>&nbsp;";

  //이전 페이지 이동 링크
  if($page != 1) {
    $previousPage = $page - 1;
    echo "<a href='./183_list.php?page={$previousPage}'>이전</a>";
  }

  //현재 페이지의 앞 뒤 페이지 수 표시
  $pageTerm = 5;

  //처음 표시할 페이지를 현재 페이지를 기준으로 5개 이전까지만 표시
  $startPage = $page - $pageTerm;
  //음수일 경우 처리
  if($startPage < 1) {
    $startPage = 1;
  }

  //처음 표시할 페이지를 현재 페이지를 기준으로 5개 이전까지만 표시
  $lastPage = $page + $pageTerm;

  //마지막 페이지의 수보다 클 경우 처리
  if($lastPage >= $totalPage) {
    $lastPage = $totalPage;
  }

  for($i = $startPage; $i <= $lastPage; $i++) {
    $nowPageColor = 'unset';
    if($i == $page) {
      $nowPageColor = 'hotpink';
    }
    echo "&nbsp<a href='./183_list.php?page={$i}'";
    echo "style='color:{$nowPageColor}'>{$i}</a>&nbsp";
  }

  //다음 페이지 이동 링크
  if($page != $totalPage) {
    $nextPage = $page + 1;
    echo "<a href='./183_list.php?page={$nextPage}'>다음</a>";
  }

  //마지막 페이지 이동 링크
  echo "&nbsp;<a href='./183_list.php?page={$totalPage}'>끝</a>";
?>

1. board 테이블의 레코드 수를 불러오는 쿼리문이다.

2. 쿼리문을 실행한다.

3. 쿼리문의 데이터를 변수 boardTotalCount에 대입한다.

4. 변수 boardTotalCount의 레코드 수 정보를 변수 boardTotalCount에 다시 대입한다.

5. 총 페이지의 수를 구한다. 변수 numView는 [183_list.php]에 선언되어 있다. ceil() 함수는 올림을 하는 함수이며, 변수 numView의 값인 10으로 페이지를 구성할 때 남는 게시물을 표시하기 위해 반올림이나, 버림 처리를 하지 않고 올림 처리를 한다.

6. 처음 페이지로 이동하는 링크이다. $_GET 방식을 사용하며 page의 값을 1로 적용한다.

7. 처음 페이지인 1페이지에서는 이전 페이지로 이동할 수 없으므로 1페이지인 경우 이전 링크를 표시하지 않는다.

8. [이전] 링크를 출력한다.

9. 현재 페이지를 기준으로 앞 뒤로 5개의 페이지까지 표시한다. 모든 페이지를 표시하면 가로로 많은 양의 페이지가 표시되는 현상을 방지하기 위함이다. 예를 들어, 현재 페이지가 8페이지이면 페이지를 처음 시작하는 수는 3이된다.

10. 현재 페이지를 기준으로 처음 출력할 페이지의 수를 구한다. 현재 페이지에서 변수 pageTerm의 값을 뺸 값을 처음 페이지로 지정한다.

11. 변수 startPage의 값이 음수일 경우에는 변수 startPage에 1을 대입하여 1페이지부터 표시한다.

12. 현재 페이지를 기준으로 이후 표시할 페이지를 구한다. 현재 페이지에서 변수 pageTerm의 값을 더하여 표시할 페이지를 구한다.

13. 이후 표시할 페이지가 총 페이지의 수를 넘을 경우 마지막으로 표시할 페이지의 수를 총 페이지의 수로 변경한다.

14. 표시할 페이지 링크에서 처음 시작할 페이지와 마지막 페이지를 구했으므로 이 값으로 for 반복문을 이용하여 페이지 이동 링크를 생성한다.

15. 페이지 링크 중에서 현재 페이지는 다른 색을 표시하기 위해 변수 nowPageColor를 생성하고 기본값으로unset을 대입한다. unset은 CSS의 color 속성의 값으로 사용되며 값을 정의하지 않음을 의미한다.

16. 같은 페이지일 경우 변수 nowPageColor 에 값 hotpink를 대입한다.

17. 표시한 페이지 이동 링크이다. a 링크의 href 속성의 값으로 [183_list.php] 에 $_GET 방식으로 page의 값을 입력한다. a 링크에서 사용한 style 속성은 CSS 속성을 사용할 수 있는 속성이며, color 속성은 태그의 색을 지정하는 CSS 속성이다. $nbsp;는 공백을 표시하는 기능을 갖는다.

18. 현재 페이지가 마지막 페이지와 같다면 다음 링크를 표시하지 않는다.

19. [다음] 링크에서 이동할 값을 구한다. 현재 페이지의 값에서 1을 더한 값을 변수 nextPatge에 대입한다.

20. 마지막 페이지로 이동하는 링크이다.

 

 [코드 184]는 [코드 183]에서 include 하는 파일이므로 [코드 183]을 웹프라우저에서 호출하여 테스트한다.

실행 URl은 http://localhost/php/board/183_list.php 이다

 

실행결과

아직 186_searchForm.php 파일은 만들어지지 않은 상태이므로 에러가 표시된다.

 

 


 

 

 

초보자를 위한 PHP 200제
김태영 지음 | 정보문화사