제9장 계층형 게시판
1. 테이블 작성
테이블 : 기존의 DB파일에서 게시판 테이블을 복사하여 ans_board 테이블을 작성
추가할 필드 : ans_group( 답변의 그룹 : 질문글의 고유번호), ans_level(답변의 단계), ans_num(답변의 순서)
2. 계층형 게시판의 이해
(1) 추가한 필드
ü ans_group필드 : 답변형 게시판으로 테이블의 중간에 답변데이타를 삽입을 할 수 없다. 그렇다면 답변이 달린 레코드는 하나의 질문글에 소속된 답변 데이타만을 그룹으로 묶어서 ans_group필드를 이용하여 질문 글의 고유번호를 담아 처리한다.
ü ans_level필드, ans_num필드 : ans_level은 답변이 계층형이므로 단계를 부여하고 ans_num은 답변글의 리스트에서 보여줄때 정렬을 위해서 순차적으로 번호를 부여한다.
ü 정렬 기준 : 게시판리스트에서 데이타를 가져올때 정렬의 순서는 첫번째 정렬기준으로 ans_group는 내림차순으로, 두번째 정렬기준은 ans_num으로 오름차순으로 정렬하여 가져온다.
(2) 1단계 답변형
먼저 답변1의 글을 올리고 두번째로 답변2의 글을 올린 모습은 다음과 같다.
num | title | ans_group | ans_level | ans_num |
123 | 질문1 | 123 | 0 | 0 |
① | | 123 | 1 | 1 -> 2 |
② | | 123 | 1 | 1 |
> 답변1
- ans_group : 질문1의 고유번호 123을 담는다.
- ans_level : 1단계 답변형이므로 질문1의 0 에 + 1증가시킨다.
- ans_num : 질문1의 0에 +1 증가시킨다.
> 답변2
- ans_group : 질문1의 고유번호 123을 담는다.
- ans_level : 1단계 답변형이므로 질문1의 0 에 + 1 증가시킨다.
- ans_num : 질문1의 0에 +1 증가시킨다.
- 답변1의 ans_num : 1에서 2로 수정한다.
> 답변2 ans_num 처리 방법
- 질문1 ans_num의 0번보다 큰 번호들은 모두 +1 시켜서
- 답변1은 1에서 2로 증가시키고
- 답변2는 질문1의 0에서 +1 증가하여 1을 갖는다.
> 답변2 ans_num 처리 쿼리문
update ans_board set ans_num=ans_num +1 where ans_group =" &
질문1의 그룹 & " and ans_num > " & 질문1의 순번
(3) 2단계 답변형
num | title | ans_group | ans_level | ans_num |
123 | 질문1 | 123 | 0 | 0 |
② | | 123 | 1 | 1 |
③ | | 123 | 2 | 2 |
① | | 123 | 1 | 2 -> 3 |
> 답변2-1
- ans_group : 답변2의 ans_group의 값 123을 담는다.
- ans_level : 답변2의 ans_level에 +1을 더하여 2로
- ans_num : 답변2의 ans_num에 +1을 더하여 2로
- 답변1의 ans_num : 2에서 3으로 바꾼다.
> 답변2-1 ans_num 처리 방법
- 답변2의 ans_num의 1번보다 큰 번호들은 모두 +1 시켜서
- 답변1는 2에서 3으로 증가시키고
- 답변2-1은 답변2의 num에 +1 더하여 2번을 갖게 된다.
> 답변2-1 ans_num 처리 쿼리문
update ans_board set ans_num=ans_num +1 where ans_group =" &
답변2의 그룹 & " and ans_num > " & 답변2의 순번
(4) 3단계 답변형
num | title | ans_group | ans_level | ans_num |
123 | 질문1 | 123 | 0 | 0 |
② | | 123 | 1 | 1 |
③ | | 123 | 2 | 2 |
④ | | 123 | 3 | 3 |
① | | 123 | 1 | 3 -> 4 |
3. 답변형 게시판 구성
4. 답변형 게시판 코드 작성
ans_board폴더에 소스를 작성한다.
게시판 소스를 조금 수정하여 답변형 게시판을 작성하여 보자
(1) 글 쓰기 코드 수정하기write_ok.asp
l 새글을 저장할 때 질문글이므로 ans_group은 글의 번호로 , asn_level은 0으로 , ans_num은 0으로 저장한다.
write_ok.asp
1 <% 2 ....... 코드 생략 ....... 3 ' 글의 번호 달기 4 if isnull(rs(0)) then 5 number=1 6 else 7 number=rs(0) + 1 8 end if 9 10 ' 새글쓰기 - 그룹값은 number로, 레벨은 0, 순서는 0으로 값 설정한다. 11 ans_group = number 12 ans_level = 0 13 ans_num = 0 14 15 ' 그룹, 레벨, 순번 필드를 추가한다. 16 sql="insert into ans_board (name, email, homepage, title, content, pwd, num, readnum, writeday, ans_group, ans_level, ans_num) " 17 sql= sql & "values ('" & name & "'" 18 sql= sql & ",'" & email & "'" 19 sql= sql & ",'" & homepage & "'" 20 sql= sql & ",'" & title & "'" 21 sql= sql & ",'" & content & "'" 22 sql= sql & ",'" & pwd & "'" 23 sql= sql & "," & number 24 sql= sql & ",0" 25 sql= sql & ",'" & now() & "'" 26 sql=sql & "," & ans_group 27 sql=sql & ","& ans_level 28 sql=sql & ","& ans_num & ")" 29 30 db.execute sql 31 response.redirect "list.asp" 32 %> |
(2) 게시판 리스트 list.asp
l 리스트 정렬기준으로 그룹은 역순으로 그리고 답변의 순번은 오름차순으로 가져온다.
l 게시판에서 질문글과 답변글을 구분하여 앞머리에 답변이미지를 넣어서 꾸며보자
l 답변 이미지를 넣고 레벨에 따라 들여쓰기를 하여 처리한다.
list.asp
1 …코드 생략… 2 <% 3 ' 그룹은 역순으로, 답변글의 순서는 오름차순으로 레코드 가져오기 4 sql="select * from ans_board order by ans_group desc, ans_num asc" 5 set rs=server.createobject("adodb.recordset") 6 rs.open sql, db 7 %> 8 ....... 코드 생략 ....... 9 <td align=center> <% =rs("writeday")%> </td> 10 <td > 11 12 <% ' 여기에 제목을 출력하기 전에 답변앞머리 장식하기 13 if rs("ans_level") >0 then ' 레벨이 0보다 크다면 즉 질문글이 아닌 답변글이라면 14 15 sp="" 16 for j = 1 to rs("ans_level") ' 레벨수만큼 들여쓰기 17 sp = sp + " " 18 next 19 response.write sp <!-- 공백넣기 --> 20 %> 21 <img src="images/re.gif"> <!-- 답변 이미지 달기 --> 22 <% end if ' 여기까지 %> 23 24 <a href="content.asp?idx=<%=rs("board_idx")%>&ans_group=<%=rs("ans_group")%>"><%=rs("title")%></a></td> 25 <td width="10%"><%=rs("readnum")%></td> 26 </tr> .... 코드생략 ....... |
(3) 글내용보기에 답변메뉴 달기 content.asp
l content.asp파일에서 답변하기 메뉴를 달아서 write.asp파일로 넘어가면서 질문글의 ans_group, ans_level, ans_num 값을 답변글로 넘긴다.
l 주의할 점으로 값을 넘길때 중간에 공백은 없어야 한다.
content.asp
1 ....... 코드 생략 ....... 2 <!--- ---------------- 글 내용 보기--------------------> 3 4 <!-- 여기에 답변하기 메뉴 달기 추가 5 : 답변글 저장을 위한 질문글의 그룹, 단계, 순서값 넘기기 --> 6 <A HREF="write.asp?ans_group=<%=rs("ans_group")%>&ans_level=<%=rs("ans_level")%>&ans_num=<%=rs("ans_num")%>&idx=<%=request("idx")%>"><답변하기></A> 7 <!-- 여기까지 --> 8 <!--------------------리스트 링크---------------------> 9 <!-------------------- 수정 링크---------------------> 10 <A HREF="del.asp?ans_group=<%=rs("ans_group")%>&ans_level=<%=rs("ans_level")%>&ans_num=<%=rs("ans_num")%>&idx=<%=request("idx")%>"><삭제></A> |
(4) 답변하기 write.asp
l 넘어온 값 ans_group, ans_level, ans_num을 다시 그대로 write_ok.asp파일로 form의 action을 이용하여 넘긴다.
write.asp 파일과 소스는 동일하다.
write.asp
1 ........ 코드 생략 ......... 2 <BODY> 3 <center> 4 <h2> 답변 / 글쓰기 </h2> 5 6 <!-- 여기에 답변쓰기 폼작성 추가 7 답변글 저장을 위해 질문글의 그룹, 단계, 순서값 넘김 --> 8 <form method="post" name ="myform" action="write_ok.asp?ans_group=<%=request("ans_group")%>&ans_level=<%=request("ans_level")%>&ans_num=<%=request("ans_num")%>&idx=<%=request("idx")%>"> 9 <!-- 여기까지 --> 10 <table border=1 cellspacing=0 width=500> 11 <tr> <th>이름</th> <td> <input type=text name="name"> </td> </tr> 12 <tr> <th>이메일</th> <td> <input type=text name="email"> </td> </tr> 13 .... 코드 생략 ....... 14 </center> 15 </BODY> 16 </HTML> |
(5) 답변 글 저장 write_ok.asp
l IF문을 이용하여 Request(“idx”)의 값이 빈문자열이면 새글쓰기이고 그렇지 않으면 답변글로 처리한다.
l 질문글의 그룹, 레벨, 순서값을 가져와서 질문글의 그룹과 일치하고 질문글의 번호보다 큰 답변글의 레코드들의 번호를 +1 증가시킨다.
l 단계와 번호를 +1 증가시켜 답변글을 저장한다.
write_ok.asp
1 <% 2 ' 폼에서 데이타 가져오기 3 name=request("name") 4 email=request("email") 5 homepage=request("homepage") 6 title=request("title") 7 content=request("content") 8 pwd=request("pwd") 9 10 ' db열기 11 sql="select max(num) from ans_board" 'num 필드에서 최대값 추출 12 set rs=server.createobject("adodb.recordset") 13 rs.open sql,db 14 15 ' 쿼리실행하여 추출된 값 유무를 체크 16 if isnull(rs(0)) then '추출된 값이 없다면 번호는 1번으로 17 number=1 18 else ' 추출된 값이 있다면 번호는 최대번호 + 1 19 number=rs(0) + 1 20 end if 21 22 If request("idx") = "" then 23 ' 새글쓰기 24 ans_group = number 25 ans_level = 0 26 ans_num = 0 27 else 28 '답변글 쓰기 29 ans_group = request("ans_group") '기본 그룹의 값을 그대로 받음 30 ans_level = request("ans_level") + 1 '답변글의 단계 +1 증가 31 ' 답변글을 중간에 삽입하기 이전에 질문글의 번호보다 큰 번호들을 모두 +1 씩 증가시킨다. 32 sql = " update ans_board set ans_num=ans_num + 1 " 33 '조건1 : 질문글의 ans_group과 일치하는 답변글 34 sql = sql & " where ans_group = " & request("ans_group") 35 '조건2 : 질문글의 ans_num보다 큰 번호인 답변글 36 sql = sql & " and ans_num > " & request("ans_num") 37 db.execute sql 38 ans_num = request("ans_num") + 1 '답변글의 순번 +1 증가 39 End if 40 41 ' DB에 저장 42 sql="insert into ans_board (name, email, homepage,title, content, pwd, 43 num, readnum, writeday, ans_group, ans_level, ans_num) " 44 45 sql= sql & "values ('" & name & "'" 46 sql= sql & ",'" & email & "'" 47 sql= sql & ",'" & homepage & "'" 48 sql= sql & ",'" & title & "'" 49 sql= sql & ",'" & content & "'" 50 sql= sql & ",'" & pwd & "'" 51 sql= sql & "," & number ' num필드값(수치형임에 주의) 52 sql= sql & ",0" ' readnum 필드값은 0(수치형임에 주의) 53 sql= sql & ",'" & now() & "'" ' writeday()필드는 오늘날짜 함수로 54 sql= sql & ", " & ans_group 55 sql= sql & ", " & ans_level 56 sql= sql & ", " & ans_num & ")" 57 58 db.execute sql 59 response.redirect "list.asp" '게시판 리스트로 이동 60 %> |
(6) 답변글 삭제 실행 코드 수정 del_ok.asp
l 계층형 게시판에서 질문글(새글)에 대한 답변글(관련글)이 있는 경우에는 질문글을 삭제하게 되면 답변글만 보이게 되니 이상하게 될것이다. 그래서, 관련글이 있는 질문글은 삭제를 할수 없도록 해 두면 되겠다. 대신 답변글에 대해서는 어떤글이나 모두 삭제를 할수 있도록 설계를 해 보도록 하자.
l 관련글이 있는 질문글이라는 말은 그룹이 같은 레코드의 수가 1 이상이고 레벨이 0인 레코드를 의미하게 된다.
Del_ok.asp
1 <!--#include file="../dbconn.asp"--> 2 <% 3 sql = "Select count(*) from ans_board where ans_group= " & request("ans_group") 4 set group_cnt = db.execute(sql) '같은 그룹에 속한 개수를 가져온다. 5 6 sql = "select pwd, ans_group, ans_level from ans_board where board_idx=" & request("idx") 7 set result = db.execute(sql) '패스워드, 그룹, 레벨값을 가져온다. 8 9 ' 같은 그룹의 수가 1보다 크고(즉 관련글이 있고) 레벨이 0(질문글)이면 10 if Cint(group_cnt(0)) > 1 And Cint(result("ans_level")=0 )then 11 %> 12 <script language="javascript"> 13 alert("답변글이 있습니다."); 14 history.back(); 15 </script> 16 <% 17 elseif request("pwd") = result("pwd") then 18 sql = "delete from ans_board where board_idx = " & request("idx") 19 db.execute sql 20 21 22 response.Redirect "list.asp" 23 else 24 %> 25 26 <script language="javascript"> 27 alert("비밀번호가 일치하지 않습니다."); 28 history.back(); 29 </script> 30 <% end if %> |
1. 계층형 게시판 보강
(1) 답변 글 쓰기 보강 write.asp
l 답변글은 제목과 내용에 질문글의 내용을 미리 넣어 준다.
l 답변글과 질문글을 구분하기 위해 질문글머리 앞에 ">" 문자를 표시한다.
l content.asp에서 board_idx 값을 넘겨주는 코드를 추가하여야 한다.
write.asp
1 <!--#include file="../dbconn.asp"--> 2 <% 3 If request("idx") <> "" then 4 sql = "select title, content from ans_board " 5 sql = sql & " where board_idx=" & request("idx") 6 Set rs = Server.CreateObject("ADODB.RecordSet") 7 rs.open sql, db 8 9 title = "RE:"& rs("title") 10 content = rs("content") 11 content = "> " & content 12 content = Replace(content, "<br>", Chr(13)&Chr(10)&">") 13 End if 14 %> 15 ..... 코드 생략 ........ 16 <tr> <th>제목</th> 17 <!-- 제목 넣어주기 --> 18 <td> <input type=text name="title" value="<%=title%>"> </td> </tr> 19 <tr> <th>내용</th> 20 <!-- 내용 넣어주기 --> 21 <td> <textarea name="content" rows=5 cols=50><%=content%></textarea></td> </tr> 22 ..... 코드 생략 ........ 23 |
(2) 글 내용보기에 답변글 리스트를 추가 content.asp
l 관련글의 리스트를 보여주는 기능으로 답변글이 소속된 그룹의 리스트를 보여주면 된다.
l list.asp 에서 idx와 ans_group값 content.asp로 넘겨주기
<a href="content.asp?idx=<%=rs("board_idx")%>&ans_board=<%=rs("ans_board")%> ">
content.asp
1 ...... 코드 생략 ....... 2 <!-- 답변하기 메뉴 달기: 답변글 저장을 위한 그룹, 단계, 순서값 넘기기 --> 3 4 <!-- 여기부터 ------------------------------------------------------------ --> 5 <hr> 6 <% 7 ' 글내용보기 하단에 질문글에 소속된 관련 답변글을 보여주자 8 rs.close 9 sql="select * from ans_board” 10 sql= sql & " where ans_group= " & request("ans_group") & " order by ans_num asc" 11 rs.open sql, db 12 %> 13 <TABLE border=1 cellspacing=0 width=500> 14 <TR> 15 <td align=center>번호</td> 16 <td align=center>글쓴이</td> 17 <td align=center>글쓴날짜</td> 18 <td align=center>제목</td> 19 <td align=center>조회수</td> 20 </TR> 21 <% 22 Do until rs.EOF %> 23 <TR> 24 <TD align=center> <% =rs("num")%> </td> 25 <TD align=center><a href="mailto:<%=rs("email")%>"> <% =rs("name")%> </td> 26 <TD align=center> <% =rs("writeday")%> </td> 27 <TD><a href="content.asp?idx=<%=rs("board_idx")%>&ans_group=<%=rs("ans_group")%>"> <% =rs("title")%> </a> </td> 28 <TD align=center> <%=rs("readnum")%> </td> 29 </TR> 30 <% 31 rs.movenext 32 i=i+1 33 loop 34 %> 35 </TABLE> 36 </CENTER> 37 </BODY> 38 </HTML> |
http://noogi.byus.net/noogi/study/asp/ch9_ans_board.htm
'Programming > ClassicASP' 카테고리의 다른 글
[Classic ASP] 배열 (0) | 2015.03.06 |
---|---|
ASP 첨부파일 다운로드 (0) | 2015.01.26 |
[SiteGalaxy] 다중업로드(파일중복방지) (0) | 2015.01.26 |