17. Mysql을 이용한 메모장 (7) 페이징 -php-
-ceil()
-floor()
-round()
-count(*)
-$_SERVER[PHP_SELF]
-substr()
-memo_list.php를 편집한다.
ceil():올림, floor():버림, round():반올림
ceil() : 소수점 이하를 무조건 올린다.
echo ceil(4.3); // 5
echo ceil(9.99); // 10
echo ceil(-3.22); // -3
floor(): 소수점 이하를 무조건 버린다.
echo floor(5.6); // 5
echo floor(2.2); // 2
echo floor(-2.7); // -2
round(): .5 이상은 반올림 시킨다.
echo round(5.5); // 6
echo round(5.4); // 5
echo round(-2.3); // -2
echo round(-2.6); // -3
웹 페이지의 페이징을 표시할 때 게시 글의 총 갯수가 15개. 한 페이지에 보여주는 게시물의 수가 5개씩이면 총 몇 페이지가 나와야 되는가?
이를 계산할 때 보통 (총 게시물 수 / 한 페이지에 보여줄 수 )를 계산하면 총 페이지의 수가 나온다.
방금 예에서는 총 게시물이 15개이고 한 페이지에 5개씩 보여줘야 되니까 총 3페이지가 된다.
총 게시물이 15개이고 한 페이지에 보여주는 게시물의 수가 6개면 몇 페이지여야 하는가?
방금 공식처럼 (총 게시물수 / 한 페이지에 보여줄 수)를 하면, 15 / 6 = 2.5 가 나온다. 그러면 페이징은 2페이지여야 할까 3페이지여야 할까??
페이징의 관점에서 보면 나머지 글을 출력 할 페이지가 추가되어야 한다. 따라서 위 같은 경우는 ceil(총 게시물 수/한 페이지에 보여줄 수)처럼 ceil 함수를 이용하면 총 페이지 수를 보여줄 수 있다.
(round()를 쓰지 않는 이유는 방금 언급했듯이 2.1 이더라도 페이지는 추가되어야 하기 때문이다.)
$_SERVER[PHP_SELF]:
현재 실행 파일의 이름이 들어 있다. (즉 자기 자신의 파일 이름)
memo_list.php
<?
include "memo.php";
?>
<br>
<!--제목 부분 출력 -->
<table style="width:500px; height:50px; border: 5px #cccccc solid;">
<tr>
<td align="center" valign="middle">
메모목록 보기(페이징)
</td>
</tr>
</table>
<br>
<table style="width:500px;">
<tr>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
내용
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
이름
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
이메일
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
작성일
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
수정/삭제
</td>
</tr>
<?
$db_host = "mysql.com";
$db_user = "mydb";
$db_pass = "password";
$db_name = "db이름"
//database와 연결.
$connect=mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
mysql_query("set names utf8");//한글 입력을 위한 설정.
mysql_select_db($db_name) or die(mysql_error());
//여기부터 페이징 관련
if($_GET[page]&& $_GET[page]>0){ //페이지 값이 존재하고 그 값이 0보다 크면 실행.
$page=$_GET[page];
}else{ //그 외에는 페이지를 1로 설정한다.
$page = 1;
}
//페이지 기본 설정
$page_row=10; //한 페이지에 보일 글 수
$page_scale=10; //한 페이지 그룹에 보일 페이지 수
//전체 글 수 구하기
$query_total="SELECT COUNT(*) AS cnt FROM sample_memo WHERE 1";
//해당 테이블의 전체 갯수를 cnt라는 필드명을 만들어서 거기에 저장한다.(AS의 역할)
$result_total=mysql_query($query_total);
$data_total=mysql_fetch_array($result_total);
$total_count=$data_total[cnt];//cnt에 저장 된 값을 $total_count라는 변수에 저장한다.
//전체 페이지가 얼마가 될 지를 계산한다.
$total_page=ceil($total_count/$page_row);//올림 함수
//시작 글 구하기
$from_record = ($page - 1) * page_row;
//페이징을 출력할 변수의 초기화
$paging_str="";
//[처음] 페이지 링크 만들기 (설명 첨부)
if($page>1){
$paging_str.="<a href='".$_SERVER[PHP_SELF]."?page=1'>[처음]</a>";
}// if문 닫기
//페이징에 표시될 시작 페이지 구하기 (설명 첨부)
$start_page=( (ceil($page/$page_scale)-1)*$page_scale)+1;
//페이징에 표시될 마지막 페이지 구하기 (설명 첨부)
$end_page=$start_page+$page_scale - 1;
if($end_page >= $total_page){
$end_page=$total_page;
}
//[이전] 페이지 영역으로 가는 링크 만들기
if($start_page>1){
$paging_str.=" <a href='$_SERVER[PHP_SELF]?page=($start_page-1)'>[이전]</a>";
}
//페이지 출력부분 링크 만들기
if($total_page > 1){
for( $i = $start_page; $i <= $end_page; $i++){
//현재 페이지가 아니면 링크 걸기
if($page != $i){
$paging_str.=" <a href='$_SERVER[PHP_SELF]?page=$i'><span>$i</span></a>";
}else{
$paging_str.=" <b>$i</b>";//현재 페이지이면 굵게 표시
}//else닫기
}//for문 닫기
}//if문 닫기
//다음 페이징 영역으로 가는 링크 만들기
if($total_page>$end_page){
$paging_str.=" <a href='$_SERVER[PHP_SELF]?page=($end_page+1)'>[다음]</a>";
}//if문 닫기
//마지막 페이지 링크
if($page < $total_page){
$paging_str.=" <a href='$SERVER[PHP_SELF]?page=$total_page'>[맨끝]</a>";
}//여기까지 페이징
//쿼리문 작성
$query="SELECT * FROM sample_memo WHERE 1 ORDER BY m_idx DESC LIMIT $from_record, $page_row ";
// $from_record하고 $page_row를 ''로 감싸서 에라 나서 고생했다. 수자 데이터이므로 ''안 해도 됨.
$result=mysql_query($query); //쿼리문 적용하고 $result에 대입.
$i=0;
while($data = mysql_fetch_array($result)){
?>
<tr>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
<?=$data['m_memo']?>
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
<?=$data['m_name']?>
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
<?=$data['m_email']?>
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
<?=substr($data['regdate'], 5, 11)?>
</td>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
<input type="button" value="수정" onclick="location.href='memo_modify.php?m_idx=<?=$data[m_idx]?>' ">
<input type="button" value="삭제" onclick="location.href='memo_delete.php?m_idx=<?=$data[m_idx]?>' ">
</td>
</tr>
<?
$i++; // 데이터 갯수 체크를 위해 i를 1씩 증가시킴.
} //while문 닫기
if($i==0){ //데이터가 없으면
?>
<tr>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
자료가 하나도 없음
</td>
</tr>
<?
} //if문 닫기
if($paging_str){ //페이징 출력
?>
<tr>
<td height="20" align="center" valign="middle" style="border:1px #cccccc solid;">
<?=$paging_str?></td>
</tr>
<?
} //if문 닫기
mysql_close($connect);
?>
</table>
$query_total="SELECT COUNT(*) AS cnt FROM sample_memo WHERE 1";
count(*)함수는 전체 자료의 수를 구한다.
AS cnt에 의해 그 값이 cnt라는 배열 인덱스 이름 안에 저장된다.
$total_page=ceil($total_count/$page_row);
ceil(전체 글 수/ 한 페이지에 표시되는 글 수)를 이용해서 총 페이지 수를 구한다.
$from_record=($page-1)*page_row;
시작 글=(현재 페이지-1)*페이지 당 글 수
시작 글 구하기는 글 목록에 보이는 최초 글이 몇 번째 글이 될 지를 구하는 것.
1 페이지인 경우 : 0번째 글에서 시작한다.
2 페이지인 경우 : 10번째 글에서 시작한다.
$paging_str.="<a href='$_SERVER[PHP_SELF]?page=1'>[처음]</a>";
[처음] 페이지 링크 만들기
[처음]을 누르면 1페이지로 가게 만들기 위함.
현재 페이지(memo_list.php)가 1 페이지라면 필요가 없으므로 링크를 출력 안하고 현재 페이지가 1보다 클 때 출력.
[처음]에다가 현재의 페이지(memo_list.php)에 page값으로 1을 보내기 위해 위와 같이 링크를 건다.
$_SERVER[PHP_SELF]에는 memo_list.php가 들어 있다. 여기에 (?page=1)를 이용해서 GET방식으로 page값 1을 보낸다.
$start_page=( (ceil($page/$page_scale)-1)*$page_scale)+1;
$start_page : 각 페이지 그룹의 시작 페이지.
$page : 현재 페이지
$page_scale : 페이지 그룹의 크기 (여기서는 1~10페이지이다)
각 페이지 그룹의 시작 페이지를 구한다.(페이지 그룹은 0 번째부터 카운트 된다.)
0 번째 페이지 그룹 = 1~10 일 경우 : 1 이 $start_page에 저장된다.
1 번째 페이지 그룹 = 11~20 일 경우 : 11 이 $start_page에 저장된다.
:
페이지 그룹 = ceil(현재 페이지 / 페이지 그룹의 크기)-1;
페이지 그룹의 시작 페이지 = ( 페이지 그룹 * 페이지 그룹의 크기 ) + 1;
두 공식을 합쳐서 만든 식이 바로 위의 공식임.
$end_page=$start_page+$page_scale - 1;
페이지그룹의 마지막 페이지 = 페이지 그룹의 시작 페이지+페이지 그룹의 크기-1;
페이지그룹의 마지막 페이지가 총 페이지 수($total_page) 보다 크다면 마지막 페이지에 총 페이지 수를 대입한다.
$paging_str.=" <a href='$_SERVER[PHP_SELF]?page=($start_page-1)'>[이전]</a>";
페이지 그룹의 시작 페이지가 1이면 이전 그룹은 없기 때문에 시작 페이지가 1보다 클 경우에만 출력됨.
이전 페이지 그룹으로 이동한다.
현재 페이지가 제일 처음의 페이지 그룹이라면 맨 앞 페이지로 이동한다.
페이징을 출력할 문자열인 $paging_str에 .=를 이용해서 링크될 주소를 가진 문자열 '[이전]'이 추가된다.
$paging_str.=" <a href='$_SERVER[PHP_SELF]?page=($end_page+1)'>[다음]</a>";
총 페이지 수가 현재 페이지 그룹의 마지막 페이지가 보다 크면 에 1을 더한 페이지로 링크를 건다.
$paging_str.=" <a href='$SERVER[PHP_SELF]?page=$total_page'>[맨끝]</a>";
현재 페이지가 총 페이지보다 작으면 총 페이지에 링크를 걸면 된다.
LIMIT $from_record, $page_row;
LIMIT a, b; 는 a 번째 자료에서 시작해서 b만큼 선택하라는 명령이다.
즉 여기서는 $from_record에서 시작해서 $page_row만큼 선택하라는 뜻.
'COMPUTER > php' 카테고리의 다른 글
19. 절대 주소, 상대 주소의 사용에 대한 고찰. -php- (0) | 2017.04.13 |
---|---|
고찰 3. break, return, exit, die 탈출문 정리 -php (0) | 2017.03.25 |
16. Mysql을 이용한 메모장 (7) 삭제 저장 -php- (0) | 2017.03.22 |
15. Mysql을 이용한 메모장 (6) 삭제 -php- (0) | 2017.03.22 |
14. Mysql을 이용한 메모장 (5) 수정 저장 -php- (0) | 2017.03.22 |