Web Programming >> PHP Programming
|
[목차] |
제9장 방명록 만들기(MySQL)
1. MySQL을 이용한 방명록 프로그램
1. Table 만들기 파일명 : guestbook.sql create table guestbook ( num int not null default '0' auto_increment, name varchar(20), email varchar(60), content blob, primary key(num) );
# mysql -u php -p sample < guestbook.sql
2. 목록보기(list.html)
<? $connect = mysql_connect("localhost","php","php99") or error("DB Server에 접속할 수 없습니다."); mysql_select_db("sample",$connect);
$pgsize = 10; // 한 페이지당 보여줄 게시물 수 $rcount = 0;
$query="SELECT count(*) FROM guestbook"; $result=mysql_query($query,$connect); $rows=mysql_fetch_row($result);
$totalpage = (int)($rows[0]/$pgsize)+1; $temppage = $rows[0]/$pgsize + 1;
// ==<< 게시물 갯수가 페이지당 게시물수와 나누어 떨어질때 >>== // if($temppage == $totalpage) $totalpage = $totalpage - 1;
// ==<< 넘어온 page값이 없으면 처음 페이지로 셋팅 >>== // if($page == "") $page=1;
// ==<< 넘어온 page값이 totalpage값보다 커지는것을 방지 >>== // if($page > $totalpage) $page=$totalpage;
$query = "SELECT * FROM guestbook ORDER BY num DESC"; $result = mysql_query($query,$connect);
for( $tt = 0 ; $tt < $pgsize * ($page-1) ; $tt++) { $row = mysql_fetch_array($result); // 공 루프 }
echo " <HTML> <HEAD> <TITLE>Guest Book 만들기</TITLE> </HEAD> <BODY BGCOLOR=eeeeee> <CENTER> <FONT SIZE=7 FACE='Comic Sans MS'>Guest Book</FONT><BR><BR> <TABLE BGCOLOR=eeeeee WIDTH=600> <TR> <TD ALIGN=LEFT WIDTH=50%><FONT SIZE=2>총 게시물 : $rows[0]</FONT></TD> <TD ALIGN=RIGHT WIDTH=50%><FONT SIZE=2>페이지 : $page/$totalpage</FONT></TD> </TR> </TABLE>";
while($row = mysql_fetch_array($result)) { $row[content]=eregi_replace("\n","<BR>",$row[content]); $row[content]=stripslashes($row[content]);
if($rcount == $pgsize) break; echo " <TABLE WIDTH=600 CELLSPACING=1 BGCOLOR=black> <TR> <TD BGCOLOR=bbbbbb><FONT SIZE=2>작성자 : $row[name] ( "; if(!$row[email]) echo "<FONT COLOR=RED>E-Mail 없음</FONT>"; else echo "<A HREF=mailto:$row[email]>$row[email]</A>"; echo " )</TD> </TR> <TR> <TD BGCOLOR=eeeeee><FONT SIZE=2><BR>$row[content]<BR><BR></FONT></TD> </TR> </TABLE> <BR>"; $rcount++;
} echo "<FONT SIZE=2>"; $ppage=$page - 1; $npage=$page + 1;
if($page <= 1) echo "[ 이전 페이지 ]"; else echo "[ <A HREF='list.html?page=$ppage'>이전 페이지</A> ]"; echo "[ <A HREF='postform.html'>글쓰기</A> ]</A>"; if($page >= $totalpage) echo "[ 다음 페이지 ]"; else echo " [ <A HREF='list.html?page=$npage'>다음 페이지</A> ]";
mysql_close(); ?>
3. 글쓰기(postform.html) <HTML> <HEAD> <TITLE>Guest Book 만들기</TITLE> </HEAD> <BODY BGCOLOR=eeeeee> <CENTER> <FONT SIZE=7 FACE='Comic Sans MS'>Guest Book</FONT><BR><BR> <FONT SIZE=2> 이름, E-Mail, 내용등 모든 내용에는 HTML태그를 사용 할 수 없습니다. <BR> <FORM METHOD=POST ACTION='post.html'> <TABLE WIDTH=600 CELLSPACING=1 BGCOLOR=black> <TR> <TD ALIGN=CENTER WIDTH=20% BGCOLOR=eeeeee><FONT SIZE=2>이 름</FONT></TD> <TD BGCOLOR=eeeeee WIDTH=80%><INPUT TYPE=TEXT SIZE=15 NAME=name></TD> </TR> <TR> <TD ALIGN=CENTER WIDTH=20% BGCOLOR=eeeeee><FONT SIZE=2>E-Mail</FONT></TD> <TD BGCOLOR=eeeeee WIDTH=80%><INPUT TYPE=TEXT SIZE=45 NAME=email></TD> </TR> <TR> <TD ALIGN=CENTER WIDTH=20% BGCOLOR=eeeeee><FONT SIZE=2>내용</FONT></TD> <TD BGCOLOR=eeeeee WIDTH=80%> <TEXTAREA NAME=content ROWS=9 COLS=64></TEXTAREA></TD> </TR> <TR> <TD ALIGN=CENTER COLSPAN=2 BGCOLOR=eeeeee> <INPUT TYPE=SUBMIT VALUE='확인'> <INPUT TYPE=RESET VALUE='다시 쓰기'> </TR> </TABLE> </FORM> </BODY> </HTML>
4. 글쓰기 처리(post.html) <? if(!$name) { echo " <SCRIPT> alert('이름을 입력해주세요'); history.go(-1); </SCRIPT>"; } else if(!$content) { echo " <SCRIPT> alert('내용을 입력해 주세요.'); history.go(-1); </SCRIPT>"; } else {
$connect = mysql_connect("localhost","php","php99") or die("DB Server에 접속할 수 없습니다."); mysql_select_db("sample",$connect);
$name = addslashes($name); $email = addslashes($email); $content = addslashes($content);
$query = "INSERT INTO guestbook (name,email,content) VALUES ('$name','$email','$content')"; $result = mysql_query($query,$connect);
echo " <BODY BGCOLOR=eeeeee> <SCRIPT> alert('자료가 성공적으로 등록 되었습니다.'); </SCRIPT> </HTML>"; echo ("<meta http-equiv='Refresh' content='0; URL=./list.html'>");
} ?>
5. 방명록 수정하기 - 등록일, 등록지의 IP 저장하기 table에 레코드 추가하기
$ mysql -u php -p sample mysql> ALTER TABLE guestbook ADD signdate INT (9) UNSIGNED DEFAULT '0' , ADD remote_addr VARCHAR (15);
목록보기 수정(list.html) <? $connect = mysql_connect("localhost","php","php99") or error("DB Server에 접속할 수 없습니다."); mysql_select_db("sample",$connect);
$pgsize = 10; // 한 페이지당 보여줄 게시물 수 $rcount = 0;
$query="SELECT count(*) FROM guestbook"; $result=mysql_query($query,$connect); $rows=mysql_fetch_row($result);
$totalpage = (int)($rows[0]/$pgsize)+1; $temppage = $rows[0]/$pgsize + 1;
// ==<< 게시물 갯수가 페이지당 게시물수와 나누어 떨어질때 >>== // if($temppage == $totalpage) $totalpage = $totalpage - 1;
// ==<< 넘어온 page값이 없으면 처음 페이지로 셋팅 >>== // if($page == "") $page=1;
// ==<< 넘어온 page값이 totalpage값보다 커지는것을 방지 >>== // if($page > $totalpage) $page=$totalpage;
$query = "SELECT * FROM guestbook ORDER BY num DESC"; $result = mysql_query($query,$connect);
for( $tt = 0 ; $tt < $pgsize * ($page-1) ; $tt++) { $row = mysql_fetch_array($result); // 공 루프 }
echo " <HTML> <HEAD> <TITLE>Guest Book 만들기</TITLE> </HEAD> <BODY BGCOLOR=eeeeee> <CENTER> <FONT SIZE=7 FACE='Comic Sans MS'>Guest Book</FONT><BR><BR> <TABLE BGCOLOR=eeeeee WIDTH=600> <TR> <TD ALIGN=LEFT WIDTH=50%><FONT SIZE=2>총 게시물 : $rows[0]</FONT></TD> <TD ALIGN=RIGHT WIDTH=50%><FONT SIZE=2>페이지 : $page/$totalpage</FONT></TD> </TR> </TABLE>";
while($row = mysql_fetch_array($result)) { $row[content]=eregi_replace("\n","<BR>",$row[content]); $row[content]=stripslashes($row[content]);
$signdate = date("Y년 m월 d일 H시 i분 s초",$row[signdate]);
if($rcount == $pgsize) break; echo " <TABLE WIDTH=600 CELLSPACING=1 BGCOLOR=black> <TR> <TD BGCOLOR=bbbbbb><FONT SIZE=2>작성자 : $row[name] ( "; if(!$row[email]) echo "<FONT COLOR=RED>E-Mail 없음</FONT>"; else echo "<A HREF=mailto:$row[email]>$row[email]</A>"; echo " ) <br> 등록일 : $signdate IP : $row[remote_addr]</TD> </TR> <TR> <TD BGCOLOR=eeeeee><FONT SIZE=2><BR>$row[content]<BR><BR></FONT></TD> </TR> </TABLE> <BR>"; $rcount++;
} echo "<FONT SIZE=2>"; $ppage=$page - 1; $npage=$page + 1;
if($page <= 1) echo "[ 이전 페이지 ]"; else echo "[ <A HREF='list.html?page=$ppage'>이전 페이지</A> ]"; echo "[ <A HREF='postform.html'>글쓰기</A> ]</A>"; if($page >= $totalpage) echo "[ 다음 페이지 ]"; else echo " [ <A HREF='list.html?page=$npage'>다음 페이지</A> ]";
mysql_close(); ?>
등록처리하기 수정(post.html) <? if(!$name) { echo " <SCRIPT> alert('이름을 입력해주세요'); history.go(-1); </SCRIPT>"; } else if(!$content) { echo " <SCRIPT> alert('내용을 입력해 주세요.'); history.go(-1); </SCRIPT>"; } else {
$connect = mysql_connect("localhost","php","php99") or die("DB Server에 접속할 수 없습니다."); mysql_select_db("sample",$connect);
$name = addslashes($name); $email = addslashes($email); $content = addslashes($content);
$signdate = time();
$query = "INSERT INTO guestbook (name,email,content,signdate,remote_addr) VALUES ('$name','$email','$content',$signdate, '$REMOTE_ADDR')"; $result = mysql_query($query,$connect);
echo " <BODY BGCOLOR=eeeeee> <SCRIPT> alert('자료가 성공적으로 등록 되었습니다.'); // location.href = 'list.html'; </SCRIPT> </HTML>"; echo ("<meta http-equiv='Refresh' content='0; URL=./list.html'>");
} ?>
6. 방명록 수정하기 - 페이지 나누기 목록보기(list.html) <? ########### 한 페이지당 출력할 게시물의 수 $num_per_page = 5;
########### 게시물 출력목록 하단에 링크를 걸 페이지의 개수 $page_per_block = 5;
########### 페이지 초기화 if(!$page) { $page = 1; }
########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; }
$query = "SELECT name,email,content,signdate,remote_addr FROM guestbook ORDER BY num DESC"; $result = mysql_query($query,$dbconn); if(!$result) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("에러코드 $errNO : $errMSG<br>"); exit; }
$total_record = mysql_num_rows($result);
########## 현재의 페이지에서 출력할 게시물의 범위를 결정한다. ########## if(!$total_record) { $first = 1; $last = 0; } else { $first = $num_per_page*($page-1); $last = $num_per_page*$page;
$IsNext = $total_record - $last; if($IsNext > 0) { $last -= 1; } else { $last = $total_record - 1; } }
########## 전체 페이지수를 계산한다. ########## $total_page = ceil($total_record/$num_per_page);
echo " <HTML> <HEAD> <TITLE>Guest Book 만들기</TITLE> </HEAD> <BODY BGCOLOR=eeeeee> <CENTER> <FONT SIZE=7 FACE='Comic Sans MS'>Guest Book</FONT><BR><BR> <TABLE BGCOLOR=eeeeee WIDTH=600> <TR> <TD ALIGN=LEFT WIDTH=50%><FONT SIZE=2>총 게시물 : $total_record</FONT></TD> <TD ALIGN=RIGHT WIDTH=50%><FONT SIZE=2>페이지 : $page/$total_page</FONT></TD> </TR> </TABLE>";
########## 게시물의 가상번호(게시물의 개수에 따른 일련번호) ########## $article_num = $total_record - $num_per_page*($page-1);
########## 테이블내 모든 레코드의 각 데이터 값을 각각의 변수에 저장하여 출력한다. ########## for($i = $first; $i <= $last; $i++) { $my_name = mysql_result($result,$i,0); $my_email = mysql_result($result,$i,1); $my_content = mysql_result($result,$i,2); $my_signdate = mysql_result($result,$i,3); $my_remote_addr = mysql_result($result,$i,4);
$my_content=eregi_replace("\n","<BR>",$my_content); $my_content=stripslashes($my_content);
$my_signdate = date("Y년 m월 d일 H시 i분 s초",$my_signdate);
echo " <TABLE WIDTH=600 CELLSPACING=1 BGCOLOR=black> <TR> <TD BGCOLOR=bbbbbb><FONT SIZE=2>$article_num 작성자 : $my_name ( "; if(!$my_email) echo "<FONT COLOR=RED>E-Mail 없음</FONT>"; else echo "<A HREF=mailto:$my_email>$my_email</A>"; echo " ) <br> 등록일 : $my_signdate IP : $my_remote_addr</TD> </TR> <TR> <TD BGCOLOR=eeeeee><FONT SIZE=2><BR>$my_content<BR><BR></FONT></TD> </TR> </TABLE> <BR>"; $article_num--;
} ?> <table width="600" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td colspan="6" align="center"> <? ########## 게시물 목록 하단의 각 페이지로 직접 이동할 수 있는 페이지링크에 대한 설정을 한다. $total_block = ceil($total_page/$page_per_block); $block = ceil($page/$page_per_block);
$first_page = ($block-1)*$page_per_block; $last_page = $block*$page_per_block;
if($total_block <= $block) { $last_page = $total_page; }
########## 이전페이지블록에 대한 페이지 링크 ########## if($block > 1) { $my_page = $first_page; echo("<font size=2><a href=\"$php_self?page=$my_page\" >[이전 ${page_per_block}개]</a></font>"); }
########## 현재의 페이지 블럭범위내에서 각 페이지로 바로 이동할 수 있는 하이퍼링크를 출력한다. for($direct_page = $first_page+1; $direct_page <= $last_page; $direct_page++) { if($page == $direct_page) { echo("<font size=2><b>[$direct_page]</b></font>"); } else { echo("<font size=2><a href=\"list.html?page=$direct_page\">[$direct_page]</a></font>"); } }
########## 다음페이지블록에 대한 페이지 링크 ########## if($block < $total_block) { $my_page = $last_page+1; echo("<font size=2><a href=\"list.html?page=$my_page\">[다음 ${page_per_block}개]</a></font>"); } ?> </td> </tr> </table>
<table width="600" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td align="left"> <a href="list.html">목록</a> </td> <td align="right"> <a href="postform.html">글쓰기</a> | <? ########## 이전페이지가 존재할 경우 이전페이지로 가는 링크를 활성화시킨다. if ($page > 1) { $page_num = $page - 1; echo("<a href=\"list.html?page=$page_num\">이전</a> | "); } else { echo("이전 | "); }
########## 게시물이 다음페이지에도 존재할 경우 다음페이지로 가는 링크를 활성화시킨다. if ($IsNext > 0) { $page_num = $page + 1; echo("<a href=\"list.html?page=$page_num\">다음</a></td>"); } else { echo("다음</td>"); } ?>
</tr> </table> <? mysql_close(); ?>
|
[목차] |