install.php
<?
include "connect.php"; //mysql접속
$query ="CREATE TABLE exam_memo(
no int unsigned auto_increment primary key,
name char(20) not null,
memo text not null,
pass char(20) not null,
time int unsigned
)";
mysql_query($query, $connect); //테이블생성
?>
페이지설계
connect.php -mysql에 접속, include하여 사용
install.php -exam_memo 테이블을 생성, 최초 설치시에만 실행
write.php -글 입력폼, 폼을 write_ing.php로 전송
write_ing.php - 입력된 글을 exam_memo테이블에 저장, 저장 후 list.php로 이동
list.php -입력된 글 리스트
del.php -선택된 글을 삭제하기 위해 비번을 입력받는 폼, 폼을 del_ing.php로 전송
del_ing.php - 선택된 글을 exam_memo테이블에서 삭제, 삭제후 리스트로 이동
edit.php - 선택된 글을 수정하기 위한 수정 폼, 폼을 edit_ing.php로 전송
edit_ing.php - 선택된 글을 수정, 수정 후 list.php로 이동
lib.php - 메모장 프로그램에 사용된 함수 라이브러리
lib.php 함수라이브러리
<?
//페이지 이동함수
function move_page ($url){
echo "<meta http-equiv='refresh' content='0; url=$url'>";
}
//에러메시지출력함수
function error ($memo){
echo "
<script language=javascript>
alert('$memo');
history.go(-1);
</script>
";
exit;
}
?>
write.php
<form method=post action=write_ing.php autocomplete=off>//autocomplete은 자동완성기능
이름 <input type=text size=10 name=name>
비번 <input type=password size=10 name=pass><br>
<textarea cols=30 rows=3 name=memo></textarea>
<input type=submit value='글쓰기'>
</form>
write_ing.php 글의저장
글쓰기 폼에서 전송을 누르면 write_ing.php로 각 변수가 전송되는데
post방식으로 전송되었기 때문에 $name, $pass, $memo과 같은 일반적인 변수가 아닌
$HTTP_POST_VARS[name], $HTTP_POST_VARS[pass], $HTTP_POST_VARS[memo]과 같은 환경변수를 사용하는것이 정석이긴 하지만, 여기서는 일반변수로 사용한다고 해서 문제될 것이 없으므로
그냥 $name, $pass, $memo로 사용하도록 하겠다
<?
include "connect.php"; //mysql에 접속
include "lib.php"; //함수라이브러리
if (!$name){error ('이름을 입력하삼');} //이름체크
if(!$pass){error ('비번을 입력하삼');} //비번체크
if (!$memo){error ('내용을입력하삼');}//내용체크
$pass=crypt ($pass,12); //비번암호화
$time=time(); //현재시간저장
$name=addslashes($name); //이름의 특수문자에 \를 붙임
$memo=addslashes($memo); //내용의 특수문자에 \를 붙임
$query="INSERT INTO exam_memo (name, memo, pass, time) VALUES ('$name', '$memo', ''$pass', '$time')";
mysql_query($query); //글저장
mysql_close($connect); //mySQL접속끊기
move_page ("list.php"); //list.php로 이동
?>
list.php
<table width=450 border=1>
<?
include "connect.php"; // mySQL에 접속
$query="SELECT * FROM exam_memo ORDER BY no DESC";
$result =mysql_query($query, $connect);
while ($data=mysql_fetch_array($result)) {
$data[name]=stripslashes($data[name]); //이름의 \제거
$data[memo]=stripslashes($data[memo]); //내용의 \제거
$data[memo]=nl2br ($data[memo]); //띄어쓰기
$data[time]=date('y-m-d', $data[time]); //시간포맷변환
echo "
<tr>
<td>$data[no]</td><td> $data[name]</td><td> $data[memo]</td><td> $data[time]</td></tr>";
}
mysql_close($connect);
?>
</table>
페이지이동로직
SELECT * FROM exam_memo ORDER BY no DESC LIMIT 0, 5 //첫번째페이지
SELECT * FROM exam_memo ORDER BY no DESC LIMIT 5, 5 //두번째페이지
SELECT * FROM exam_memo ORDER BY no DESC LIMIT 10, 5 //세번째페이지
$pagenum=1; //두번째 페이지로 설정
$page=5; // 페이지 당 게시물 개수
$total=16; //전체 게시물 수
$pagesu=총 페이지 수
$pagesu=ceil($total/$page); //올림하는 함수
LIMIT ($page*$pagenum), $page
LIMIT절에서의 시작위치는 페이지당 게시물 수에 $pagenum을 곱한 수가 되고,가져올 개수는 페이지 당 게시물 개수이다.
($page * $pagenum)을 $start라는 변수에 저장하자
$pagenum=1; //두번째 페이지로 설정
$page=5; // 페이지 당 게시물 개수
$total=16; //전체 게시물 수
$pagesu=ceil($total/$page); //올림하는 함수
$start=$page*$pagenum //시작위치
첫번째 페이지는 $pagenum=0 이다 0*5=0 그러므로 $start=0 결국 LIMIT 0, 5가 된다
두번째 페이지는 $pagenum=1 이다 1*5=5 그러므로 $start=5 결국 LIMIT 5, 5가 된다
일단 게시물의 전체갯수를 구하기 위하여 아래소스를 보자
$query="SELECT COUNT(*) FROM exam_memo "; //개수 세기 쿼리문
$result =mysql_query($query, $connect); //쿼리문입력
$total = mysql_result($result, 0, 0)//총개수저장
mysql_result 대신에 mysql_fetch_array 를 사용하는 방법도 있는데,
$query="SELECT COUNT(*) FROM exam_memo "; //개수 세기 쿼리문
$result = mysql_fetch_array (mysql_query($query, $connect)); //쿼리문입력
$total = $result["COUNT(*)"]; //총개수 저장
여기서 $result["COUNT(*)"] 대신에 $result[0]을 넣어주어도 같은 결과를 얻을 수 있다.
이제 $total 의 값을 구했으니 $total=16 부분은 삭제한다
$total=mysql_result ($result, 0,0);//총개수 저장
$pagenum=1; //두번째 페이지로 설정
$page=5; // 페이지 당 게시물 개수
$pagesu=ceil($total/$page); //올림하는 함수
$start=$page*$pagenum //시작위치
정리하면
<table width=450 border=1>
<?
include "connect.php"; // mySQL에 접속
$query="SELECT COUNT(*) FROM exam_memo"; //개수 세기 쿼리문
$result =mysql_query($query, $connect); //쿼리문입력
$total = mysql_result($result, 0, 0);//총개수저장
$pagenum=1; //두번째 페이지로 설정
$page=5; // 페이지 당 게시물 개수
$pagesu=ceil($total/$page); //올림하는 함수
$start=$page*$pagenum ;//시작위치
$query="SELECT * FROM exam_memo ORDER BY no DESC LIMIT $start, $page";
$result =mysql_query($query, $connect); //쿼리문입력-글꺼내기
while ($data=mysql_fetch_array($result)) { //글꺼내기
$data[name]=stripslashes($data[name]); //이름의 \제거
$data[memo]=stripslashes($data[memo]); //내용의 \제거
$data[memo]=nl2br ($data[memo]); //띄어쓰기
$data[time]=date('y-m-d', $data[time]); //시간포맷변환
echo "
<tr>
<td>$data[no]</td><td> $data[name]</td><td> $data[memo]</td><td> $data[time]</td></tr>";
}
mysql_close($connect);
?>
</table>
페이지그룹만들기
[1] [2] [3] [4] [5] [▶▶]
페이지그룹 1 ->pagenum의 값:0,1,2,3,4
페이지그룹 2 ->pagenum의 값:5,6,7,8,9
pagegroup=5; //페이지 그룹 당 페이지 수
현재의 페이지그룹을 구하는 식은
$pagegroupnum = ceil (($pagenum+1) / $pagegroup); //현재의 페이지 그룹
왜 이런식이 나왔는지 차근차근 대입해 보면?
$pagenum=0 일때 -> ceil( (0+1)/5 )=1 따라서 $pagegroupnum은 1이 된다
$pagenum=5 일때 -> ceil( (5+1)/5 )=2 따라서 $pagegroupnum은 2가 된다
페이지그룹의 첫페이지 구하는 식은
$pagestart = ($pagegroupnum - 1) * $pagegroup + 1 //페이지그룹의 첫 페이지
첫번째페이지그룹(1)이라면 (1-1)*5+1=1 , 즉 첫번째페이지그룹의 첫페이지는 1페이지이고
두번째페이지그룹(2)이라면 (2-1)*5+1=6 , 즉 두번째페이지그룹의 첫페이지는 6페이지이다.
첫번째페이지를 구하였으니 페이지그룹의 마지막페이지를 구하는식은?
$pageend=$pagestart + $pagegroup; //페이지 그룹의 마지막페이지
그런데 이렇게 해주면 첫번째 페이지 그룹의 시작페이지는 1이고, 페이지그룹 당 페이지수인 5를 더해주면
6이 되므로 -1을 해주어 5가 되도록 맞춰주도록 하자
$pageend=$pagestart + $pagegroup - 1; //페이지 그룹의 마지막페이지
현재의 페이지 그룹을 결정하고 그 페이지 그룹의 첫 페이지와 마지막페이지를 알아내었으니,
for문으로 페이지 이동버튼을 출력해보자
지금까지 정리해 보면
<table width=450 border=1>
<?
include "connect.php"; // mySQL에 접속
$query="SELECT COUNT(*) FROM exam_memo"; //개수 세기 쿼리문
$result =mysql_query($query, $connect); //쿼리문입력
$total = mysql_result($result, 0, 0);//총개수저장
//$pagenum=1; //두번째 페이지로 설정
$page=5; // 페이지 당 게시물 개수
$pagesu=ceil($total/$page); //올림하는 함수
$start=$page*$pagenum ;//시작위치
$query="SELECT * FROM exam_memo ORDER BY no DESC LIMIT $start, $page";
$result =mysql_query($query, $connect); //쿼리문입력-글꺼내기
while ($data=mysql_fetch_array($result)) { //글꺼내기
$data[name]=stripslashes($data[name]); //이름의 \제거
$data[memo]=stripslashes($data[memo]); //내용의 \제거
$data[memo]=nl2br ($data[memo]); //띄어쓰기
$data[time]=date('y-m-d', $data[time]); //시간포맷변환
echo "
<tr>
<td>$data[no]</td><td> $data[name]</td><td> $data[memo]</td><td> $data[time]</td></tr>";
}
mysql_close($connect);
?>
</table>
<?//페이지처리
$pagegroup = 5; //페이지그룹당 페이지수
$pageend = $pagestart + $pagegroup; //페이지그룹의 마지막페이지
$pagegroupnum= ceil(($pagenum+1)/$pagegroup); //현재의 페이지그룹
$pagestart = ($pagegroupnum-1) * $pagegroup +1; //페이지그룹의 첫 페이지
$pageend = $pagestart + $pagegroup -1 ; //페이지그룹의 마지막페이지
for ($i=$pagestart; $i <= $pageend; $i++) { //페이지 이동버튼 출력->1~5까지 루프가 돈다
if ($i > $pagesu) {break;} //페이지체크-실제페이지수보다 많으면 중단
echo "[$i]";
}
?>
이제 링크를 걸어 실제 페이지가 이동하도록 해보자
링크할 페이지는 자기자신, 즉 $PHP_SELF를 사용하고 GET방식으로 pagenum값을 넘겨주어야한다
<a href='$PHP_SELF?pagenum=$i'>
근데만약 위처럼 $i를 그대로 pagenum에 넣어주면 엉뚱한 펭지로 이동하게 될것이다
이것은 첫번째페이지일때 $pagenum=0이고
두번째페이지일때 $pagenum=1 인 것과 같이 $pagenum이 실제페이지보다 1만큼 작기때문이다
따라서 $i-1의 값을 넣어주어야 한다.
다음페이지 그룹으로 이동하기위해 [▶▶]
이전페이지 그룹으로 이동하기위해 [◀◀] 를 사용해보자
현재 페이지그룹이 2라면 다음페이지 그룹은 3이고, 이전페이지그룹은 1이 된다
따라서
$nextgroup = $pagegroupnum +1; //다음그룹
$prevgroup = $pagegroupnum -1; //이전그룹
이제 링크를 걸어주기위해 각각의 페이지 그룹에 속해 있는 페이지들의 첫 페이지를 구해준다.
$pagestart = ($pagegroupnum -1) * pagegroup +1; //페이지그룹의 첫페이지
$nextstart = ($nextgroup -1) * $pagegroup + 1; //다음 페이지 그룹의 첫 페이지
$prevstart = ($prevgroup -1) * $pagegroup +1; //이전 페이지 그룹의 첫 페이지
그런데 여기서는 몇번째 페이지인가를 생각하는 것이 아니라, 실제로 $pagenum으로 전달해 줄 값을 결정하는 것이므로
마지막의 +1은 하지 않도록 한다.
$nextstart = ($nextgroup -1) * $pagegroup ; //다음 페이지 그룹의 첫 페이지
$prevstart = ($prevgroup -1) * $pagegroup ; //이전 페이지 그룹의 첫 페이지
이제, 위의 $nextstart 와 $prevstart가 pagenum의 값으로 전달되도록 링크를 걸어주면된다
[<a href='$PHP_SELF?pagenm=$prevstart'>◀◀</a>]
[<a href='$PHP_SELF?pagenm=$nextstart'>▶▶</a>]
그런데 첫번째 페이지 그룹이라면 이전페이지가 존재하지 않기때문에, 첫번째 페이지 그룹이 아닐 경우에만 이전 페이지 그룹으로 이동하도록 if문을 하나 넣어준다
if ($pagegroupnum != 1) { //이전 페이지 그룹으로 이동
echo " [<a href='$PHP_SELF?pagenm=$prevstart'>◀◀</a>]";
다음페이지그룹으로의 이동에서도 마찬가지로 현재의 페이지 그룹이 마지막페이지그룹이라면
다음페이지그룹으로 이동할 필요는 없을 것이다.
따라서 다음페이지 그룹이 실제 존재하는지 알아보려면
전체 페이지 수($pagesu)가 다음페이지 그룹의 첫 번째 페이지($nextstart)+1 보다 큰지 알아보는 것이다.
전체 페이지 수가 크다면 아직 출력할 페이지들이 남아있는 것이 되므로
다음페이지 그룹은 실제로 존재하고 있다는 얘기가 된다
그리고 여기서 다음페이지 그룹의 첫페이지($nextstart)에 +1을 해준 이유는 우리가 구한 $nextstart는 $pageum의 값,
즉 첫번째 페이지가 1이 아닌 0을 갖기 때문이다.
결국 첫번째 페이지가 1이라는 값을 갖는 전체페이지 수와 값을 비교하기 위해 $nextstart에는 1을 더해줘야 한다
if($pagesu > ($nextstart +1) { //다음페이지그룹으로이동
echo " [<a href='$PHP_SELF?pagenum=$nextstart'>▶▶</a>]";
}
위 if문에서는 다음 페이지 그룹의 첫번째페이지($nextstart)가 전체 페이지 수보다 작은지를 검사하고,
만약 작다면 다음페이지 그룹이 존재하는 것으로 판단하여 이동버튼을 출력하도록 해준 것이다.
정리해보면
이전페이지그룹이동버튼
$prevgroup = $pagegroupnum -1; //이전그룹
$prevstart = ($prevgroup -1) * $pagegroup +1; //이전 페이지 그룹의 첫 페이지
if ($pagegroupnum != 1) { //이전 페이지 그룹으로 이동
echo " [<a href='$PHP_SELF?pagenm=$prevstart'>◀◀</a>]";
}
다음페이지그룹 이동버튼
$nextgroup = $pagegroupnum +1; //다음그룹
$nextstart = ($nextgroup -1) * $pagegroup ; //다음 페이지 그룹의 첫 페이지
if($pagesu > ($nextstart +1)) { //다음페이지그룹으로이동
echo " [<a href='$PHP_SELF?pagenum=$nextstart'>▶▶</a>]";
}
지금까지 한걸 정리해보면
list.php
<table width=450 border=1>
<?
include "connect.php"; // mySQL에 접속
$query="SELECT COUNT(*) FROM exam_memo"; //개수 세기 쿼리문
$result =mysql_query($query, $connect); //쿼리문입력
$total = mysql_result($result, 0, 0);//총개수저장
//$pagenum=1; //두번째 페이지로 설정
$page=5; // 페이지 당 게시물 개수
$pagesu=ceil($total/$page); //올림하는 함수
$start=$page*$pagenum ;//시작위치
$query="SELECT * FROM exam_memo ORDER BY no DESC LIMIT $start, $page";
$result =mysql_query($query, $connect); //쿼리문입력-글꺼내기
while ($data=mysql_fetch_array($result)) { //글꺼내기
$data[name]=stripslashes($data[name]); //이름의 \제거
$data[memo]=stripslashes($data[memo]); //내용의 \제거
$data[memo]=nl2br ($data[memo]); //띄어쓰기
$data[time]=date('y-m-d', $data[time]); //시간포맷변환
echo "
<tr>
<td>$data[no]</td><td> $data[name]</td><td> $data[memo]</td><td> $data[time]</td></tr>";
}
mysql_close($connect);
?>
</table>
<?//페이지처리
$pagegroup = 5; //페이지그룹당 페이지수
$pageend = $pagestart + $pagegroup; //페이지그룹의 마지막페이지
$pagegroupnum= ceil(($pagenum+1)/$pagegroup); //현재의 페이지그룹
$pagestart = ($pagegroupnum-1) * $pagegroup +1; //페이지그룹의 첫 페이지
$pageend = $pagestart + $pagegroup -1 ; //페이지그룹의 마지막페이지
$prevgroup = $pagegroupnum -1; //이전그룹
$prevstart = ($prevgroup -1) * $pagegroup +1; //이전 페이지 그룹의 첫 페이지
if ($pagegroupnum != 1) { //이전 페이지 그룹으로 이동
echo " [<a href='$PHP_SELF?pagenm=$prevstart'>◀◀</a>]";
}
for ($i=$pagestart; $i <= $pageend; $i++) { //페이지 이동버튼 출력->1~5까지 루프가 돈다
if ($i > $pagesu) {break;} //페이지체크-실제페이지수보다 많으면 중단
echo "[$i]";
}
$nextgroup = $pagegroupnum +1; //다음그룹
$nextstart = ($nextgroup -1) * $pagegroup ; //다음 페이지 그룹의 첫 페이지
if($pagesu > ($nextstart +1)) { //다음페이지그룹으로이동
echo " [<a href='$PHP_SELF?pagenum=$nextstart'>▶▶</a>]";
}
?>