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.="&nbsp;<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.="&nbsp;<a href='$_SERVER[PHP_SELF]?page=$i'><span>$i</span></a>";

}else{

$paging_str.="&nbsp;<b>$i</b>";//현재 페이지이면 굵게 표시

}//else닫기

}//for문 닫기

}//if문 닫기

 

//다음 페이징 영역으로 가는 링크 만들기

if($total_page>$end_page){

$paging_str.="&nbsp;<a href='$_SERVER[PHP_SELF]?page=($end_page+1)'>[다음]</a>";

}//if문 닫기

 

//마지막 페이지 링크

if($page < $total_page){

$paging_str.="&nbsp;<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++; // 데이터 갯수 체크를 위해 i1씩 증가시킴.

} //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방식으로 page1을 보낸다.

 

$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.="&nbsp;<a href='$_SERVER[PHP_SELF]?page=($start_page-1)'>[이전]</a>";

페이지 그룹의 시작 페이지가 1이면 이전 그룹은 없기 때문에 시작 페이지가 1보다 클 경우에만 출력됨.

이전 페이지 그룹으로 이동한다.

현재 페이지가 제일 처음의 페이지 그룹이라면 맨 앞 페이지로 이동한다.

페이징을 출력할 문자열인 $paging_str.=를 이용해서 링크될 주소를 가진 문자열 '[이전]'이 추가된다.

 

$paging_str.="&nbsp;<a href='$_SERVER[PHP_SELF]?page=($end_page+1)'>[다음]</a>";

총 페이지 수가 현재 페이지 그룹의 마지막 페이지가 보다 크면 에 1을 더한 페이지로 링크를 건다.

 

$paging_str.="&nbsp;<a href='$SERVER[PHP_SELF]?page=$total_page'>[맨끝]</a>";

현재 페이지가 총 페이지보다 작으면 총 페이지에 링크를 걸면 된다.

 

LIMIT $from_record, $page_row;

LIMIT a, b; a 번째 자료에서 시작해서 b만큼 선택하라는 명령이다.

즉 여기서는 $from_record에서 시작해서 $page_row만큼 선택하라는 뜻.

Posted by star story :

Snippet :: Code View :: "+location.href+'
'+b+"

");top.consoleRef.document.close()}$(".snippet-container").each(function(b){$(this).find("a.snippet-text").click(function(){var d=$(this).parents(".snippet-wrap").find(".snippet-formatted");var c=$(this).parents(".snippet-wrap").find(".snippet-textonly");d.toggle();c.toggle();if(c.is(":visible")){$(this).html("html")}else{$(this).html("text")}return false});$(this).find("a.snippet-window").click(function(){var c=$(this).parents(".snippet-wrap").find(".snippet-textonly").html();a(c);$(this).blur();return false})});$(".snippet-toggle").each(function(b){$(this).click(function(){$(this).parents(".snippet-container").find(".snippet-wrap").toggle()})})});