본문 바로가기

[Terry] PHP

페이징 처리하기

페이징이란 게시물이 많을 경우 페이지를 나누어 제한된 글들을 보여주는 것을 말한다.

MySQL에서는 LIMIT를 이용해 페이징 처리를 한다.

우선 LIMIT에 대해 알아보자.

 

LIMIT 

- LIMIT는 출력되는 레코드의 수를 제한할 때 사용한다. 이때 주의할 점은 첫번째 레코드의 시작은 0 이라는 것이다.
즉, LIMIT 1, 5는 2번째부터 5개의 레코드를 가지고 오라는 의미이다.

 

사용예

SELECT * FROM BBS LIMIT 5; //처음부터 5개의 레코드를 가져와라

SELECT * FROM BBS LIMIT 0, 5; //처음부터 5개의 레코드를 가져와라

SELECT * FROM BBS LIMIT 1, 5; //2번째부터 5개의 레코드를 가져와라

 

페이징 처리를 위해 고려해야할 사항

1. 한 페이지 보여줄 게시물의 수를 정한다. ($posts_num)

2. 총 페이지 개수를 구한다.

   2-1. 전체 게시물 수를 구한다. ($total)

   2-2. 페이지 개수를 구한다. ($page_num)

3. 각 페이지를 구분할 방법을 고려한다. ($page_start)

4. 페이지수가 많을 경우 다음페이지그룹/이전페이지그룹 이동방법

   4-1. 10개 이상이 페이지를 한꺼번에 보여주는 것은 바람직하지 않다.

   4-2. 그렇기 때문에 그룹을 지어 화면에 나타내 주는 것이 좋다.

   4-3. 이를 위해 페이지 그룹당 페이지수를 정한다. ($pagegroup)

   4-4. 현재 페이지가 속한 페이지 그룹을 구한다. ($pagegroup_seq)

   4-5. 현재 페이지 그룹의 첫번째 페이지를 구한다. ($pagegroup_start)

   4-6. 현재 페이지 그룹의 마지막 페이지를 구한다. ($pagegroup_end)

   4-7. 이전 그룹을 구한다. ($prevgroup)

   4-8. 이전 그룹의 첫번째 페이지를 구한다. ($prevgroup_start)

   4-9. 다음 그룹을 구한다. ($nextgroup)

   4-10. 다음 그룹의 첫번째 페이지를 구한다. ($nextgroup_start)

5. 페이지수가 많을 경우 처음으로/끝으로 이동 방법

   5-1. 처음으로 이동 방법을 고려한다.

   5-2. 끝으로 이동 방법을 고려한다.

 

위의 고려사항을 구현해보자.

1. 우선 DB접속을 위해 connect.php를 구현한다.

<?
/*
* mySQL DB접속 방법
* 1. mySQL에 접속 : mysql_connect()함수 사용
* 2. 사용할 DB선택 : mysql_select_db()함수 사용
* 3. 완료후 접속 끊기 : mysql_close()함수 사용
*/

$host_name = "localhost"; // 호스트명
$user_id = "test";  // mysql 사용자 아이지
$user_pwd = "1234";  // mysql 비밀번호

$db_name = “test”; // 사용할 db명

$connect = mysql_connect($host_name, $user_id, $user_pwd); //mySQL에 접속
$mysql = mysql_select_db($db_name, $connect); //DB선택, 성공시 TRUE, 실패시 FALSE 리턴

?>

2. 페이징 구현

<?

   include “connect.php”; // MySQL접속

 

   $posts_num = 5; //한 페이지에 보여줄 게시물의 수

   $query = “select count(*) from bbs”;

   $result = mysql_query($query, $connect);

   $total = mysql_result($result, 0, 0);  //전체 게시물의 수

   $page_num = ceil($total/$posts_num);  //전체 페이지 개수

   $page_start = $posts_num * $page_seq;  //$page_seq의 값에 따라 페이지가 구분된다. 할당안하면 0이 들어감.

 

   $query = “select * from bbs order by no desc limit $page_start, $posts_num”;

   $result = mysql_query($query, $connect);

   while($data = mysql_array_fetch($result)){

      echo “$data[no] <br/>”;  //원래는 테이블에 출력해야 하지만 간단히 번호만 출력한다.

   }

 

   $pagegroup = 5;  // 페이지 그룹당 페이지 수

   $pagegroup_seq = ceil($page_num+1)/$pagegroup; // 현재 페이지의 그룹

   $pagegroup_start = ($pagegroup_seq –1) * $pagegroup + 1; // 페이지 그룹의 첫번째 페이지

   $pagegroup_end = $pagegroup_start + $pagegroup;

 

   $prevgroup = $pagegroup_seq – 1;  // 이전 페이지 그룹

   $prefgroup_start =($prevgroup -1) * $pagegroup;  //이전 페이지 그룹의 첫번째 페이지

 

   $nextgroup = $pagegroup_seq + 1; // 다음 페이지 그룹

   $nextgroup_start = ($nextgroup – 1) * $pagegroup;  //다음 페이지 그룹의 첫번째 페이지

 

   if($pagegroup_seq != 1){  //첫번째 페이지 그룹이 아닐경우

      //이전 페이지 그룹으로 이동하는 버튼 출력

      echo “[<a href=’$PHP_SELF?page_seq=$prevgroup_start’>☜ </a>]”;

   }

 

   for($i = $pagegroup_start; $i<=$pagegroup_end; $i++){

      //페이지 이동 버튼 출력

      if($i > $page_num){break;}  // 전체 페이지수가 $pagegroup보다 작을 경우 페이지수만 보여지게 처리

      $j = $i – 1;   // 넘겨줄 $page_seq

      echo “[<a href=’$PHP_SELF>page_seq=$j’>$i</a>]”;

   }

 

   if($page_num > ($nextgroup_start + 1)){

      // 다음 페이지 그룹으로 이동하는 버튼 출력

      echo “[<a href=’$PHP_SELF?page_seq=$nextgroup_start’>☞ </a>]”;

   }

?>

 

참고사항!

5번 항목을 구현하지 않았다. 조금 생각해서 각자가 구현해 보는게 더 도움이 될거라 생각한다.

Tistory 태그: ,,