[PHP & MySQL] 페이징 알고리즘

Posted at 2012.07.13 01:10 | Posted in 프로그래밍

꽤 많은 레코드가 반환되는 쿼리를 한번에 처리한다면 데이터베이스 서버와 클라이언트의 브라우저를 혹사시키고 있다고 표현할 수 있다. 많은 양의 레코드를 효과적으로 처리하기 위해서는 query문에 limit를 걸어주는 것이 편하다. 페이징 함수를 작성하기 전에 쿼리 문을 수정하자. 두개의 쿼리 문이 필요하다.

$page = (is_numeric($_GET['p'])) ? $_GET['p'] : 1;
$rpp = 8;  # record/page
$adjacents = 3; # 양 옆에 표시될 페이지 수

$query = mysql_query('select count(*) ~~');
list($total) = mysql_fetch_row($query);

$query = mysql_query('select ~~ limit '.($page-1)*$rpp.', '.$rpp);
$records = array();
while(($recods[] = mysql_fetch_array($query)) || array_pop($records));

레코드 표시 처리는 알아서 하시고.. 다음은 페이징을 처리하는 함수를 작성할 차례다.

function doPaging($page = 1, $total, $rpp = 15, $adjacents = 1, $url = './', $param = '?page=') {
	if(($last = ceil($total/$rpp)) > 1) {
		if($last < ($defc = 1+$adjacents*2)) {
			$i = 1;
			$cond = $last;
		}
		elseif($last >= $defc) {
			if($page < 2+$adjacents) {
				$i = 1;
				$cond = $defc/2+$page;
				$laston = true;
			}
			elseif($page >= $last-$defc/2) {
				$i = $last+1-$defc;
				$cond = $last;
				$firston = true;
			}
			elseif($page >= 2+$adjacents) {
				$i = $page-$adjacents;
				$cond = $page+$adjacents;
				$firston = true;
				$laston = true; 
			}
		}

		if($firston) {?><a href="<?=$url.$param?>1">1</a><span class="elipses">...</span><?php }
		for($i; $i <= $cond; $i++) {
			if($i == $page) {?><span class="selected"><?=$i?></span><?php }
			else {?><a href="<?=$url.$param.$i?>"><?=$i?></a><?php }
		}
		if($laston) {?><span class="elipses">...</span><a href="<?=$url.$param.$last?>"><?=$last?></a><?php }
	}
	else {?><span class="selected">1</span><?php }
}

이 함수는 밑과 같이 사용한다.

doPaging($page, $total, $rpp, $adjacents, '/search?q='.$_GET['q'], '&amp;p=');

저작자 표시 비영리
신고
  1. 블캣 사랑해요~~~~
    와 대단하신거 같아요~,,,
  2. 안뇽
    별룬데;; 보라고 쓴건가요? 아님 할줄안다는 의미로 쓴건가융?

Name __

Password __

Link (Your Website)

Comment