13장 공지사항 한빛미디어(주)
학습 목표 공지사항 게시판의 동작 기능을 이해한다 공지사항의 게시판 DB 테이블과 리플 DB 테이블의 구조를 이해한다 관리자만이 글쓰기, 글 삭제, 글 수정을 할 수 있는 방법을 익힌다. 리플을 DB 테이블에 저장하는 방법을 익힌다 리플을 DB 테이블에서 삭제하는 방법을 익힌다 리플을 화면에 출력하는 방법을 익힌다
주요 학습 내용 01. 공지사항 파일목록 및 DB 테이블 02. 목록 보기 03. 글쓰기 04. 글 내용 보기 05. 글 수정 및 삭제 06. 리플 글 삽입 및 삭제
공지사항 주요 기능 01 ⑴ 관리자(아이디:"admin") 로그인 상태에서만 공지사항 글쓰기/수정/삭제 가능 ⑵ 관리자가 아닌 경우에는 화면에 글쓰기/수정/삭제 버튼 표시 안함 ⑶ 로그인된 회원들만이 공지사항 글에 리플 달기 가능 ⑷ 글 목록보기 화면의 제목에 리플 개수 표시
공지사항 미리 보기 02 글쓰기는 “admin” 아이디를 만들어서 로그인 해야 가능함.
공지사항 파일 목록 03 파일명 설명 notice_board.sql 공지사항 DB 테이블 생성 명령 notice_ripple.sql 리플 저장을 위한 DB 테이블 생성 명령 list.php 공지사항 목록 보기 insert.php 공지사항 글을 DB에 저장 insert_ripple.php 리플을 DB에 저장 delete.php 게시판 글을 DB에서 삭제 delete_ripple.php 리플을 DB에서 삭제 modify_form.php 공지사항 글 수정 양식 modify.php 공지사항 글을 DB에서 수정 search.php 특정 문자열로 검색된 게시판 글 목록 view.php 글 내용 보기 write_form.php 공지사항 글쓰기 양식 [표 13-1] 공지사항 게시판에 사용되는 파일 목록
공지사항 프로그램 설치 04 ⑴ 작업 폴더(“www" 폴더) 밑에 “notice" 폴더를 만들고 생성된 “notice" 폴더 밑에 교재 뒤 CD의 “www\notice" 폴더에 있는 파일들과 "img" 디렉토리를 통째로 복사한다. ⑵ 공지사항 DB 테이블은 두개 이다. - 게시판 DB 테이블 - 리플 DB 테이블
not null, auto_increment, 공지사항 게시판 DB 테이블 05 필드 이름 타입 추가 사항 필드 설명 num int not null, auto_increment, primary key 일렬 번호 id varchar(10) not null 아이디 name 이름 subject varchar(100) 제목 content text 글 내용 regist_day varchar(20) 글 쓴 날짜 hit 조회수 ip 접속 IP [표 13-2] 공지사항 게시판 DB 테이블 (테이블 명 : notice_board)
자유게시판 DB 테이블 만들기 06 메모장으로 다음을 타이핑한 다음 “c:\mysql\bin” 폴더 밑에 “notice_board.sql”이름으로 저장 CREATE TABLE notice_board ( num int not null auto_increment, id varchar(10) not null, name varchar(10) 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 < notice_board.sql
not null, auto_increment, 공지사항 리플 DB 테이블 07 필드 이름 타입 추가 사항 필드 설명 num int not null, auto_increment, primary key 일렬 번호 parent not null 리플의 부모 글 id varchar(10) 아이디 name varchar(20) 이름 content text 리플 내용 regist_day 리플 단 날짜 ip 접속 IP [표 13-3] 리플 DB 테이블 (테이블 명 : notice_ripple)
공지사항 리플 DB 테이블 만들기 08 메모장으로 다음을 타이핑한 다음 “c:\mysql\bin” 폴더 밑에 “notice_ripple.sql”이름으로 저장 CREATE TABLE notice_ripple ( num int not null auto_increment, parent int not null, id varchar(10) not null, name varchar(10) not null, content text not null, regist_day varchar(20), ip varchar(20), PRIMARY KEY (num) ); 명령 프롬프트에서 다음을 실행 C:\mysql\bin> mysql -uphp5 -p1234 php5_db < notice_ripple.sql
【예제 13-1】list.php 02 공지사항 목록 보기 59 : $start = ($page - 1) * $scale; 61 : $number = $total_record - $start; 63 : for ($i=$start; $i<$start+$scale && $i < $total_record; $i++) 64 : { 65 : mysql_data_seek($result, $i); // 가져올 레코드로 포인터 이동 66 : $row = mysql_fetch_array($result); // 하나의 레코드 가져오기 68 : $day = substr($row[regist_day], 0, 10); 69 : 70 : $sql = "select * from notice_ripple where parent = '$row[num]'"; 72 : $result2 = mysql_query($sql, $connect); 73 : $num_ripple = mysql_num_rows($result2); 75 : echo " <tr height=25> 77 : <td align=center>$number</td> 78 : <td><img src='img/record_id.gif' border=0> 79 : <a href='view.php?num=$row[num]&page=$page'>$row[subject] 80 : ";
【예제 13-1】list.php 02 81 : if ($num_ripple) echo " <font color=blue>[$num_ripple]</font>"; 82 : echo " 83 : </a></td> 84 : <td align=center>$day</td> 85 : <td align=center>$row[hit]</td> 86 : <td align=center>$row[name] </td> 87 : </tr> 88 : <tr bgcolor='#CCCCCC' height=1> 89 : <td colspan='5'></td> 90 : </tr> 91 : "; 92 : $number--; 93 : }
substr( ) 함수 09 <? $str1 = substr ("abcdef", 1); // "bcdef" 을 반환한다. string substr ( string string, int start [, int length]) <? $str1 = substr ("abcdef", 1); // "bcdef" 을 반환한다. $str2 = substr ("abcdef", 2, 3); // "cde" 을 반환한다. /* 만약 start가 음수라면, 반환되는 문자열은 string의 끝에서부터 start 번째 부터 시작하는 문자열이 된다. */ $str3 = substr ("abcdef", -1); // "f" 를 반환 $str4 = substr ("abcdef", -4); // "cdef" 를 반환 $str5 = substr ("abcdef", -3, 1); // "d" 를 반환 echo $str1." ".$str2." ".$str3." ".$str4." ".$str5."<br>"; ?>
【예제 13-2】write_form.php 02 글쓰기 폼 양식 1 : <? 2 : session_start(); 1 : <? 2 : session_start(); 4 : if ($userid != "admin") 5 : { echo(" 7 : <script> 8 : window.alert('관리자만 글을 쓸 수 있습니다.') 9 : history.go(-1) 10 : </script> 11 : "); exit; 13 : } 14 : else 15 : { 16 : ?> 17 : <html> 18 : <head>
【예제 13-2】write_form.php 02 39 : <table width='100%' border=0 cellspacing=0 cellpadding=0 class='txt'> 40 : <tr height=25> 41 : <td align=right width=100>이름 </td> 42 : <td align=left> : <? echo $username ?> </td> </tr> 44 : </table> </td> </tr> 47 : <tr height=1 bgcolor=#5AB2C8><td colspan=2></td></tr> 48 : <tr bgcolor='#D2EAF0' height=20> 49 : <td colspan=2> <b>하고 싶은 말을 남기세요.</b></td> </tr> 51 : <tr height=1 bgcolor=#5AB2C8><td colspan=5></td></tr> 52 : <tr><td colspan=2> 54 : <table width='100%' border=0 cellspacing=0 cellpadding=0 55 : <tr> <td height=25> 제목 57 : <input style='font-size:9pt;border:1px solid' type='text' 58 : name='subject' size=50 maxlength=100></td>
【예제 13-2】write_form.php 02 // 중간 생략 71 : <tr height=1 bgcolor=#5AB2C8><td></td></tr> 72 : <tr> 73 : <td height=30 align=center valign=top bgcolor='FFFFFF'><br> 75 : <input type=image src='img/i_write.gif' align=absmiddle border=0> 76 : <a href='list.php'><img style='cursor:hand' 77 : src='img/i_list.gif' align=absmiddle border=0 ></a></td> 78 : </tr></table> </td> </tr> 82 : </table> </td> <tr> 85 : </form> 86 : </table> 87 : </body> 88 : </html> 89 : 90 : <? 91 : } 92 : ?>
【예제 13-3】insert.php 02 글 쓴 내용 DB 저장 1 : <? 2 : session_start(); 1 : <? 2 : session_start(); // 중간 생략 24 : include "../dbconn.php"; // dconn.php 파일을 불러옴 26 : $regist_day = date("Y-m-d (H:i)"); // 현재의 날짜를 저장 27 : $ip = $REMOTE_ADDR; // 방문자의 IP 주소를 저장 28 : 29 : // 레코드 삽입 명령 30 : $sql = "insert into notice_board(id, name, subject, content, regist_day, hit, ip) "; 31 : $sql .= "values('$userid', '$username', '$subject', '$content', '$regist_day', 0, '$ip')"; 33 : mysql_query($sql, $connect); // $sql 에 저장된 명령 실행 35 : mysql_close(); // DB 연결 끊기 37 : Header("Location:list.php"); // list.php 로 이동 38 : ?>
【예제 13-4】view.php 02 글내용 보기 1 : <? 2 : session_start(); 3 : ?> 1 : <? 2 : session_start(); 3 : ?> 4 : <html> 5 : <head> 6 : <title>:: PHP 프로그래밍 입문에 오신 것을 환영합니다~~ :: </title> 7 : <link rel="stylesheet" href="../style.css" type="text/css"> 8 : </head> 9 : <body leftmargin="0" topmargin="0" marginwidth="0“ marginheight="0"> // 중간 생략 21 : <tr height=1 bgcolor=#5AB2C8><td></td></tr> 23 : <? 24 : include "../dbconn.php"; 26 : $sql = "select * from notice_board where num=$num"; 28 : $result = mysql_query($sql, $connect);
【예제 13-4】view.php 02 29 : $row = mysql_fetch_array($result); 30 : 30 : 31 : $day = substr($row[regist_day], 0, 10); 32 : 33 : $content = str_replace("\n", "<br>", $row[content]); 34 : $content = str_replace(" ", " ", $content); 35 : $subject = str_replace(" ", " ", $row[subject]); 36 : 37 : $hit = $row[hit]; 38 : $hit++; 39 : 40 : $sql = "update notice_board set hit=$hit where num=$num"; 41 : mysql_query($sql, $connect); 42 : ?> 44 : <tr bgcolor="#D2EAF0" height=35> 45 : <td> nbsp;<b><? echo $subject ?></td> </tr>
【예제 13-4】view.php 02 69 : <tr height=1 bgcolor=#5AB2C8><td></td></tr> 70 : <tr> <td> 72 : <? 73 : $sql = "select * from notice_ripple where parent=$num order by num desc"; 74 : $result = mysql_query($sql, $connect); 75 : $num_ripple = mysql_num_rows($result); 77 : if($num_ripple) 78 : { 79 : while ( $row = mysql_fetch_array($result) ) 80 : { 81 : $ripple_day = $row[regist_day]; 82 : $ripple_day = substr($ripple_day, 5, 5); 83 : 84 : $ripple_content = str_replace("\n", "<br>", $row[content]); 85 : $ripple_content = str_replace(" ", " ", $ripple_content); 86 : $ripple_ip = $row[ip];
【예제 13-4】view.php 02 87 : $ripple_num = $row[num]; 88 : $ripple_id = $row[id]; 89 : $ripple_name = $row[name]; 91 : echo " <table width=100% cellpadding=0> 93 : <tr height=20> 94 : <td width=10% align=center> $ripple_name </td> 95 : <td width=80%% align=left> $ripple_content</td> 96 : <td width=10% align=left> $ripple_day "; 98 : if ($userid == $ripple_id or $userid=="admin") 99 : { echo " <a href='delete_ripple.php?num=$num& ripple_num= $ripple_num'>D "; 103 : } 104 : echo " </td> </tr> <tr height=1 bgcolor=#5AB2C8> 108 : <td colspan=3></td> </tr> </table> "; 112 : } 113 : } 115 : mysql_close(); 116 : ?>
【예제 13-4】view.php 02 122 : <? 123 : echo " 122 : <? 123 : echo " 124 : <form method=post action='insert_ripple.php?num=$num'> 125 : <table align=center border=0 cellspacing=0 cellpadding=0 width=766> 126 : <tr><td colspan=2> 이름 : $username </td></tr> 127 : <tr height=5><td colspan=2> </td></tr> 128 : <tr><td><textarea style='font-size:9pt;border:1px solid‘ name='content' 129 : style=background-image:url('img/bbs_text_line.gif'); cols=110 rows=4 wrap=virtual></textarea></td> 131 : <td align=right><input type=image src='img/regist.gif'></td> 132 : </tr> </table> 136 : </form> 137 : "; 138 : ?>
【예제 13-4】view.php 02 145 : <td align=center> 146 : <? 146 : <? 147 : if ($userid == "admin") 148 : { echo " 150 : <a href='modify_form.php?num=$num&page=$page'> 151 : <img src='img/i_edit.gif' border=0> </a> 152 : <a href='delete.php?num=$num&page=$page'> 153 : <img src='img/i_del.gif' border=0> </a> 154 : "; 155 : } 156 : ?> 157 : <a href="list.php?page=<? echo $page ?>"> <img src='img/i_list.gif' border=0> 158 : </a></td> </tr> 160 : </table> 161 : </body> 162 : </html>
【예제 13-5】modify_form.php 02 글 수정 폼 양식 1 : <? 2 : session_start(); 1 : <? 2 : session_start(); 4 : if ($userid != "admin") 5 : { echo(" 7 : <script> 8 : window.alert('관리자만 수정할 수 있습니다.') 9 : history.go(-1) 10 : </script> 11 : "); exit; 13 : } 14 : else 15 : { 17 : include "../dbconn.php"; 18 : $sql = "select * from notice_board where num=$num"; 19 : $result = mysql_query($sql, $connect);
【예제 13-5】modify_form.php 02 21 : $row = mysql_fetch_array($result); 23 : $subject = $row[subject]; 24 : $content = $row[content]; 25 : ?> 26 : <html> 27 : <head> 28 : <title>:: PHP 프로그래밍 입문에 오신 것을 환영합니다~~ ::</title> 29 : <link rel='stylesheet' href='../style.css' type='text/css'> 30 : </head> 31 : <body leftmargin='0' topmargin='0' marginwidth='0‘ marginheight='0'> 32 : 33 : <table border=0 cellspacing=0 cellpdding=0 width='776‘ align='center'> 34 : <form name='writeform‘ action='modify.php?num=<? echo $num ?> 35 : &page=<? echo $page ?>‘ method='post'>
【예제 13-5】modify_form.php 02 54 : <tr height=25> 55 : <td align=right width=100>이름 </td> 56 : <td align=left> : <? echo $username ?> </td></tr></table> 59 : </td> 60 : </tr> 61 : <tr height=1 bgcolor=#5AB2C8><td colspan=2></td></tr> 62 : <tr bgcolor='#D2EAF0' height=20> 63 : <td colspan=2> <b>하고 싶은 말을 남기세요.</b> </td></tr> 65 : <tr height=1 bgcolor=#5AB2C8><td colspan=5></td></tr> 69 : <tr> 70 : <td height=25> 제목 71 : <input style='font-size:9pt;border:1px solid' type='text' 72 : name='subject' size=50 maxlength=100 73 : value='<? echo $subject ?>'></td> 74 : </tr> // 이하 생략
【예제 13-6】modify.php 02 글 수정 DB 업데이트 1 : <? 2 : session_start(); 1 : <? 2 : session_start(); 4 : if ($userid=="admin") 5 : { // 중간 생략 26 : include "../dbconn.php"; 28 : $regist_day = date("Y-m-d (H:i)"); // 현재의 날짜 저장 29 : $ip = $REMOTE_ADDR; // 방문자의 IP 주소를 저장 31 : 32 : $sql = "update notice_board set subject='$subject', "; 33 : $sql .= "content='$content' where num=$num"; 35 : mysql_query($sql, $connect); 36 : mysql_close(); 37 : } 39 : Header("Location:list.php?num=$num&page=$page"); 40 : ?>
【예제 13-7】delete.php 02 글 삭제 1 : <? 2 : session_start(); 3 : 1 : <? 2 : session_start(); 3 : 4 : if ($userid == "admin") 5 : { 6 : include "../dbconn.php"; 7 : 8 : $sql = "delete from notice_board where num = $num"; 9 : mysql_query($sql, $connect); 10 : mysql_close(); 11 : } 12 : 13 : Header("Location:list.php?page=$page"); 14 : ?> 세션변수
【예제 13-8】insert_ripple.php 02 리플 글 삽입 1 : <? 2 : session_start(); 4 : if(!$userid) { 5 : echo(" 6 : <script> 7 : window.alert('회원가입 후 이용하세요.') 8 : history.go(-1) 9 : </script> 10 : "); 11 : exit; 12 : } 13 : 24 : include "../dbconn.php"; 26 : $id = $userid; 27 : $name = $username; 세션변수
【예제 13-8】insert_ripple.php 02 29 : $regist_day = date("Y-m-d (H:i)"); // 현재의 날짜 저장 30 : $ip = $REMOTE_ADDR; // 방문자의 IP 주소를 저장 31 : 32 : // 레코드 삽입 명령 33 : $sql = "insert into notice_ripple(parent, id, name, content, regist_day, ip) "; 34 : $sql .= "values('$num', '$id', '$name', '$content', '$regist_day', '$ip')"; 35 : 36 : mysql_query($sql, $connect); // $sql 에 저장된 명령 실행 37 : 38 : mysql_close(); // DB 연결 끊기 39 : 40 : Header("Location:view.php?num=$num"); // view.php 로 이동 41 : ?>
【예제 13-9】delete_ripple.php 02 리플 글 삭제 1 : <? 2 : include "../dbconn.php"; 3 : 4 : $sql = "delete from notice_ripple where num = $ripple_num"; 5 : mysql_query($sql, $connect); 6 : Header("Location:view.php?num=$num"); 7 : mysql_close(); 8 : ?>