12장 자유게시판 한빛미디어(주)
학습 목표 자유게시판 동작 기능을 이해한다 자유게시판 DB 테이블을 생성하는 법을 익힌다. 자유게시판 목록 보기/검색 소스를 이해한다. 자유게시판 글을 DB 테이블에 저장 방법을 익힌다. 자유게시판의 글 내용 소스를 이해한다. 글 수정 방법을 익힌다 글 내용을 삭제하는 방법을 익힌다
주요 학습 내용 01. 파일목록 및 DB 테이블 02. 목록 보기 및 검색 03. 글쓰기 04. 글 내용 보기 05. 글 수정 및 삭제
자유게시판 기능 01 ⑴ 로그인 여부와 상관없는 글 쓰기 ⑵ 글 내용 수정 및 삭제 시 비밀번호 확인 ⑶ 관리자 로그인 시 모든 글의 수정 및 삭제 가능 ⑷ 제목, 글내용, 글쓴이를 키워드로 하는 문자열 검색 ⑸ 목록보기 아래에 링크 페이지 번호 표시
자유게시판 미리 보기 02
자유게시판 파일 목록 03 파일명 설명 freeboard.sql 자유게시판 DB 테이블 생성 명령 list.php 게시판 목록 보기 insert.php 게시판 글을 DB에 저장 passwd_form.php 글 삭제 시 사용되는 비밀번호 확인 양식 delete.php 게시판 글을 DB에서 삭제 modify_form.php 게시판 글 수정 양식 modify.php 게시판 글을 DB에서 수정 search.php 특정 문자열로 검색된 게시판 글 목록 view.php 글 내용 보기 write_form.php 게시판 글쓰기 양식 [표 12-1] 자유게시판에 사용되는 파일 목록
자유게시판 프로그램 설치 04 ⑴ 작업 폴더(“www" 폴더) 밑에 “freeboard" 폴더를 만들고 생성된 “freeboard" 폴더 밑에 교재 뒤 CD의 “www\freeboard" 폴더에 있는 파일들과 "img" 디렉토리를 통째로 복사한다. ⑵ 자유게시판 DB 테이블을 생성한다.
not null, auto_increment, 자유게시판 DB 테이블 05 필드 이름 타입 추가 사항 필드 설명 num int not null, auto_increment, primary key 일렬 번호 name varchar(20) not null 이름 passwd 비밀 번호 subject varchar(100) 제목 content text 글 내용 regist_day 글 쓴 날짜 hit 조회수 ip 접속 IP [표 12-2] 자유게시판 DB 테이블 (테이블 명 : freeboard)
자유게시판 DB 테이블 만들기 06 메모장으로 다음을 타이핑한 다음 “c:\mysql\bin” 폴더 밑에 “freeboard.sql”이름으로 저장 CREATE TABLE freeboard ( num int not null auto_increment, name varchar(20) not null, passwd varchar(20) not null, subject varchar(100) not null, content text not null, regist_day varchar(20), hit int, ip varchar(20), PRIMARY KEY (num) ); 명령 프롬프트에서 다음을 실행 C:\mysql\bin> mysql -uphp5 -p1234 php5_db < freeboard.sql
【예제 12-1】list.php 02 자유게시판 목록 보기 1 : <? 2 : $scale = 5; // 한 화면에 표시되는 글 수 4 : include "../dbconn.php"; 6 : $sql = "select * from freeboard order by num desc"; 7 : $result = mysql_query($sql, $connect); 8 : ?> 9 : <html> 10 : <META http-equiv="Content-Type" content="text/html; charset=Korean"> 11 : <head> 12 : <title> :: PHP 프로그래밍 입문에 오신 것을 환영합니다~~ :: </title> 13 : <link rel="stylesheet" href="../style.css" type="text/css"> 14 : </head> 15 : <body leftmargin="0" topmargin="0" marginwidth="0“ marginheight="0">
【예제 12-1】list.php 02 24 : <? $total_record = mysql_num_rows($result); // 전체 글 수 ?> 25 : <tr> 26 : <td align="right" colspan="5" height=20>전체 27 : <? echo $total_record; ?>건 28 : </td></tr> 29 : <tr> <td> 32 : <table border=0 cellspacing=0 cellpdding=0 width='100%‘ class="txt"> 33 : <tr bgcolor="#5AB2C8"> 34 : <td colspan="5" height=1></td></tr> 36 : <tr bgcolor="#D2EAF0" height=25> 37 : <td width="50" align="center"><strong>번호</strong></td> 38 : <td width="450" align=center><strong>제목</strong></td> 39 : <td width="76" align=center><strong>글쓴이</strong></td> 40 : <td width="145" align=center><strong>작성일</strong></td> 41 : <td width="55" align=center><strong>조회</strong></td></tr>
【예제 12-1】list.php 02 47 : <? 48 : // 전체 페이지 수($total_page) 계산 47 : <? 48 : // 전체 페이지 수($total_page) 계산 49 : if ($total_record % $scale == 0) 50 : $total_page = floor($total_record/$scale); 51 : else 52 : $total_page = floor($total_record/$scale) + 1; 53 : 54 : if (!$page) // 페이지번호($page)가 0 일 때 55 : $page = 1; // 페이지 번호를 1로 초기화 57 : // 표시할 페이지($page)에 따라 $start 계산 58 : $start = ($page - 1) * $scale; 60 : $number = $total_record - $start; 62 : for ($i=$start; $i<$start+$scale && $i < $total_record; $i++) 63 : { // 가져올 레코드로 위치(포인터) 이동 64 : mysql_data_seek($result, $i); 65 : // 하나의 레코드 가져오기 66 : $row = mysql_fetch_array($result);
【예제 12-1】list.php 02 69 : $day = $row[regist_day]; 71 : // 레코드 화면에 출력하기 72 : echo " <tr height=25> 74 : <td align=center>$number</td> 75 : <td><img src='img/record_id.gif' border=0> 76 : <a href='view.php?num=$row[num]&page=$page'> 77 : $row[subject] </a></td> 78 : <td align=center>$row[name] </td> 79 : <td align=center>$day</td> 80 : <td align=center>$row[hit]</td> 81 : </tr> 82 : <tr bgcolor='#CCCCCC' height=1> 83 : <td colspan='5'></td></tr> "; 86 : $number--; 87 : } 88 : ?>
【예제 12-1】list.php 02 126 : <form name=searchForm method=post action="search.php"> 127 : <tr> 128 : <td> 129 : <select name="find" class="txt"> 130 : <option value="subject">제목에서</option> 131 : <option value="content">본문에서</option> 132 : <option value="name">글쓴이에서</option> 133 : </select> 134 : 135 : <input type="text" name="search" size=10> 136 : <input type="image" src="img/i_search.gif" 137 : align=absmiddle border=0> 138 : </td> 139 : 140 : <td align=right>
【예제 12-1】list.php 02 141 : <a href="write_form.php"> 142 : <img src="img/i_write.gif" align=absmiddle border=0></a> 143 : <a href="list.php"><img src="img/i_list.gif" border=0></a> 144 : </td> 145 : </tr> 146 : <tr height=5> 147 : <td></td> 148 : </tr> 149 : <tr bgcolor="#5AB2C8" height=1> 150 : <td colspan=2></td> 151 : </tr> 152 : </form> 153 : </table> 154 : <!-- 검색하기 끝 --> 155 : </body> 156 : </html>
【예제 12-2】search.php 02 검색하기 1 : <? 2 : $scale = 5; // 한 화면에 표시되는 글 수 3 : 4 : include "../dbconn.php"; 5 : 6 : // $find : subject, name, content 중 하나의 값을 가짐 7 : // $search : 입력된 문자열 8 : $sql = "select * from freeboard where $find like '%$search%' 9 : order by num desc"; 10 : $result = mysql_query($sql, $connect); 11 : ?> 위 소스를 제외하면 list.php 와 동일
【예제 12-3】write_form.php 02 글쓰기 폼 양식 1 : <html> 2 : <head> 3 : <title>:: PHP 프로그래밍 입문에 오신 것을 환영합니다~~ ::</title> 4 : <link rel="stylesheet" href="../style.css" type="text/css"> 5 : </head> 6 : <body leftmargin="0" topmargin="0" marginwidth="0" 7 : marginheight="0"> 9 : <table width=776 align=center border=0 cellspacing=0 10 : cellpadding=0> 11 : <form name="writeform" action="insert.php" method="post"> 12 : <tr><td colspan="6" height=25> 13 : <img src="img/freeboard_title.gif"> </td></tr> 15 : <tr><td background="img/bbs_bg.gif"> 16 : <img border="0" src="img/blank.gif" 17 : width="1" height="3"></td></tr>
【예제 12-3】write_form.php 02 32 : <table width="100%" border=0 cellspacing=0 cellpadding=0 33 : class="txt"> 34 : <tr height=25> 35 : <td align=right width=100>이름 </td> 36 : <td align=left> 37 : <input style='font-size:9pt;border:1px solid' 38 : type=text name="name" 39 : size=25 maxlength=16></td> </tr> 42 : <tr height=25> 43 : <td align=right>비밀번호 </td> 44 : <td align=left> 45 : <input style='font-size:9pt;border:1px solid' 46 : type="password" name="passwd" size=25 47 : maxlength=16> 48 : </td></tr> 51 : </table>
【예제 12-3】write_form.php 02 62 : <table width="100%" border=0 cellspacing=0 cellpadding=0 63 : class="txt"> 64 : <tr> 65 : <td height=25> 제목 66 : <input style='font-size:9pt;border:1px solid' 67 : type='text‘ name="subject" size=50 maxlength=100> 68 : </td> 69 : </tr> 71 : <tr valign=top> 72 : <td align="center" > 73 : <p align="left"> 내용 74 : <textarea style='font-size:9pt;border:1px solid' 75 : name="content" style=background-image:url 76 : ('img/bbs_text_line.gif'); 77 : cols=74 rows=14 wrap=virtual></textarea> 78 : </td> </tr>
【예제 12-3】write_form.php 02 80 : <tr height=20> 81 : <td></td> </tr> 83 : <tr height=1 bgcolor=#5AB2C8><td></td></tr> 84 : <tr><td height=30 align=center valign=top bgcolor="FFFFFF"> 86 : <br> 88 : <input type=image src="img/i_write.gif" align=absmiddle 89 : border=0> <a href='list.php'> 90 : <img style='cursor:hand‘ src="img/i_list.gif" 91 : align=absmiddle border=0 ></a></td> 93 : </tr> </table> 95 : </td> 96 : </tr> 97 : </table> 98 : </td> </tr> 100 : </form> 101 : </table> 102 : </body> </html>
【예제 12-4】insert.php 02 작성 글 DB 저장 1 : <? 1 : <? 2 : /* 이전화면에서 이름이 입력되지 않았으면 3 : "이름을 입력하세요" 메시지 출력*/ 4 : if(!$name) { 5 : echo(" <script> window.alert('이름을 입력하세요.') 8 : history.go(-1) 9 : </script> "); 11 : exit; 12 : } 13 : 14 : if(!$passwd) { 15 : echo(" <script> window.alert('비밀번호를 입력하세요.') 18 : history.go(-1) 19 : </script> "); 21 : exit; 22 : }
【예제 12-4】insert.php 02 44 : include "../dbconn.php"; // dconn.php 파일을 불러옴 46 : $regist_day = date("Y-m-d (H:i)"); 47 : // 현재의 '년-월-일-시-분'을 저장 48 : $ip = $REMOTE_ADDR; // 방문자의 IP 주소를 저장 50 : 51 : $sql = "insert into freeboard(name, passwd, subject, 52 : content, regist_day, hit, ip) "; 53 : $sql .= "values('$name', '$passwd', '$subject', '$content', 54 : '$regist_day', 0, '$ip')"; 56 : 57 : mysql_query($sql, $connect); // $sql 에 저장된 명령 실행 58 : 59 : mysql_close(); // DB 연결 끊기 60 : 61 : Header("Location:list.php"); // list.php 로 이동합니다. 62 : ?>
【예제 12-5】view.php 02 작성 글 DB 저장 1 : <? 2 : session_start(); 1 : <? 2 : session_start(); 3 : ?> 5 : <html> 6 : <head> 7 : <title>:: PHP 프로그래밍 입문에 오신 것을 환영합니다. :: </title> 8 : <link rel="stylesheet" href="../style.css" type="text/css"> 9 : </head> 10 : <body leftmargin="0" topmargin="0" marginwidth="0“ marginheight="0"> 12 : <table width=776 border=0 cellspacing=0 cellpadding=0 align=center> 14 : <tr><td colspan="6" height=25> 15 : <img src="img/freeboard_title.gif"></td></tr> 16 : <tr><td background="img/bbs_bg.gif">
【예제 12-5】view.php 02 17 : <img border="0" src="img/blank.gif" 18 : width="1" height="3"></td></tr> 19 : <tr><td height=10></td></tr> 21 : <tr><td height=10></td></tr> 24 : <tr height=1 bgcolor=#5AB2C8><td></td> </tr> 27 : <? 28 : include "../dbconn.php"; 29 : 30 : $sql = "select * from freeboard where num=$num"; 31 : $result = mysql_query($sql, $connect); 32 : $row = mysql_fetch_array($result); 33 : 34 : $content = str_replace("\n", "<br>", $row[content]); 35 : $content = str_replace(" ", " ", $content); 36 : $subject = str_replace(" ", " ", $row[subject]); 37 : ?>
【예제 12-5】view.php 02 39 : <tr bgcolor="#D2EAF0" height=30> 40 : <td> <b><? echo $subject ?></td> </tr> 42 : <tr height=1 bgcolor=#5AB2C8> 43 : <td></td> </tr> 45 : <tr> <td> 47 : <table width=100% border=0 cellspacing=10 cellpadding=0 class=txt> 48 : <tr> 49 : <td><b>글쓴이 : <? echo $row[name] ?></b> 50 : <? echo $row[regist_day] ?> </td> 52 : <tr height=1 bgcolor=#5AB2C8> <td></td></tr> 53 : <tr> <td><br> <? echo $content ?></td> </tr> 56 : </table> </td> </tr> 59 : <tr height=20> 60 : <td align=right> <font size=-2>IP : 61 : <? echo $row[ip]; ?></font></td> </tr>
【예제 12-5】view.php 02 75 : <? 76 : if ($userid == "admin") 77 : { 75 : <? 76 : if ($userid == "admin") 77 : { 78 : echo " 79 : <tr> 80 : <td align=center> 81 : <a href='modify_form.php?num=$num&page=$page'> 82 : <img src='img/i_edit.gif' border=0> </a> 83 : <a href='delete.php?num=$num&page=$page'> 84 : <img src='img/i_del.gif' border=0> </a> 85 : <a href='list.php?page=$page'> 86 : <img src='img/i_list.gif' border=0></a> 87 : </td> 88 : </tr> 89 : "; 90 : }
【예제 12-5】view.php 02 91 : else 92 : { 93 : echo " 92 : { 93 : echo " 94 : <tr><td align=center> 96 : <a href='passwd_form.php?case=modify&num=$num&page=$page'> 97 : <img src='img/i_edit.gif' border=0> </a> 98 : <a href='passwd_form.php?case=delete&num=$num&page=$page'> 99 : <img src='img/i_del.gif' border=0> </a> 100 : <a href='list.php?page=$page'> 101 : <img src='img/i_list.gif' border=0></a> 102 : </td> 103 : </tr> 104 : "; 105 : } 106 : ?>
【예제 12-5】view.php 02 108 : </td> 109 : </table> 110 : </body> 111 : </html> 112 : <? 113 : $hit = $row[hit]; 114 : 115 : $hit++; 116 : 117 : $sql = "update freeboard set hit=$hit where num=$row[num]"; 118 : mysql_query($sql, $connect); 119 : mysql_close(); 120 : ?>
【예제 12-6】passwd_form.php 02 자유게시판 글 수정/삭제를 위한 비밀번호 확인 35 : <? 35 : <? 36 : if ($case == "modify") 37 : { 38 : echo "<form name=pwform method=post 39 : action='modify_form.php?num=$num&page=$page'>"; 40 : } 41 : else 42 : { 43 : echo "<form name=pwform method=post 44 : action='delete.php?num=$num&page=$page'>"; 45 : } 46 : ?> 나머지는 방명록의 passwd_form.php 와 동일
【예제 12-7】modify_form.php 02 글 내용 수정 양식 1 : <? 2 : session_start(); 1 : <? 2 : session_start(); 4 : include "../dbconn.php"; 5 : $sql = "select * from freeboard where num=$num"; 7 : $result = mysql_query($sql, $connect); 8 : $row = mysql_fetch_array($result); 9 : 10 : if ($passwd != $row[passwd] and $userid != "admin") 11 : { echo " 13 : <script> 14 : alert('비밀번호가 틀립니다.') 15 : history.go(-1) 16 : </script> "; 18 : exit; } 20 : ?>
【예제 12-7】modify_form.php 02 34 : <form name="modifyform" 35 : action="modify.php?num=<? echo $num; ?>& 36 : page=<? echo $page; ?>" method="post"> <tr> 38 : <td align=center colspan=2> 39 : <table width=776 border=0 cellspacing=0 cellpadding=0 40 : class="txt" bgcolor=#F7F7F2> 41 : <tr height=1 bgcolor=#5AB2C8><td></td></tr> 42 : <tr bgcolor="#D2EAF0" height=20> 43 : <td width="100%"> 44 : <b>이름, 전자우편주소, 비밀번호</b></td> </tr> 46 : <tr height=1 bgcolor=#5AB2C8><td></td></tr> 47 : <tr> <td> 49 : <table width="100%" border=0 cellspacing=0 cellpadding=0 50 : class="txt"> 51 : <tr height=25> 52 : <td align=right width=100>이름 </td>
【예제 12-7】modify_form.php 02 53 : <td align=left> 54 : <input style='font-size:9pt;border:1px solid' type=text 55 : name="name" value="<? echo $row[name] ?>" 56 : size=25 maxlength=16></td> </tr> 59 : <tr height=25> 60 : <td align=right>비밀번호 </td> 61 : <td align=left><input style='font-size:9pt;border:1px solid' 62 : type="password" name="passwd" 63 : value="<? echo $row[passwd]; ?>" size=25 maxlength=16> 64 : </td> </tr> 67 : </table> 68 : </td> </tr> 70 : <tr height=1 bgcolor=#5AB2C8><td colspan=2></td></tr> 71 : <tr bgcolor="#D2EAF0" height=20> 72 : <td colspan=2> <b>하고 싶은 말을 남기세요. </b></td> </tr>
【예제 12-7】modify_form.php 02 74 : <tr height=1 bgcolor=#5AB2C8><td colspan=5></td></tr> 75 : <tr><td colspan=2> 77 : <table width="100%" border=0 cellspacing=0 78 : cellpadding=0 class="txt"> 79 : <tr><td height=25> 제목 81 : <input style='font-size:9pt;border:1px solid' 82 : type='text' name="subject" 83 : value="<? echo $row[subject]; ?>" 84 : size=50 maxlength=100></td> </tr> 86 : <tr><td height=2> </td> </tr> 88 : <tr valign=top> 89 : <td> 내용 90 : <textarea style='font-size:9pt;border:1px solid' 91 : name="content" style=background-image:url 92 : ('img/bbs_text_line.gif'); 93 : cols=74 rows=14 wrap=virtual> 94 : <? echo $row[content] ?> </textarea></td> </tr>
【예제 12-7】modify_form.php 02 97 : <tr height=20> <td></td> </tr> 100 : <tr height=1 bgcolor=#5AB2C8><td colspan=5></td></tr> 101 : <tr><td height=30 align=center valign=top bgcolor="FFFFFF"> 105 : <input type=image src="img/i_write.gif" 106 : align=absmiddle border=0> 107 : <a href='list.php?page=<? echo $page ?>'> 108 : <img style='cursor:hand‘ src="img/i_list.gif" 109 : align=absmiddle border=0 ></a></td> </tr> 112 : </table> 113 : </td></tr> 115 : </table> 116 : </td> </tr> 118 : </form> 119 : </table> 120 : </body> 121 : </html>
【예제 12-8】modify.php 02 글 내용 수정하기 1 : <? 1 : <? 2 : // 이전화면에서 이름이 입력되지 않았으면 "이름을 입력하세요" 4 : if(!$name) { echo(" 6 : <script> 7 : window.alert('이름을 입력하세요.') 8 : history.go(-1) 9 : </script> "); exit; 12 : } 13 : 14 : if(!$passwd) { echo(" 16 : <script> 17 : window.alert('비밀번호를 입력하세요.') 18 : history.go(-1) 19 : </script> "); exit; 22 : }
【예제 12-8】modify.php 02 44 : include "../dbconn.php"; 46 : $regist_day = date("Y-m-d (H:i)"); // 현재의 날짜 저장 47 : $ip = $REMOTE_ADDR; // 방문자의 IP 주소를 저장 49 : 50 : $sql = "update freeboard set name='$name', subject='$subject', "; 51 : $sql .= "content='$content', passwd='$passwd' where num=$num"; 52 : 53 : mysql_query($sql, $connect); 54 : mysql_close(); 55 : // list.php 로 이동 56 : Header("Location:list.php?num=$num&page=$page"); 57 : ?>
【예제 12-9】delete.php 02 글 삭제하기 1 : <? 2 : session_start(); 1 : <? 2 : session_start(); 4 : include "../dbconn.php"; 5 : 6 : $sql = "select passwd from freeboard where num=$num"; 7 : $result = mysql_query($sql, $connect); 8 : $row = mysql_fetch_array($result); // 해당 레코드 가져옴 10 : // $passwd : 사용자가 passwd_form.php 화면에서 입력한 값 11 : // $row[passwd] : DB에 들어있는 값 12 : if ($passwd != $row[passwd] and $userid != "admin") 13 : // 관리자가 아니고 비밀번호가 틀리면 14 : { 15 : echo(" 16 : <script> 17 : window.alert('비밀번호가 틀립니다.')
【예제 12-9】delete.php 02 18 : history.go(-1) 19 : </script> 20 : "); 21 : exit; 22 : } 23 : else 24 : { 25 : $sql = "delete from freeboard where num = $num"; 26 : mysql_query($sql, $connect); 27 : mysql_close(); 28 : Header("Location:list.php?page=$page"); 29 : } 30 : ?>