14장 질의응답 한빛미디어(주)
학습 목표 질의응답 게시판의 동작 기능을 이해한다 질의응답 게시판의 DB 테이블 구조를 이해한다 답변글 처리 방법에 대하여 이해한다 답변글을 목록에 출력하는 방법을 익힌다 답변글 폼 양식의 사용법을 익힌다 답변글을 DB 테이블에 저장하는 법을 익힌다
주요 학습 내용 01. 질의 응답 파일목록 및 DB 테이블 02. 답변글 처리 방법 03. 목록 보기 04. 글쓰기 05. 글내용 보기
질의응답 미리 보기 01 공지사항 게시판에다 답변달기 기능 추가
질의응답 파일 목록 02 파일명 설명 qna_board.sql 질의응답 DB 테이블 생성 명령 qna_ripple.sql 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 질의응답 글쓰기 양식 [표 14-1] 질의응답 게시판에 사용되는 파일 목록
질의 응답 프로그램 설치 03 ⑴ 작업 폴더(“www" 폴더) 밑에 “qna" 폴더를 만들고 생성된 “qna" 폴더 밑에 교재 뒤 CD의 “www\qna" 폴더에 있는 파일들과 "img" 디렉토리를 통째로 복사한다. ⑵ 질의응답 DB 테이블은 두개 이다. - 게시판 DB 테이블 - 리플 DB 테이블
not null, auto_increment, 질의 응답 게시판 DB 테이블 04 필드 이름 타입 추가 사항 필드 설명 num int not null, auto_increment, primary key 일렬 번호 group_num not null 그룹 번호 ord 답변 글 순서 depth 답변 글 깊이 id varchar(10) 아이디 name 이름 subject varchar(100) 제목 content text 글 내용 regist_day varchar(20) 글 쓴 날짜 hit 조회수 ip 접속 IP [표 14-2] 질의응답의 게시판 DB 테이블 (테이블 명 : qna_board)
질의응답 게시판 DB 테이블 만들기 05 메모장으로 다음을 타이핑한 다음 “c:\mysql\bin” 폴더 밑에 “qna_board.sql”이름으로 저장 CREATE TABLE qna_board ( num int not null auto_increment, group_num int not null, ord int not null, depth int not null, 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 < qna_board.sql
not null, auto_increment, 질의응답 리플 DB 테이블 06 필드 이름 타입 추가 사항 필드 설명 num int not null, auto_increment, primary key 일렬 번호 parent not null 리플의 부모 글 id varchar(10) 아이디 name varchar(20) 이름 content text 리플 내용 regist_day 리플 단 날짜 ip 접속 IP [표 14-3] 질의응답의 리플 DB 테이블 (테이블 명 : qna_ripple)
질의응답 리플 DB 테이블 만들기 07 메모장으로 다음을 타이핑한 다음 “c:\mysql\bin” 폴더 밑에 “qna_ripple.sql”이름으로 저장 CREATE TABLE qna_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 < qna_ripple.sql
[그림 14-2] qna_board 테이블의 group_num, depth, ord 필드 값 답변글 삽입 전 08 [그림 14-2] qna_board 테이블의 group_num, depth, ord 필드 값
[그림 14-3] “답변글 1-2-3“에 새로운 답변글 삽입 답변글 삽입 후 09 [그림 14-3] “답변글 1-2-3“에 새로운 답변글 삽입
【예제 14-1】list.php 02 질의응답 목록 보기 1 : <? 2 : session_start(); 3 : 1 : <? 2 : session_start(); 3 : 4 : $scale = 5; // 한 화면에 표시되는 글 수 5 : 6 : include "../dbconn.php"; 7 : $sql = "select * from qna_board order by group_num desc, ord asc"; 8 : $result = mysql_query($sql, $connect); 9 : ?>
【예제 14-1】list.php 02 73 : $space = ""; 74 : 74 : 75 : for ($j=0; $j<$row[depth]; $j++) 76 : $space = " ".$space; 77 : 78 : // 레코드 화면에 출력하기 79 : echo " 80 : <tr height=25> 81 : <td align=center>$number</td> 82 : <td> $space 83 : "; 84 : if ($row[depth]>0) 85 : echo "<img src='img/reply_head.gif' border=0>"; 86 : else 87 : echo "<img src='img/record_id.gif' border=0>";
【예제 14-2】write_form.php 02 글쓰기 폼 양식 59 : <? 60 : if ($num) 61 : { 59 : <? 60 : if ($num) 61 : { 62 : include "../dbconn.php"; 64 : $sql = "select * from qna_board where num = $num"; 65 : $result = mysql_query($sql, $connect); 67 : $row = mysql_fetch_array($result); 68 : 69 : $subject = "[re]".$row[subject]; 70 : $content = ">".$row[content]; 71 : $content = str_replace("\n", "\n>", $content); 72 : $content = "\n\n".$content; 73 : 74 : mysql_close(); 75 : } 76 : ?>
【예제 14-3】insert.php 02 글쓴 내용의 DB 저장 39 : if (!$num) // $num 이 0 이면 원글, 1이면 답변 글 40 : { 41 : $depth = 0; // depth, ord 를 0으로 초기화 42 : $ord = 0; 44 : // 레코드 삽입(group_num 제외) 45 : $sql = "insert into qna_board(depth, ord, id, name, subject,"; 46 : $sql .= "content, regist_day, hit, ip) "; 47 : $sql .= "values($depth, $ord, '$userid', '$username', '$subject',"; 48 : $sql .= "'$content', '$regist_day', 0, '$ip')"; 49 : mysql_query($sql, $connect); // $sql 에 저장된 명령 실행 51 : // 최근 auto_increment 필드(num) 값 가져오기 52 : $sql = "select last_insert_id()"; 53 : $result = mysql_query($sql, $connect); 54 : $row = mysql_fetch_array($result); 55 : $auto_num = $row[0];
【예제 14-3】insert.php 02 57 : // group_num 값 업데이트 58 : $sql = "update qna_board set group_num = $auto_num where num=$auto_num"; 59 : mysql_query($sql, $connect); 60 : } 61 : else 62 : { 63 : // 부모 글 가져오기 64 : $sql = "select * from qna_board where num = $num"; 65 : $result = mysql_query($sql, $connect); 66 : $row = mysql_fetch_array($result); 67 : 68 : // 부모 글로 부터 group_num, depth, ord 값 설정 69 : $group_num = $row[group_num]; 70 : $depth = $row[depth] + 1; 71 : $ord = $row[ord] + 1;
【예제 14-3】insert.php 02 75 : $sql = "update qna_board set ord = ord + 1 where group_num = $row[group_num] 76 : and ord > $row[ord]"; 77 : mysql_query($sql, $connect); 79 : // 레코드 삽입 80 : $sql = "insert into qna_board(group_num, depth, ord, id, name, subject,"; 81 : $sql .= "content, regist_day, hit, ip) "; 82 : $sql .= "values($group_num, $depth, $ord, '$userid', '$username', '$subject',"; 83 : $sql .= "'$content', '$regist_day', 0, '$ip')"; 85 : mysql_query($sql, $connect); // $sql 에 저장된 명령 실행 87 : } 88 : mysql_close(); // DB 연결 끊기 89 : 90 : Header("Location:list.php?page=$page"); // list.php 로 이동 91 : ?>
【예제 14-4】view.php 02 글내용 보기 142 : <? 143 : echo " 144 : <td align=center> 145 : <a href='write_form.php?num=$num&page=$page'> 146 : <img src='img/i_answer.gif' border=0> </a> 147 : <a href='modify_form.php?num=$num&page=$page'> 148 : <img src='img/i_edit.gif' border=0> </a> 149 : <a href='delete.php?num=$num&page=$page'> 150 : <img src='img/i_del.gif' border=0> </a> 151 : <a href='list.php?page=$page'><img src='img/i_list.gif‘ border=0> 152 : </a></td> 153 : "; 154 : ?> 155 : </tr>
【예제 14-1】list.php 02 질의응답 목록 보기