본문 바로가기
Programming/ClassicASP

[asp] 계층형 게시판

by 막이 2015. 2. 13.

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

  답변1

123

1

1 -> 2

  답변2

123

1

1

답변
    - ans_group : 
질문1의 고유번호 123을 담는다
    - ans_level : 1
단계 답변형이므로 질문1 0  + 1증가시킨다.
    - ans_num : 
질문1 0 +1 증가시킨다.

답변
    - 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

  답변2

123

1

1

   답변2-1  (2단계)

123

2

  답변1       (1단계)

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

  답변2    (1단계)

123

1

1

   답변2-1  (2단계)

123

2

     답변2-1-1 (3단계)

123

3

  답변1       (1단계)

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 + "&nbsp;"    
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")%>">&lt;답변하기&gt;</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")%>">&lt;삭제&gt;</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