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

강좌 목록으로 돌아가기

필자의 잡담~

드디어... 태오가 결혼을 했습니다.
어머니가 해주던 아침을 이제... 졸업하고... 아내가 해주는 아침을 먹기 시작했네요...

신혼여행은 어땟냐구요? 그게 말입니다. 비보라가 몰아친데다가 태풍까지 몰려온다고 하여...
꼬박 방에만 있었습니다.... 물에도 한번 못 들어가 보았지요...

오오.. 더욱 좋았겠다구요..??? 한번 가보십시요... 아무리 그래도... 하루종일 방안에만 있는다고.. 그렇게 예상처럼.. 그럴 것 같습니까? .... 으음.... 태오 너는 역시나 그럴 것 같다구요...??. 흠.... 응큼한 사람들 같으니라구....

나이가 30이 되어보세요... 관심이 조금은 줄어든답니다.... 거짓말 말라구요?? 흠.... 2001년이 되어도 제 말을 안 믿어주는 것은 여전하군요... 흠흠.

이제는...   글을 수정하는 부분과, 삭제하는 부분에 대한 이야기를 할 차례이지요? 그렇다면... 한번 이제 해 나가볼까요? 먼저, 다시금 상기해야하는 것이 있다면 우리는 본문보기에서 글의 비밀번호를 입력해야지만.. 글의 수정모드로 들어올 수 있다는 것을 기억하고 있어야 합니다. 분명히 그렇게 만들었었지요?

그리고, 글의 비밀번호를 입력하지 않은 상태로 "수정하기"를 누르면... 다음 그림과 같은 경고가 나오는 것도 이미 만들어 두었습니다. 그렇죠??

그렇다면, 이제 만들어야 할 것은 사용자가 비밀번호를 입력한 뒤에... [수정하기]를 누르면 어떻게 반응하게 할 것인가 하는 것입니다... 그럼... 보도록 할까요? 먼저, Edit.asp 입니다.  버튼을 눌러서 새창으로 소스를 보도록 하겠습니다.

Edit.asp

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

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

    SQL = "SELECT b_name,b_title,b_email,b_url,b_content from MyBoard "
    SQL = SQL & " where board_idx=" & board_idx & " and b_pwd='" & pwd & "'"

    Set Rs = adoDb.execute(SQL)

    Dim name, title, mail, url, content

    if Rs.BOF and Rs.EOF then '만일, 조건에 해당 레코드가 없다면(비밀번호가 맞지 않는다면)
        Response.Write "<script language=javascript>"
        Response.Write " alert('비밀번호가 일치하지 않습니다');"
        Response.Write " history.back();"
        Response.Write "</script>"
        Response.End
    else '비밀번호가 일치한다면...
        name = Rs("b_name")
        title = Rs("b_title")
        mail = Rs("b_email")
        url = Rs("b_url")
        content = Rs("b_content")
    end if

    Rs.Close
    adoDb.close
    Set Rs = Nothing
    Set adoDb = nothing
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<title></title>
<style type="text/css">
    A{text-decoration: none; color:navy }
    A:hover{text-decoration: underline; color:orange}
    td { font-family:돋움; font-size:12 }
    input,Textarea {font-family:돋움;border: 1 solid white;border-bottom: 1 solid silver}
</style>
</head>
<script language="javascript">
<!--
function sendit(){
    //제목
    if (document.myform.title.value == "") {
        alert("제목을 입력해 주십시오.");
        return;
    }
    //이름
    if (document.myform.name.value == "") {
        alert("이름을 입력해 주십시오.");
        return;
    }
    //글 내용
    if (document.myform.memo.value == "" ) {
        alert("글을 작성 안하셨습니다. 글을 작성해 주십시요");
        return;
    }
    document.myform.submit();
}

function focus_it(){
    document.all.title.focus();
}
//-->
</script>

<body bgcolor="#ffffff" onload="javascript:focus_it();">
<form method="POST" action="Edit_result.asp" name="myform">
<input type="hidden" name= "board_idx"value="<%=board_idx%>">
<input type="hidden" name= "Gotopage"value="<%=Gotopage%>">

<table border="0" cellspacing="0" width="520" cellpadding="0">
    <tr height="50">
        <td align="right" width="170" >
        <input type="button" value="수정완료" name="edit" OnClick="sendit()"
            style="background-color:khaki"></td>
        <td width="350" align="left" style="padding-left:70">
            <font color="blue">글을 수정합니다...</font>
        </td>
    </tr>
    <tr height="30" >
        <td width="170" align="right" >제목</td>
        <td width="350" align="left" style="padding-left: 20; padding-right: 30">
            <input type="text" name="title" size= "50"value="<%=title%>"></td>
    </tr>
    <tr>
        <td align="right" >이름</td>
        <td align="left" style="padding-left: 20; padding-right: 30">
            <input type="text" name="name" size= "50"value="<%=name%>"></td>
    </tr>
    <tr>
        <td align="right" >메일</td>
    <td align="left" style="padding-left: 20; padding-right: 30">
            <input type="text" name="mail" size= "50"value="<%=mail%>"></td>
    </tr>
    <tr>
        <td align="right" >사이트</td>
        <td align="left" style="padding-left: 20; padding-right: 30">
            <input type="text" name="url" size= "50"value="<%=url%>"></td>
    </tr>
    <tr>
        <td align="right" >글</td>
        <td align="left" style="padding-left: 20; padding-top: 5; padding-bottom: 5">
            <textarea wrap="hard" rows="10" name= "memo"cols="50"><%=content%></textarea></td>
    </tr>
    <tr height="25">
        <td align="right" colspan="2" style="padding-right:25">
            <input type="button" value="수정완료" name="edit" OnClick="sendit()"
            style="background-color:khaki">
        </td>
    </tr>
</table>
</form>
</body>
</html>

소스중에 특별히 어려운 부분은 없어보이네요.... 사용자가 입력한 비밀번호와....  해당 글의 board_idx 값을 가지고서... 두 값이 일치하는 레코드가 있는지를 찾아보는 다음 쿼리문이 중요해 보입니다...

SQL = "SELECT b_name,b_title,b_email,b_url,b_content from MyBoard "
SQL = SQL & " where board_idx=" & board_idx & " and b_pwd='" & pwd & "'"

만일 이 쿼리에 의해서 얻어진 레코드가 하나도 없다면.. 비밀번호가 일치하지 않는 것이겠구요.  만일, 이 쿼리에 의해서 레코드가 얻어진다면... 조건에 부합했으니깐... 비밀번호가 일치하는 것이지요... 해서 그 다음에 이어지는 IF 문은 바로 각각의 경우 처리를 위해 다음처럼 하고 있는 것을 보실 수 있을 것입니다.

  if Rs.BOF and Rs.EOF then '만일, 조건에 해당 레코드가 없다면(비밀번호가 맞지 않는다면)
    Response.Write "<script language=javascript>"
    Response.Write " alert('비밀번호가 일치하지 않습니다');"
    Response.Write " history.back();"
    Response.Write "</script>"
    Response.End
  else '비밀번호가 일치한다면...
    name = Rs("b_name")
    title = Rs("b_title")
    mail = Rs("b_email")
    url = Rs("b_url")
    content = Rs("b_content")
  end if

레코드가 하나도 없다면...  그러한 메시지를 클라이언트에게 보내기 위해서.. 위와 같이 자바스크립트 문을 출력한 코드들을 Response.write 하고 있구요.. Response.end 를 통해서 이하에 있는 모든 스크립트는 실행하지 않고.. 페이지를 끝내게 합니다.

해서, 만일 비밀번호가 일치하지 않아서... 레코드가 존재하지 않을 경우...는.. 클라이언트에게는 다음과 같은 html 페이지가 전송되게 되는 것이지요...

Edit.asp

  <script language=javascript>
    alert('비밀번호가 일치하지 않습니다');  
    history.back();
  </script>

그렇기에.. 비밀번호가 일치하지 않을 경우 사용자는 다음과 같은 메시지를 만나게 되고... history.back()를 통해서 다시금 본문보기 페이지로 돌아가게 될 것입니다...

그렇다면, 비밀번호가 일치할 경우는 어떻게 될까요?  그 경우는 else 문의 다음 문장에 의해서... 해당 레코드의 원래의 컬럼값들을 모두 지역변수에 담게 될 것입니다..  ^^  가급적, 데이터베이스와의 연결은 빨리 닫아주는 것이.. 성능의 향상에 크게 도움이 되기에... 일단, 이러한 컬럼값들을 보두 지역변수에 담고... 레코드셋 객체와 데이터베이스 커넥션 객체를 빨리 닫아보았습니다.

이제 그 이하의 코드들을 자바스크립트와 HTML 그리고...방금 우리가 지역변수에 담은.. ASP 변수들이 전부입니다... 그리고, 이하의 코드들은 마치 Write.htm 와 비슷할 것입니다... ASP 코드들만을 뺀다면 말이지요... 그도 그럴것이.. Edit.asp 의 형태(기본 틀)는... Write.htm과 똑같으니 말이지요....

이제 Edit.asp 의 구성은 끝났습니다. 이제는 무엇을 할까요? 이 수정 폼에서 데이터를 전송(서브밋)할 경우 데이터를 전송받는 페이지인.... Edit_result.asp 페이지를 제작해야 할 것입니다....이 페이지도 어려울 것은 없습니다. 코드는 insert.asp 와 거의 비슷할 것입니다만... insert.asp가 새로운 데이터를  Insert 하는 것이었다면,  Edit_result.asp은 기존의 데이터를 업데이트 하는 것이지요...

데이터를 업데이트 하는 방법도 쿼리로 하는 방법,. 레코드셋의 update 메소드를 이용하는 방법이존재하는데, 여러분은 이미 쿼리로 하는 방법은 수많은 게시판 강좌들로 인해서..익히 알고 계실 것이고, 만에 하나 모른다고 하더라도..쉽게 그러한 자료나 강좌는 구할 수 있을 것이기에여기서는 레코드셋의 Update 메소드를 사용하는 방법으로 해보도록 하겠습니다. 참고로 이 방법은 쿼리를 사용하는 방법보다는 조금 성능이 떨어집니다.. 하지만, 복잡한 코드를 관리할 경우나 디버깅 차원에서는 이롭다고 볼 수 있지요.

자... 그럼 소스를 볼까요?

Edit_Result.asp

<!--METADATA TYPE= "typelib" NAME= "ADODB Type Library"
    FILE="C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" -->
<% Option Explicit %>
<!--#include file="config.asp"-->
<%
    Dim name, mail, title, url, memo, board_idx, Gotopage

    Gotopage = Request.Form("Gotopage")
    board_idx = Request.Form("board_idx")
    name = Request.form("name")
    mail = Request.form("mail")
    title = Request.form("title")
    url = Request.form("url")
    memo = Request.form("memo")

    Dim adoRs, strSQL
    Set adoRs = Server.CreateObject("ADODB.RecordSet")

    strSQL = "Select * from MyBoard where board_idx=" & board_idx
    adoRs.Open strSQL, strConnect, adOpenStatic, adLockPessimistic, adCmdText

    with adoRs
        .Fields("b_name") = name
        .Fields("b_email") = mail
        .Fields("b_title") = title
        .Fields("b_url") = url
        .Fields("b_ipaddr") = Request.ServerVariables("REMOTE_ADDR")
        .Fields("b_content") = memo

        .Update
        .Close
    end with

    Set adoRs = nothing

    Response.redirect "list.asp?Gotopage=" & Gotopage
%>

소스를 보면 그다지 어려운 부분은 없을 것입니다...... 이미 이전 강좌들을 통해서 이야기되었던, 타입 라이브러리와 Option Explicit... 등이니까요.. 단지, 이번 소스에서 관심을 가져야 하는 부분은 레코드셋의 커서타입입니다.

우리는 쿼리를 통한 업데이트가 아닌 레코드셋의 update 메소드를 통한 업데이트를 하고 있기에 레코드셋의 커서타입을 수정이 가능한 모드로 열어야 합니다. 락타입도 마찬가지이구요 소스중에는 그 부분이 다음과 같이 되어져 있을 것입니다.

strSQL = "Select * from MyBoard where board_idx=" & board_idx
adoRs.Open strSQL, strConnect, adOpenStatic, adLockPessimistic, adCmdText

우리가 수정하고자 하는 특정 레코드만을 레코드셋에 담아야지만.. 레코드셋 객체를 통해서 수정할 수 있을 것이기에... 쿼리는 해당 레코드만을 가져오는 쿼리로 작성하고 있음을 볼 수가 있습니다. ^^

그리고, 레코드셋을 오픈하고 있습니다만.. 오픈시 커서타입을 adOpenStatic 으로 주고 있습니다. 반드시, 스태틱 커서로 열 필요는 없으며, 키셋(adOpenKeyset)이나  다이내믹(adOpenDynamic)으로도 열 수 있습니다만,  ASP 의 경우에서는 주로 스태틱 커서가 많이 사용되는 편입니다. 웹 환경에서는 이 커서타입이 삽입,수정,삭제시 가장 적절하다고 볼 수 있으니까요....  그리고, 락타입도.. 조금은 제한적인 adLockPessimistic 으로 했습니다.

사람마다 조금씩 취향이 다를 수 있고, 튜닝시 이 커서타입의 지정을 달라질 수 있습니다만 어떤 경우 어떤 커서타입과 락타입을 사용하라.. 는 정답은 없습니다. 개발 상황과 스펙, 그리고 성능 테스트의 결과에 따라.. 조금씩 적절한 커서,락 타입은 달라질 수 있으니까요.. 하지만, 저는 일반적인 코드에서는.. 위처럼 사용하고 있습니다.

어쨋든 이제 위의 코드의 결과로.. 레코드셋에는 오직 하나의 레코드가 담긴 모습이 되었습니다.  그리고, 현재의 레코드 포인터 위치는 첫 레코드인 그 레코드를 가르키고 있구요... 해서, 이제부터 레코드의 컬럼값들을 변경하면... 그 변경내용은.. 메모리상에 존재하는 현재의 레코드셋의 각각의 컬럼의 값들을 변경시키게 됩니다.

즉, 다음과 같은 코드들로 인해... 현재의 레코드셋안의 컬럼값들은 모두 변경되게 되지요 사용자가 수정한 값으로 말입니다.

.Fields("b_name") = name
.Fields("b_email") = mail
.Fields("b_title") = title
.Fields("b_url") = url
.Fields("b_ipaddr") = Request.ServerVariables("REMOTE_ADDR")
.Fields("b_content") = memo

하지만, 현재까지의 상태는... 메모리상의 레코드셋 개체안의 데이터만이 변경된 상태입니다. 실제 데이터베이스에 존재하는 값은 아직 예전 모습 그대로이지요.. 해서 그 다음에 이어지는 레코드셋 개체의 Update 메소드에 주목할 필요가 있습니다. 이 메소드가 바로 현재 메모리상에 존재하는 변경된 레코드셋의 데이터를... 실제 데이터베이스 서버에 적용하는 역할을 하니까요...

반드시 Update 메소드를 지정해 주셔야 합니다. 그래야 실제로 데이터가 반영되니까요..  ^^

그리고, 이제 모든 데이터가 수정되었다면...다시금 리스트 페이지로 돌려보냅니다... 어렵지 않았죠?  ^^....  지금은 새벽 2시 입니다....  너무 오랫동안 문화생활을 못 해서리.. 오늘 위의 Edit 강좌를 마친 뒤, 아내(이제 아내된지 10일된)와 함께 심야극장에 갔다왔습니다.

제목은 엑소시스트2000.. 알고보니 1973년도에 개봉했었던 영화를 재개봉하는 것이라네요.. 거의 20년 전의 영화인데도... 무척 재미있게 보았습니다. 명작은 시간이 지나도 찾는구나.. 라는 생각을 했답니다...  그러면서 지금의 저도 한번 돌아보았죠.. 많은 생각이 들더군요.. 해서, 머리에 갑작스런 CPU 처리속도 증가로....  다운이 되면서... 잠에 빠져들었답니다. 그리고, 개운한 정신에 다시금 강좌를 이어씁니다...

이제 해야할 것은 무엇일까요? 그렇습니다... 선택한 글을 삭제하는 것입니다....  ^^ 그렇습니다. del_ok.asp...   파일이름이 맘에 안든다구요..?  그렇다면, 맘에 드는 이름으로 바꾸셔도 상관은 없습니다. 어쨋든 저는 del_ok.asp 입니다.  그 소스를 공개합니다....

Del_Ok.asp

<!--METADATA TYPE= "typelib" NAME= "ADODB Type Library"
    FILE="C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" -->
<% Option Explicit %>
<!--#include file="config.asp"-->
<%
    Dim Gotopage, board_idx, pwd
    Gotopage = Request.Form("Gotopage")
    board_idx = Request.Form("board_idx")
    pwd = Request.Form("pwd")

    Dim adoRs, strSQL
    Set adoRs = Server.CreateObject("ADODB.RecordSet")

    strSQL = "SELECT board_idx from MyBoard "
    strSQL = strSQL & " where board_idx=" & board_idx & " and b_pwd='" & pwd & "'"

    adoRs.open strSQL, strconnect, adOpenStatic, adLockPessimistic, adCmdText

    if adoRs.BOF and adoRs.EOF then '만일,조건에 해당 레코드가 없다면(비밀번호가 안 맞는다면)
        Response.Write "<script language=javascript>"
        Response.Write " alert('비밀번호가 일치하지 않습니다');"
        Response.Write " history.back();"
        Response.Write "</script>"
        Response.End
    else '비밀번호가 일치한다면...
        adoRs.delete
        adoRs.close
        Set adoRs = nothing
    end if

    Response.redirect "list.asp?Gotopage=" & Gotopage
%>

저의 경우는 역시나 이번 예제도 RecordSet 객체의 delete 메소드를 사용해서 해 보았는데요.. 이 방법을 사용하면 데이터베이스 측으로 한번의 쿼리만을 날리면 되기 때문에.. 이 방법을 사용한 것도 있지만, 레코드셋 객체의 여러 메소드들을 소개하려는 의미도 있답니다. ^^

급하게 강좌를 준비하다 보니... 이번 강좌는 조금은 약해보이기도 하는데요..  내용이 그리 어려운 것들이 아니기에 큰 문제는 없지 않나 생각해 본답니다.  ^^ 어쨋든 이번 강좌로 기본적인 게시판이 모습을 갖추었는데요

다음 강좌에서는 이제... 기존의 게시판 모습에 여러가지 살을 한번 붙여보도록 하구요.. 살을 붙이기가 어느정도 이루어진 다음에는 자료실을 접목해 보도록 하겠습니다. 그동안 관심을 가져주시고 기다려주신 분들꼐 무척 감사드리며.. 더욱 성실한 강좌를 준비하도록 하겠습니다. 그럼 다음 강좌에서 뵈어요...


authored by


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

로딩 중입니다...

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