login register Sysop! about ME  
qrcode
    최초 작성일 :    2001년 05월 01일
  최종 수정일 :    2001년 07월 20일
  작성자 :    taeyo
  편집자 :    Taeyo(김 태영)
  읽음수 :    122,011

강좌 목록으로 돌아가기

필자의 잡담~

-_-; 잡담..

저번 강좌만으로는 Content.asp 가 만족스럽지 못할 것입니다. 몇몇가지 기능이 더 필요하지요.. 그리고, 설명도 조금은 더 필요하구요....  먼저 같이 해결할 부분은 다음과 같은 문제점이었습니다.

"  현재의 페이지에서 [새로고침]을 하면 조회수가 그냥 막 올라간다...우리는 list.asp 에서 링크를 눌러서 글을 보는 것들만 조회수를 올리고 싶다.. 단지 새로고침만 한다고 조회수가 늘어나서는 안된다.. 어케 할 것인가? "

이 부분을 해결하는 여러가지 방법이 있을 수 있겠지만 우리는 "다음" 과 같은 방법을 써보겠습니다. 여기서의 "다음"은 밑에 있는 다음이구요... Daum 이라는 사이트하고는 아무 연관이 없습니다... 자.. 그러면어떻게 한다는 것일까요? 바로 "다음"처럼 한다는 것이랍니다. ^^

 

이렇게 되면 리스트 페이지와 조회수 증가 페이지 본문을 보여주는 페이지가 각각 다르기 때문에.. 본문내용에서 새로고침을 눌러도 조회수는 증가하지 않게 되지요.... 또한, 조회수 증가부분과 글을 조회하게 하는 부분을 분리함으로써 얻어지는 상당한 이득들도 있습니다. 사이트를 운영하시다보면 그 잇점을 조금은 느끼실 수 있을 겁니다. ^^

그렇다면.. 백문이 불여일타... 일단 한번 만들고 계쏙 이야기 해 보도록 하겠습니다. 먼저, List.asp 에서 목록이 출력되는 부분의 하이퍼링크를 다음처럼 수정합니다...

list.asp 수정!!

소스라인 109 line 근처

<a href="content.asp?board_idx=<%=board_idx%>&GotoPage=<%=GotoPage%>">
<%=title%><%=strNew%></td>

라고 되어져 있는 부분을 다음처럼 바꿉니다.

<a href="list2content.asp?board_idx=<%=board_idx%>&GotoPage=<%=GotoPage%>">
<%=title%><%=strNew%></td>


그리고, Content.asp에서 조회수를 증가하게 처리한 부분도 삭제해 주세요. 다음 부분이 바로 그 곳이겠죠? ^^

Content.asp 에서 삭제!!

소스라인 11 line 근처

SQL="Update MyBoard set b_readnum=b_readnum+1 where board_idx=" & request("board_idx")
adoDb.execute SQL

그리고, 이제...  새롭게 List2Content.asp 페이지를 만듭니다.. ^^

List2Content.asp

<% Option Explicit %>
<!--#include file="config.asp"-->
<%
Dim board_idx, Gotopage

board_idx = Request("board_idx")
Gotopage = Request("Gotopage")

Dim adoDb, SQL
Set adoDb = Server.CreateObject("ADODB.Connection")
adoDb.Open strConnect

SQL = "Update MyBoard set b_readnum = b_readnum+1 where board_idx=" & board_idx
adoDb.execute SQL

adoDb.Close
Set adoDb = nothing

Response.Redirect "Content.asp?board_idx=" & board_idx & "&Gotopage=" & Gotopage
%>

위에서 보이는 것과 같이.. List2Content.asp 페이지의 역할은 단지.. 사용자가 리스트에서 선택한 글의 조회수를 +1 해주는 것입니다. 그리고는 Content.asp 로 그대로 다시금 넘겨주는 것이지요.... 이렇게되면....   복잡한 로직이 필요없이 간단하게 조회수를 증가시킬 수 있습니다.

에... 그러지 아나요???  (대중할부지 버전)

물론, 이 방법에도 단점은 있습니다. 그것은 네트웍이 좋지않아서... List2Content.asp 만이 실행되고 Content.asp 로 이동중에 문제가 생길 경우는... 카운트를 이미 올라가 있지만, 사용자는 내용을 보지 못하고... 계속적인.. 그런 로딩이 있을 경우.. 카운트가 실제와는 많이 다르게 높을 수 있다는 점이지요... 하지만, 네트웍의 이상이나 문제가 그리 빈번하지는 않을테니까.. 큰 단점은 아닐 것입니다..  ^^

이번에 같이 나눌 이야기는요...  ^^

2. 본문에서도 이전글, 다음글로 이동하고 싶다.. 어떻게 하면 될까?  입니다.

본문에서의 이전글과 다음글로의 이동에 대해서는 많은 분들이 요구하시는 부분이었습니다... 강좌가 진행되는 중간에도 많은 분들이 요구하셔서 추가하기로 한 부분이지요... 이것을 위해서는 어떤 식으로 처리해야 할까요?

현재 사용자가 보고 있는 글의 앞, 뒤의 글이 있는지의 여부를 먼저 체크해야만 할 것입니다. 실제로 데이터가 들어있는 곳은 데이터베이스안의 테이블이겠지요? 그러므로 현재글보다 이전 데이터 혹은 다음 데이터가 들어있는지의 여부를 정확히 알아내기 위해서는 데이터베이스의 테이블을 직접적으로 조회해야만 할 것입니다.

우리의 테이블은 board_idx 라는 일련번호, 즉 자동증가형 identity 컬럼이 존재하고 있습니다. 그리고, 이 값은 새로운 글이 등장할 경우마다 1 씩 증가하지요...  ^^ 하지만, 특정 글이 지워질 경우 그 글이 가지고 있던 board_idx 값은 다시는 생기지 않는 답니다.

즉, 현재 테이블에 글의 board_idx 가 1,2,3  으로 3개의 글이 들어있다면 그 다음에 insert 되는 글의 board_idx 는 4 가 되겠지만 insert 한 뒤에, 이 4번 글을 지워버린다면 4번이라는 숫자는 영원히 다시는 만들어지지 않는다는 것입니다.  다시는 말이지요... ...

다시금 1,2,3 .. 3개의 글이 있는 상태에서 새롭게 글을 insert 하면 글번호 4인 글이 들어가는 것이 아니라 일전에 지워진 4 라는 것은 영원히 다시 만들어 지지 않구요. 5라는 글이 들어가게 된단 것이지요..  고로 글은 1,2,3,5   이렇게 4개가 들어가게 된 다는 것입니다. 다 아는 이야기라구요?

그럼 다행입니다...

자.. 그럼 이전 글, 다음 글을 하기 위해서 예를 한번 들어보겠습니다. 현재 우리의 테이블에는 1, 2, 3, 5, 6, 7, 8, 10, 12, 26, 27, 33   이렇게 12개의 글이 들어있다고 가정합니다. 각각의 번호는 각각의 글의 주민등록번호와 같은 고유값입니다..  아시죠?

고로, 이 글이 출력될 경우는 최근 글부터 출력될 것이니까요..  33번 부터 27, 26 과 같은 순으로 뿌려지겠지요? 다음처럼 말입니다.

33, 27, 26, 12, 10, 8, 7, 6, 5, 3, 2, 1 

그러므로 가장 이전 글은 33이 될 것이고, 가장 다음 글은 1 이 될 것입니다. OK??? 여기서 정해야 할 것이 하나 있는데요... 저는 이전 글이라는 것을 보다 최근 글이라는 의미로 사용했구요. 다음 글이라는 것을 보다 예전 글이라는 의미로 사용했답니다. 단어의 의미가 이해하기에 따라. 다르게 받아들여질 수 있다는 것을 알기에 이것을 확실히 언급하고 넘어가고자 한답니다.

현재 우리가 12 번 글을 보고 있습니다.  이 경우의 이전 글의 board_idx 값은 어떻게 될까요? 즉, 보다 최근 글은 어떻게 되겠느냐는 이야기지이죠.

네... 아주 쉽게 우리는 26 이라고 말할 수 있을 것입니다.  당연히 26 이 되겠지요? 그럼, 다음 글은 무엇일까요? 12의 입장에서 다음글은 10 이 될 것입니다.  그렇죠?

즉, 이것은 로직적으로 말하자면...

이전 글은 현재 글보다 board_idx 값이 큰 것들 중에서 가장 작은 값일 것이구요... 다음 글은 현재 글보다 board_idx 값이 작은 것들 중에서 가장 큰 값일 것입니다.

잘 생각해 보세요... 맞지요?

현재 글이 12라고 가정했을때, 다음 글은 현재 글보다 작은 값들 즉,  1, 2, 3, 5, 6, 7, 8, 10 중에서 가장 큰 값인 10 일 것입니다. 이전 글도 마찬가지로 생각할 수 있구요.... 이것을 이해하신다면...  이것을 이제 쿼리로 바꾸어 봅시다... 왜냐구요? 왜 쿼리로 만들어야 하냐구요? 그것은 이 모든 데이터들이 데이터베이스 안에 있기 때문이지요...

자... 현재글이 12 라는 가정하에서.. 다음 글의 board_idx 를 가져오는 쿼리는 어떻게 될까요?

Select MAX(board_idx) from table이름  where board_idx < 12

일 것입니다. 현재 글보다 작은 글들 중에서 가장 Max 값을 가져오는 쿼리이지요...  ^^ 마찬가지로 생각했을 때, 이전 글의 board_idx 값을 가져오는 쿼리는 어떻게 될까요?

Select MIN(board_idx) from table이름 where board_idx > 12

가 되겠지요?  ^^  그렇습니다.  자.. 그렇다면 이제 모든 준비는 끝났네요...  이 쿼리를 사용해서 어디 한번 이전 글, 다음 글 을 추가로 붙여볼까요?  그리고 나면 다음과 같은 Content.asp를 가질 수 있게 될 것입니다.

자.. 그럼 이제 이전 글 보기와 다음 글 보기 기능이 추가된 수정된 Content.asp의 소스를 보시겠습니다. 여러분의 Content.asp 소스를 다음과 같이 바꾸어 주시면 될 것이랍니다..  ^^

Content.asp

<% Option Explicit %>
<!--#include file="config.asp"-->
<%
    Dim Gotopage
    GoTopage= request("GotoPage")

    Dim adoDb, SQL, Rs
    Set adoDb = Server.CreateObject("ADODB.Connection")
    adoDb.Open strConnect

    SQL="SELECT board_idx,b_name,b_title,b_date,b_email,b_ipaddr,b_readnum,b_pwd,b_content from MyBoard "
    SQL=SQL & " where board_idx=" & request.Querystring("board_idx")

    Set Rs = adoDb.execute(SQL)

    Dim board_idx, name, title, mail, writeday
    Dim ipaddr, readnum, pwd, content
    Dim prev_idx, next_idx

    if Rs.BOF or Rs.EOF then
        Response.Write "<Script>"
        Response.Write " alert('현재 글은 존재하지 않습니다.');"
        Response.Write " location.href='list.asp';"
        Response.Write "</Script>"
        Response.End
    else
        board_idx = Rs("board_idx")
        name = Rs("b_name")
        title = Rs("b_title")
        writeday = Rs("b_date")
        mail = Rs("b_email")
        ipaddr = Rs("b_ipaddr")
        readnum = Rs("b_readnum")
        content = Rs("b_content")
        content = replace(content,vblf,"<br>")
      end if

    '이전 글의 board_idx 값을 구하는 부분
    SQL = "Select Min(board_idx) from MyBoard where board_idx > " & board_idx
    Set Rs = adoDb.Execute(SQL)
    if Not Rs.EOF then
        prev_idx = Rs(0)
    end if


    '다음 글의 board_idx 값을 구하는 부분
    SQL = "Select Max(board_idx) from MyBoard where board_idx < " & board_idx
    Set Rs = adoDb.Execute(SQL)
    if Not Rs.EOF then
        next_idx = Rs(0)
    end if


    adoDb.close
    Set Rs = Nothing
    Set adoDb = nothing
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<style type="text/css">
    A{text-decoration: none; color:navy }
    A:hover {text-decoration: none; color:orange}
    td{padding:7; font-family:돋움; font-size:12 }
    input {border: 1 solid silver; font-family:dotum; font-size:9pt;}
</style>
<script language="javascript">
<!--
    function Del(){
        var pwd = document.myform.pwd.value;
        if (CheckStr(pwd, " ", "")==0){
            alert("비밀번호를 입력해 주세요");
            return;
        }
    document.myform.action = "del_ok.asp";
    document.myform.submit();
    }

    function Edit(){
        var pwd = document.myform.pwd.value;
        if (CheckStr(pwd, " ", "")==0) {
            alert("비밀번호를 입력해 주세요");
            return;
        }
        document.myform.action = "Edit.asp";
        document.myform.submit();
    }

    function addComment(){
        document.myform.action = "Comment.asp";
        document.myform.submit();
    }

    function CheckStr(strOriginal, strFind, strChange){
        var position, strOri_Length;
        position = strOriginal.indexOf(strFind);

        while (position != -1){
            strOriginal = strOriginal.replace(strFind, strChange);
            position = strOriginal.indexOf(strFind);
        }

        strOri_Length = strOriginal.length;
        return strOri_Length;
    }
//-->
</script>
</head>
<body>
<form method="POST" action="Write.asp" name="myform">
<input type="hidden" name= "board_idx"value="<%=board_idx%>">
    <table cellpadding="0" cellspacing="0" border="0" width="540">
        <tr>
            <td bgcolor="white" valign= "top" style="padding:2px;"width="400">
                <a HREF="list.asp?gotopage=<%=gotopage%>">[ 리스트로 ]</a>
            </td>
            <td bgcolor="white" valign="top" align="right" width="140">
                조회수 : <%=readnum%>
            </td>
        </tr>
        <tr>
            <td bgcolor="#aaaaaa" style="padding:2px;" colspan="2">
                <table cellpadding="0" cellspacing="1" border="0" width="540">
                    <tr>
                        <td width="100" bgcolor="#EFEFEF" align="center" height="20">게시자</td>
                        <td width="44" bgcolor="white">
                            <% if mail<>""then%>
                                <a href="mailto:<%=mail%>"><%=name%></a>
                            <%else%>
                                <%=name%>
                            <% end if%>
                        </td>
                    </tr>
                    <tr>
                        <td BGCOLOR="#EFEFEF" align="center" valign="middle" height="25">날짜</td>
                        <td bgcolor="white"><%=writeday%></td>
                    </tr>
                    <tr>
                        <td BGCOLOR="#EFEFEF" align="center" valign="middle" height="25">제목</td>
                        <td bgcolor="white"><%=title%></td>
                    </tr>
                    <tr VALIGN="top">
                        <td BGCOLOR="#EFEFEF" align="center" valign="middle">내용</td>
                        <td bgcolor= "white"class="content"><%=content%></td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td style="padding-top:3px;" align="right" colspan="2">
                <table cellpadding="0" cellspacing="0" border="0" width="340">
                    <tr>
                        <td align="right" width= "200"style="padding=0">
                            비밀번호 <input type="password" name="pwd" size="10" class="pwd"></td>
                        <td align="right" width= "70"style="padding=0">
                            <a href="javascript:Edit();">[수정하기]</a></td>
                        <td align="right" width= "70"style="padding=0">
                            <a href="javascript:Del();">[삭제하기]</a></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
    <table width="540">
        <tr>
            <td>
                <% if prev_idx <> "" then%>
                    <a href="list2content.asp?board_idx=<%=prev_idx%>&Gotopage=<%=Gotopage%>">
                        &lt; &lt; 이전 글 보기
                    </a>
                <% end if%>
                |
                <% if next_idx <> "" then %>
                    <a href="list2content.asp?board_idx=<%=next_idx%>&Gotopage=<%=Gotopage%>">
                        다음 글 보기 &gt; &gt;
                    </a>
                <% end if%>
            </td>
        </tr>
    </table>

</form>
</body>
</html>

소스중에 빨간 코드들이 이번 강좌를 통해서 새롭게 추가된 부분입니다. 그러니, 빨간 코드들을 중점적으로 보시면 될 것 같답니다...  ^^   그리 어렵지 않지요?

돌아가는 흐름만을 이해한다면 어려울 것이 없답니다...  흐름...  플로우.. 이게 중요한 것이지요... 그래서 기초가 중요하다는 말이 나오는 것이구요... 기본이 튼튼해야지 든든한 물건을 만들어 낼 수가 있는 것이랍니다.  ^^

5월 1일 .... 석가탄신일을 맞이하야... 짬을 내서 쓰는 강좌.... 오늘 강좌를 쓰기 시작한 시간이 오후 12시 인데, 강좌가 끝난 지금 시간은 오후 5시이네요... 이제는 5월의 신부를 만나러 가야할 것 같아요... 그동안 너무 무심했던 것 같아서. 오랜만에 저녁이라도 같이 해야할 것 같아서요...  ^^

^^  그럼 다음 강좌에서 또 뵈어요.... 다음 강좌도 가급적 빠른 시간내에 올리도록 하겠습니다. 다음 내용은 본문을수정, 삭제하는 부분이 되겠네요..  ^^


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})