PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


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='확인'>&nbsp;&nbsp;

        <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
password : php99

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>&nbsp;&nbsp;&nbsp;&nbsp;등록일 : $signdate &nbsp;&nbsp;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 &nbsp;&nbsp;작성자 : $my_name ( ";

        if(!$my_email) echo "<FONT COLOR=RED>E-Mail 없음</FONT>";

        else echo "<A HREF=mailto:$my_email>$my_email</A>";

        echo " ) <br>&nbsp;&nbsp;&nbsp;&nbsp;등록일 : $my_signdate &nbsp;&nbsp;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();

?>

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.