페이징이란 게시물이 많을 경우 페이지를 나누어 제한된 글들을 보여주는 것을 말한다.
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번 항목을 구현하지 않았다. 조금 생각해서 각자가 구현해 보는게 더 도움이 될거라 생각한다.