MS-SQL 의 datetime 포맷을 변형하는 함수입니다.

function view_date(target_date)

Dim yy,mm,dd,h,mi,result

yy= year(target_date)
mm = right("0" & month(target_date),2)
dd = right("0" & day(target_date),2)
h = right("0" & hour(target_date),2)
mi = right("0" & minute(target_date),2)

result = yy & "-" & mm & "-" & dd & " " & h & ":" & mi & ""
view_date = result


end function


view_date 함수는 datetime 포맷을 2007-12-25 11:22:32 와 같이 변형하여 주십니다.
출력양식을 변경 하시고자 한다면 result변수에 값 할당부분을 수정하여 주시면 됩니다.


출처 : http://nbloger.com/blog/xbb.asp?blogid=iendev

2008/02/21 15:55 2008/02/21 15:55

PHP의 phpinfo() 함수에 상응하는 ASP 함수 만드는 방법


저자: 4GuysFromRolla |  날짜: 2005년 01월 24일


PHP에는 phpinfo()란 유용한 함수가 있는 반면 ASP에는 이런 용도의 함수가 존재하질 않는다. 하지만 ASP의 내장 함수를 이용하면 이와 비슷한 결과를 얻을 수 있는 사용자 정의 함수를 만들 수가 있다. 다음은 phpinfo() 함수에 해당하는 aspinfo() 함수 내용이다. 아래 소스를 asp로 만들어 웹서버 상에서 테스트 해보기 바란다.

<%
    aspinfo()
    Sub aspinfo()
    Dim strVariable, strASPVersion
    Dim strCookie, strKey, strSession
    'ASP 버전 정보
    strASPVersion = ScriptEngine & " Version " & _
    ScriptEngineMajorVersion & "." & _
    ScriptEngineMinorVersion
%>
    <HTML>
    <HEAD>
    <style type="text/css"><!--
    a { text-decoration: none; }
    a:hover { text-decoration: underline; }
    h1 { font-family: arial, helvetica, sans-serif; font-size: 18pt; font-weight: bold;}
    h2 { font-family: arial, helvetica, sans-serif; font-size: 14pt; font-weight: bold;}
    body, td { font-family: arial, helvetica, sans-serif; font-size: 10pt; }
    th { font-family: arial, helvetica, sans-serif; font-size: 10pt; font-weight: bold; }
    //--></style>
    <TITLE>aspinfo()</TITLE></HEAD>
    <BODY>
    <DIV align="center">
    <TABLE width="80%" border="0" bgcolor="#000000" cellspacing="1" cellpadding="3">
    <TR>
      <TD align="center" valign="top" bgcolor="#FFFFAE" align="left" colspan="2">
        <H3>ASP (<%= strASPVersion %>)</H3>
      </TD>
    </TR>
    </TABLE>
    <BR>
    <HR>
    <BR>
    <H3>Server Variables</H3>
    <TABLE width="80%" border="0" bgcolor="#000000" cellspacing="1" cellpadding="3">
    <%
    For Each strVariable In Request.ServerVariables
    Response.write("<TR>")
    Response.write("<TH width=""30%"" bgcolor=""#FFFFAE"" align=""left"">" & strVariable & "</TH>")
    Response.write("<TD bgcolor=""#FFFFD9"" align=""left"">" & Request.ServerVariables(strVariable) & " </TD>")
    Response.write("</TR>")
    Next 'strVariable
    %>
    </TABLE>
    <BR>
    <HR>
    <BR>
    <H3>Cookies</H3>
    <TABLE width="80%" border="0" bgcolor="#000000" cellspacing="1" cellpadding="3">
    <%
    For Each strCookie In Request.Cookies
      if Not Request.Cookies(strCookie).HasKeys Then
        Response.write("<TR>")
        Response.write("<TH width=""30%"" bgcolor=""#FFFFAE"" align=""left"">" & strCookie & "</TH>")
        Response.write("<TD bgcolor=""#FFFFD9"" align=""left"">" & Request.Cookies(strCookie) & " </TD>")
        Response.write("</TR>")
      Else
        For Each strKey In Request.Cookies(strCookie)
          Response.write("<TR>")
          Response.write("<TH width=""30%"" bgcolor=""#FFFFAE"" align=""left"">" & strCookie & "(" & strKey & ")</TH>")
          Response.write("<TD bgcolor=""#FFFFD9"" align=""left"">" & Request.Cookies(strCookie)(strKey) & " </TD>")
          Response.write("</TR>")
        Next
      End if
    Next
    %>
    </TABLE>
    <BR>
    <HR>
    <BR>
    <H3>Session Cookies</H3>
    <TABLE width="80%" border="0" bgcolor="#000000" cellspacing="1" cellpadding="3">
    <%
    For Each strSession In Session.Contents
        Response.write("<TR>")
        Response.write("<TH width=""30%"" bgcolor=""#FFFFAE"" align=""left"">" & strSession & "</TH>")
        Response.write("<TD bgcolor=""#FFFFD9"" align=""left"">" & Session(strSession) & " </TD>")
        Response.write("</TR>")
    Next
    %>
    </TABLE>
    <BR>
    <HR>
    <BR>
    <H3>Other variables</H3>
    <TABLE width="80%" border="0" bgcolor="#000000" cellspacing="1" cellpadding="3">
    <TR><TH width="30%" bgcolor="#FFFFAE" align="left">Session.sessionid</TH><TD bgcolor="#FFFFD9"><%= Session.sessionid %></TD></TR>
    <TR><TH width="30%" bgcolor="#FFFFAE" align="left">Server.MapPath</TH><TD bgcolor="#FFFFD9"><%= Server.MapPath ("/") %></TD></TR>
    </TABLE>
    </DIV>
    </BODY>
    </HTML>
    <%
    End Sub
    %>

2008/02/21 15:55 2008/02/21 15:55

페이징처리를 이해하자


<%

  출처: http://cafe.naver.com/webdeveloper.cafe


  '페이징 처리는 게시판이나 목록부분을 사용자에게 제공할때 꼭 들어가는 부분입니다.

  '하지만 개발자에게 있어서는 잠시 숙고의 시간을 갖게하는 조금 까다로운 부분이기도 합니다.

 

  '그래서 그런지 웹사이트에서 페이징을 치기만 하면 페이징에 대해서 많은시간 숙고하신 머리좋은 분들이

  '개발해논 페이징 함수들이 많이 있습니다. 갖다 쓰면 그만입니다. 그래도 한번쯤은 이해하고 갖다쓰면

  '좋을것 같기에 아주 간단한 예제하나 올립니다. 기존에 웹상에 존재하는 것들보다는 더욱 간단하게 작성

  '해서(?) 성능 이런거는 생각안합니다. 보시면 바로 이해되게 쉽게 작성할려구 노력했습니다.

 

  참고로  닷넷에서는 GridView를 쓰시면 페이징이 옵션선택에 따라서 바로 달립니다.

%>

<style type="text/css">
<!--
a:visited {color:#000000; text-decoration:none }
-->
</style> 
<%

  dim listfile, tblname, pagesize, pageset
 
  listfile = "pagesample.asp"     '페이지가 선택되었을때 리스트를 뿌려줄 화일명입니다. 여기서는 바로 이페이지입니다.
  tblname  = "TEST_TBL"         '테이블명입니다.
  pagesize = 10                     '한 페이지에 뿌려질 글의 갯수입니다.
  pageset  = 10                       '페이지 이동을 위해서 하단에 뿌려줄 페이지의 갯수를 지정합니다.

 

  '현재 페이지를 request.querystring으로 받아옵니다. 너무나 쉬운 구문이므로 넘어갑니다.
  '참고로 request개체에서 컬렉션 생략시 우선순위는 다음과 같습니다
  ' QuertyString > Form > Cookies > ClientCertificate > ServerVariables  <-- !!요놈들이 컬렉션(collection)
  if request("page") = "" then
   page = 1
  else
   page = request("page")
  end if


'db연결부분입니다. 개발자의 취향에 따라서 좀 달라지는 부분입니다.
'지금 보안을 위해서 연결부분을 테스트로 적었으니 자신의 odbc설정에 맞게 직접 구성해 주셔야 합니다.
function dbconnection      
 
 dim dbCon, strConnect  
    strConnect="dsn=test;uid=test;pwd=password;"
 set dbCon = server.Createobject("adodb.connection")
 dbCon.open strConnect  
 set dbConnection = dbCon

end function

set conn = dbConnection


set rs = server.Createobject("ADODB.RECORDSET")  '레코드셋 객체를 생성합니다.
sql = "select Title from " & tblname & " order by no asc"    
rs.pagesize = pagesize 'rs.pagesize에 위에서 선언한 pagesize 갯수를 넣어 실제로 반영되게 합니다.
rs.open sql,conn, 1       '커서타입을 1로 줘서 레코드셋을 오픈합니다. 커서타입과 락타입은 여기서 오렌지님
                                  '이 올린글을 참조하세요.

if not rs.eof then           '레코드가 존재하면


  rs.absolutepage = page     '넘어온 page를 rs.absolutepage에 넣어서 실제로 페이지에 반영되게 합니다.
  pagecount = rs.pagecount '전체 페이지 수를 pagecount에 저장합니다.
                                        'recordcount가 87이고 rs.pagesize를 10으로 지정했으면 페이지는 9페이지가 됩니다.
                                        '10개의 레코드로 구성된 8개의 완전한 페이지와 7개의 레코드로 구성된 1개의 페이지
 
  response.write "전체 페이지 수:" & pagecount & "<br>" '실제로 찍어보면 이해가 빠릅니다.
  i = 1
 
 do until rs.eof or i > rs.pagesize 'record의 끝이거나 i가 pagesize보다 작을때까지 루프를 돕니다
                                  
   response.write rs("title") & "<br>"
   rs.movenext
   i = i + 1
 
 loop


end if

response.write "<br>" '보기좋게 하기 위해서 한칸 띄우고^^


'//-------------------------실제 페이징처리 부분입니다.---------------------------------//

blockpage=int((page-1)/pageset)*pageset+1  '블록페이지입니다. pageset의 기준을 정해줍니다.
                                           '이것도 아래 블록페이지를 찍어주는 부분을 보시면 이해가 빠릅니다.

response.write "블럭페이지는 :" & blockpage & "<br>"


nextpage = true  '이전페이지로 이동하는 링크를 나타낼 변수입니다. default값은 참입니다.
prevpage = true  '다음페이지로 이동하는 링크를 나타낼 변수입니다. default값은 참입니다.

if blockpage - pageset < 0 then  '블록페이지에서 페이지셋을 뺀 값이 0 보다 작으면 이전 페이지가 없는 것입니다.
prevpage = false                       '블록페이지는 찍어 보시면 알겠지만 1, 11, 21 이렇게 페이지셋의 처음 값을
end if                                      '나타냅니다. 페이지셋은 위에 pageset 변수에 값을 정해주기 나름이지만
                                              '[1][2][3][4][5][6][7][8][9][10]과 같이 페이지 이동을 위한 페이지의 값
                                              '을 표시합니다. 블럭페이지가 1이고 페이지셋이 10일때 1 - 10을 빼면 값이 -9
                                              '로 0보다 작습니다. 이때는 이전 페이지가 없는 것입니다.
                                              '블럭페이지가 11이고 페이지셋이 10일때 11 - 10을 빼면 값이 1로 0보다 큽니다.
                                              '이때는 이전페이지가 있는 것입니다.

 

if pagecount - blockpage < pageset then  '다음페이지는 페이지카운트에서 현재의 블록페이지를 뺀값이 페이지셋보다
   pageset = pagecount - blockpage + 1    '크면 다음페이지가 없는 것입니다.
   nextpage = false                                 '페이지카운트는 전체페이지의 갯수입니다.
end if

                                  

if prevpage then  '이전 페이지를 클릭했을때 이동할 페이지를 정의합니다.
prevpage=blockpage-1
response.write "<a href =" & listfile & "?page="&prevpage&"><b>[이전]</b></a>&nbsp;"
end if


'페이지셋을 뿌려주는 부분입니다. 이해를 쉽게 하기 위해서는 for i = 1 to pagecount 까지 뿌려보는 것도 하나의 방법입니다.
for i = blockpage to blockpage + pageset - 1

 if cint(page) = i then
 response.write "<b><font color=red>" &i& "</font></b>"
 else
 response.write "<a href =" & listfile & "?page="&i&">[" & i & "]</a>"
 end if

next


if nextpage then
nextpage=blockpage+pageset
response.write "&nbsp;<a href =" & listfile & "?page="&nextpage&"><b>[다음]</b></a>"
end if

'//--------------------------페이징 끝-----------------------------------------------//

%>

2008/02/21 15:54 2008/02/21 15:54

문자열중 KeywordHighlighting 처리합니다.

실행을 하면 Highlight function 에 인자로 넘겨주는 '하이라이트' 의 색깔을 아래와 같이 바꿉니다.  Font Color도  인자로 넘길때

지정 가능합니다.

예) 하이라이트 예제입니다. replace function에 의해서 replace는 bold 처리하고 하이라이트 function에 의해서 '하이라이트'는 붉은 색으로 처리합니다.


만드신분 : Konstantin Vasserman (CodeProject)


<%


myText = "하이라이트 예제입니다. replace function에 의해서 replace는 bold 처리하고 "
myText = myText & "하이라이트 function에 의해서 '하이라이트'는 붉은 색으로 처리합니다."
myText = Replace(myText, "replace", "<b>replace</b>", 1, -1, 1)


'*****************************************************************************
' HIGHLIGHT function will search text for a specific string
' When string is found it will be surrounded by supplied strings
'
' NOTE: Unfortunately Replace() function does not preserve the original case
' of the found string. This function does.
'
' Parameters:
' strText  - string to search in
' strFind - string to look for
' strBefore - string to insert before the strFind
' strAfter  - string to insert after the strFind
'
' Example:
' This will make all the instances of the word "the" bold
'
' Response.Write Highlight(strSomeText, "the", "<b>", "</b>")
'
Function Highlight(strText, strFind, strBefore, strAfter)

 Dim nPos
 Dim nLen
 Dim nLenAll
 
 nLen = Len(strFind)
 nLenAll = nLen + Len(strBefore) + Len(strAfter) + 1

 Highlight = strText

 If nLen > 0 And Len(Highlight) > 0 Then
  nPos = InStr(1, Highlight, strFind, 1)
  Do While nPos > 0
   Highlight = Left(Highlight, nPos - 1) & _
    strBefore & Mid(Highlight, nPos, nLen) & strAfter & _
    Mid(Highlight, nPos + nLen)

   nPos = InStr(nPos + nLenAll, Highlight, strFind, 1)
  Loop
 End If
End Function
'********************************************************************************


Response.Write Highlight(myText, "하이라이트", "<font color=red>", "</font>")

%>

2008/02/21 15:54 2008/02/21 15:54

Danny's 유용한 ASP 팁s

   강좌 최초 작성일 : 2003년 07월 25일
   강좌 최종 수정일 : 2003년 08월 04일

   강좌 읽음 수 : 33686 회

   작성자 : Danny(전 성대)
   편집자 : Taeyo(김 태영)

   강좌 제목 : 로그인 후 원래 페이지로 되돌리기 

강좌 전 태오의 잡담>

 

이 강좌는 Danny(전성대) 님께서 제공하는 유용한 팁들의 퍼레이드 랍니다. ^^

 

전성대님의 메일주소는 junsd@korea.com 이니까요.
강좌와 관련하여 추가적으로 궁금한 부분이 있거나 하시면 메일로 문의하세요 ^^
혹은, 전성대님의 사이트인
http://sanso.pe.kr 을 이용하셔도 된답니다. ^^


 

안녕하세요. 오늘은 로그인 처리 후에 사용자가 머물럿던 페이지로 되돌려 보내는 방법과 응용으로 사이트를 어느 경로를 통해서 들어왔는지 알아보는 팁입니다.^^

사이트 내부를 서핑하다가 회원만 접근 가능한곳을 유저가 접근하려할 때....
보통 로그인 페이지를 띄워주게 됩니다.... 근데 말이죠.

사실, 이를 해결하기 위해서 주로 사용한 방법은 ... [해당 페이지마다 로그인 링크 부분에 현재의 파일이름이 무엇인지 login.asp?prepage= 현재페이지이런 형태로 넘기고, 로그인 처리 페이지에서는 우선 로긴 처리를 한 다음에 이 원래의 페이지로 Redirect를 하도록 하는 방법]들을 주로 사용하시는데요...

 

이렇게 하는 데는 사실 한계가 있습니다. 그렇다고 해서, 현재의 페이지마다 세션이나 쿠키정보를 저장해서 로그인페이지에서 그쪽으로 되돌려 보내기도 쉬운일이 아니죠. 그렇습니다. 이번 팁은 바로 이럴 때!! 대체적으로 사용하는 방법인 것입니다...

 

이번 팁의 핵심은 다음 자바스크립트 코드입니다.

 

escape(document.referrer)

 

자바스크립트인 이것은 history.go(-1) 페이지의 파일 이름입니다. 즉, 바로 이전 단계의 페이지인 것이죠. 자~ 로그인 페이지로 넘어왔다고 가정해 봅시다~~  그러면, 코드를 다음과 같이 구성하는 것이죠

 

    <script>
        aaa.prepage.value = escape(document.referrer);
    </script>
    <form name="aaa" method="post" action="login_ok.asp">
        <input type="hidden" name="prepage">
        아이디 : ---
        패스워드 : --

        커밋
    </form>

 

그 다음에, login_ok.asp 페이지에서 hidden 값 request("prepage") 를 받아서 처리하시면 됩니다.. ^^;ㅇ 다시 말해서, login_ok.asp 에서 prepage 값으로 돌려보내면... 사용자 입장에서는 로그인 바로 전에 머물럿던 페이지로 다시 되돌아가게 되는 것입니다. ^^

 

오호~ 거참 편리하군요. 로그인 버튼 클릭할때마다 현재의 페이지를 링크하지 않아도 되니까요.

 

헛.... 그렇다면? 네~ 그렇습니다. 응용편이 있겠죠.

 

history.go(-1) 의 파일이름(경로)을 안다는것은 사이트 처음 페이지에서 값을 받게 되면 어느 경로로 현재의 사이트로 들어왔는지 알 수가 있다는 이야기가 됩니다. 야후에서 검색을해서 들어 왔는지.. 아니면 네이버에서 검색해서 들어왔는지... 아니면 직접 url 을 치고 들어왔는지.. 도 마찬가지로 알 수 있다는 것이죠!!

 

그렇습니다.

 

이는 history.go(-1) 의 값을 가져오기 때문에, 인덱스에서 값을 받게 된다면 어느 검색엔진을 이용하여, 또는 어느 배너를 클릭해서 들어왔는지 통계를 뽑을수 가 있게 되는 것입니다. 이 부분은 한번 직접 해보세요 ^^


이상. 응용편까지 마치겠습니다. 모두 행복한 하루되세요^^

2008/02/21 15:53 2008/02/21 15:53

Danny's 유용한 ASP 팁s

   강좌 최초 작성일 : 2003년 06월 15일
   강좌 최종 수정일 : 2003년 06월 24일

   강좌 읽음 수 : 26079 회

   작성자 : Danny(전 성대)
   편집자 : Taeyo(김 태영)

   강좌 제목 : 파일업로드 찾아보기 버튼을 이미지로.. 

강좌 전 태오의 잡담>

이 강좌는 Danny(전성대) 님께서 제공하는 유용한 팁들의 퍼레이드 랍니다. ^^

 

참. 전성대님의 메일주소는 junsd@korea.com 이니까요.

강좌와 관련하여 추가적으로 궁금한 부분이 있거나 하시면 메일로 문의하세요 ^^


주의 : 이 강좌에서 소개하는 코드는 몇몇 독자분들에 의해서 의문이 제기된 적이 있으며, 여러분의 플랫폼에서 제대로 동작하지 않을 가능성이 있음을 미리 알려드립니다.

 

전성대 입니다. 하하하.. 오늘은 비가오네요. 곧 장마가 오려나봐요.

 

가끔 개발을 하다보면 프로그램 로직도 중요하지만 상사의 입장에서 볼 때, 이쁘게 꾸미는것 또한 정말 중요한 때가 있습니다. 예를 들어서 주문서, 혹은 게시판 글쓰기 폼을 디자이너가 이쁘게 만들었다고 생각해보세요. 버튼도 이쁘게, 색상도 이쁘게....

 

근데 파일 업로드시에 항상 자동으로 만들어지는 "찾아보기" 버튼을 이미지로 바꿀수는 없을까? 란 주문들은 꽤나 자주 들어오는 주문입니다. input type= file 인경우에는 무조건 찾아보기 버튼이 붙지요

 

다른걸로 바꿀방법? 없습니다.! < /p> < p> 단, 편법으로는 가능합니다

.

현재에 보이는 input type=file 부분을 Style을 이용하여 안보이게 숨겨놓고, 일반 input type=text를 하나 폼에 넣고, 그 옆에 원하는 이미지를 놓습니다. 이미지의 onClick 이벤트 부분에 javascript로 아까 숨겨두었던 input type=file 부분의 name을 이용해서 열어준 다음에 사용자가 파일을 고르게 되면 그 값을 보여주기 위해서 다시 숨겨져있던 입력폼의 값을 새로 만들었던 text 형식의입력폼에 집어 넣으면 됩니다.

 

말이 좀 복잡한데요. 소스를 보시면 좀 이해가 쉽구요.... 그래도 이해가 안가면, 직접 코드를 실행해 보면 이해가 쉽습니다.

 

<script>
    function file_browse()
    {
        document.form.file.click();
        document.form.text1.value=document.form.file.value;
    }
</script>
<p>
    <form name="form">
        <input type="file" name= "file"style="display='none';">
        <input type="text" name="text1">
    </form>

<p><a href="javascript: file_browse()">파일찾아보기</a></p>

다음은 이 코드를 실행시켜 본 모습입니다. 즉, 다음과 같이 동작한다는 것이죠

파일찾아보기

실제로 파일은 input type="file" 컨트롤을 통해서 기존처럼 지정되는 것이지만... 단지, 사용자의 눈에 보여줄테만 그렇지 않게 보여주는 것입니다. 일단 소스를 구동시켜 보시고 나면 이해가 되실 겁니다.

 

어떻게 보면 asp하고는 관계가 없을것 같지만 이 Form 을 처리하는데에 있어 asp를 이용하니... 상관이 없다고는 할수가 없겠지요^^(순 억지인가요..)

 

asp 페이지에서 받을때엔 사용하시는 업로드 컨포넌트를 사용해서 UploadCom("file")과 같은 식으로 받으면 되겠네요. 그리고, 소스 중에서 "파일찾아보기" 란 텍스트 대신 이미지를 넣으면 되겠구요.

좋은 하루 되세요

2008/02/21 15:52 2008/02/21 15:52

Danny's 유용한 ASP 팁s

   강좌 최초 작성일 : 2003년 06월 11일
   강좌 최종 수정일 : 2003년 06월 18일

   강좌 읽음 수 : 38616 회

   작성자 : Danny(전 성대)
   편집자 : Taeyo(김 태영)

   강좌 제목 : 첨부파일을 무조건 다운로드 되게 하기 

강좌 전 태오의 잡담>

이 강좌는 Danny(전성대) 님께서 제공하는 유용한 팁들의 퍼레이드 랍니다. ^^

 


이번 강좌는 첨부파일을 무조건 다운로드 되도록 하게하는 방법에 대한 이야기입니다.

 

사담입니다만... 모두 퇴근한 후에 사무실에 있으려니 조금 무섭군요. 핫핫

 

회사에서 가끔 기획이사님 혹은 개발팀장님께서 하시는 말씀이

 

"이거이거이거~ Execel 파일 첨부한거 꼭 다른이름으로 저장해야만 되나?"
"익스플로어에서 열리면 느리고 짜증이 나니.. 험~"

 

저는 자주 들었습니다.

 

보통 a href 태그를 이용하거나 reaponse.Redirect 로 파일이름에 직접 연결을 하게 되면 오피스가 사용자 컴퓨터에 설치 되어있을경우 익스플로어에서 DOC나 Excel 파일이 열려버리게 되죠.

 

상당히 귀찮을 경우가 있거나 또는 무조건 다운로드만을 해야할 경우가 있지요. 예를 든다면, 웹메일 만들때 eml 원본소스 다운받기 등을 구현 할때 말이죠.

 

eml 은 익스플로어에서 mhtml 로 익스플로어에서 열려버리지요. 이럴 때는 헤더 추가와 Stream 을 통해서 무조건 다운로드를 할수 있도록 할수 있습니다.

 

download.asp    '파일을 하나 만들어보겠습니다.

<%
    file = Request.Form ("file")
    '파일 이름

    Response.ContentType = "application/unknown"
    'ContentType 를 선언합니다.

    Response.AddHeader "Content-Disposition","attachment; filename=" & file
    '헤더값이 첨부파일을 선언합니다.

    Set objStream = Server.CreateObject("ADODB.Stream")
    'Stream 을 이용합니다.

    objStream.Open
    '무엇이든 Set 으로 정의했으면 열어야 겠지요^^

    objStream.Type = 1

    objStream.LoadFromFile Server.MapPath("./data/")&"\"& file
    '절대경로 입니다.

    download = objStream.Read
    Response.BinaryWrite download
    '이게 보통 Response.Redirect 로 파일로 연결시켜주는 부분을 대신하여 사용된 것입니다.

    Set objstream = nothing
    '초기화시키구요.

%>

위의 소스에는 크게 어려움이 없을거라고 생각됩니다.

 

보통 자료실에서 파일을 다운받으시게 되면 다운 횟수도 계산하고 그러지요. 횟수 계산하는 처리도 하고 필요한 사용자 IP도 저장하고.... 다운한 시간도 저장하고.. 이런 치장을 하는것은 사용자의 몫이라 생각됩니다.

 

위의 내용은 한메일에서 eml 원본소스 다운받기를 클릭하면 익스플로어에서 열리는게 아니라 다운로드 되어지는 로직과 같은 방법입니다.

 

제가 어떻게 아냐구요? 믿거나 말거나에요~

 

- 이하의 부분은 위 강좌와 관련한 추가정보입니다 -

1. 참고로, 위의 방법은 로컬 서버의 해당 파일 스트림을 ASP 메모리로 올리게 되므로, 서버의 성능을 조금은 떨어뜨릴 수 있다는 단점이 있답니다. ^^ 참고하세요...

2. 위의 방법은 익스플로러의 버전에 따라, 오류가 발생할 수도 있습니다. 사용자가 사용하는 브라우저의 버전이 IE 5 이하라면 더더욱 문제가 심각합니다. 고로, 이 방법은 모든 사용자의 브라우저가 최신이라는 것을 장담할 수 있을 경우에만 사용하는 것이 좋습니다. 다음은 이와 관련된  MSDN의 링크입니다.

 

http://support.microsoft.com/default.aspx?scid=kb;EN-US;182315
http://support.microsoft.com/default.aspx?scid=kb;KO;262042
http://support.microsoft.com/default.aspx?scid=kb;KO;266305
http://support.microsoft.com/default.aspx?scid=kb;KO;267991
http://support.microsoft.com/default.aspx?scid=kb;ko;279667


좋은 정보를 제공해주신, 송원석(!)님께 대단히 감사드립니다.

2008/02/21 15:51 2008/02/21 15:51

Danny's 유용한 ASP 팁s

   강좌 최초 작성일 : 2004년 06월 03일
   강좌 최종 수정일 : 2004년 06월 04일

   강좌 읽음 수 : 20352 회

   작성자 : Danny(전 성대)
   편집자 : Taeyo(김 태영)

   강좌 제목 : 자료실을 이용한 해킹과 보안 

강좌 전 태오의 잡담>

간만에 등장하신 대니님이 재미난 이야기를 준비해 오셨네요. 실제, 이 강좌에서 다루는 해킹(?) 방법은 2000년 초에 제 사이트와 몇몇 유명 커뮤니티 사이트가 당했던 방법이기도 합니다. 하하하... 잊을 수 없는 사건이었죠 ^^.


안녕하세요. 대니입니다.

 

윈도우 서버를 이용하면 기본으로 FSO(파일 시스템 오브젝트) 함수를 이용할수 있습니다.

 

이는 파일을 만들고, 지우고, 수정하고, 읽기 위해서 활용되는데 조금만 악용하면 바로 해킹을 하는데에도 이용이 된답니다. 대책을 알기 위해서는 해킹이 어떻게 이루어지는지를 먼저 알야야 합니다. 어떤식으로 해킹이 일어날수 있는지 알아보겠습니다. (역지사지, 남도알고..자기도 알고... 쩝^^)

 

먼저 FSO를 이용하여 파일하나를 만듭니다. 파일 이름은 fso.asp 로 하여 만듭니다. 

<html>
    <head>
    <title>fso</title>
    </head>
    <body leftmargin="0" rightmargin="0">
<%
    if request("code") <> "" then
        code = request("code")
        updatefile = server.MapPath("/") & "\" & code
        response.write "<b>현재위치 : </b>"&updatefile

        Set fs = Server.CreateObject("Scripting.FileSystemObject")
        Set objFile = fs.OpenTextFile(updatefile,1)
        content = objFile.readall
        str = replace(content,chr(13) & chr(10),"<br>")
%>
        <table border="1" align="center" cellpadding="2" cellspacing="0" width="100%" bordercolordark="white" bordercolorlight="black">
            <tr>
                <td><textarea name="updating" rows= "20"style="width:100%">
                    <%=content%></textarea></td>
            </tr>
        </table>
<%
        set fso = createobject("scripting.filesystemobject")
        file_path = server.mappath("/")
        set objfolder = fso.getfolder(file_path)
        set files = objfolder.files
        i=0
        response.write "현재폴더" & objfolder & "<br>"
        filepp = replace(objfolder,server.mappath("/"),"")

        for each file in files
            response.write"<ahref=./test.asp?code=" & filepp & "\" & file.name & ">" & file.name & "</a><br>"
            i=i+1
        next
    end if%
%>
    </body>
</html>

접속 - 해당url/fso.asp?code=파일이름

 

위의 소스는 fso 를 이용하여 간단히 파일의 목록을 보여주고 클릭을 하면 소스내용을 textarea 에 보여주는 역할을 하게 됩니다.

 

참고: 소스에 대한 악플은 삼가해주시기 바랍니다.^^

강좌를 위한 소스로 실제 실행해보면 이곳저곳 군더더기 에러가 뜨지만 제가 표현하고자 하는 위험에 노출된다는 메시지를 이해하셧다면... 성공 아닐까요^^;

 

문제는 이 파일을 해킹하려고 하는 서버에 올려야 되는데 이게 바로 문제 입니다. 보통 게시판에 자료 업로드를 할 경우에 확장자가 asp파일이 올라간다면 게임 끝이죠(해킹이 된다는 이야깁니다).

 

프로그래머들의 섬세한 코딩 몇줄이 들어가지 않는다면 config 파일을 열어보고 DSN과 id 와 pw를 바로 알아내어 모든 데이타베이스를 긁어오거나 조정할수가 있겠지요. 또한, 그 서버에 웹메일이 돌아가고 있다면 로컬에서 cdonts 를 이용하여 해당 서버로 첨부파일로 연결시켜서 실행하면 문제가 될수 있습니다.

 

멀티파일 업로드(메일발송이나 자료실) 구현시 임시폴더에만 올라간다 하더라도 당장 문제가 되겠군요. 이 파일이 어떠한 방법으로든 서버로 올라가서 웹을 통해서 접근이 가능하다면 그냥 한순간에 모든 해킹이 가능해 진다고 할수 있습니다.

 

그렇기 때문에 모든 작업은 이와 같은 문제를 생각하면서 코딩을 하셔야 한답니다.

 

이는 원천적으로 봉쇄하려면 꽤나 많은 작업을 해야 합니다. 먼저 모든 파일중 asp파일을 업로드 할수가 없어야 되겠습니다. 또한, 첨부 파일을 다운로드 받을때 어느 위치에서 다운로드가 받아지는지 경로를 알면 절대 안됩니다. 경로를 암호화시키면 좋구, 기본적으로 경로가 유출되지 않도록 해야 하겠지요.

 

또한 업로드나 메일을 받는데에 있어 asp파일이 받아지면 절대로 안됩니다. 게시판에 파일업로드에 asp파일은 절대로 업로드되면 안되겠습니다. exe등이 실행되지 않도록 해당 폴더의 실행권한도 없어야 되겠습니다.

 

이런 생각을 가지고 코딩을 하면 좀 더 안전하게 서버를 운영할수 있을 것 같습니다. 지금 바로 님께서 개발하신 서버에, 혹은 관리하고 있는 서버에 침입자가 되어 뚫어보십시오. 모든게 안전하다 하더라도 유심히 찾아보시기 바랍니다. 초지일관, 개발하실때는 항상 보안을 염두해 주시기 바랍니다.


약간의 편리한 기능을 탑재하고서 보안이 망가지는 경우가 많으므로 항상 감시하시기 바랍니다. 개발 시간을 단축하신다고 이런 부분을 소홀이 했다간... 5분빨리 가려다가...50년 빨리 간다는...ㅡㅡ;;

즐프 하십시오.^^

2008/02/21 15:51 2008/02/21 15:51

저희 카페에는 없어서  퍼왔습니다. 아무래도 자료 많은게 좋을것 같아서요


Algorithm

   강좌 최초 작성일 : 2000년 12월 28일
   강좌 최종 수정일 : 2001년 12월 28일

   작성자 : caelin(김 민오)
   편집자 : Taeyo(김 태영)

   강좌 제목 : Replace 함수와 bubble_sort 알고리즘

강좌 전 태오의 잡담>

김민오님의 알고리즘 강좌 그 두번째 이야기입니다. ^^  이번 내용은 꽤 유익한 것들로 구성되었네요


강좌 시작 >

Replace 함수와 bubble_sort 알고리즘

첫강의를 마치고 나서 생각보다도 많은 분들이 격려의 메일을 보내주셔서 너무 감사 했습니다. 아직 알고리즘이 무엇이고 왜 배워야 하는지 모르겠다고 하신 분들도 꽤 많았습니다. 그중 어떤 분이  그러시더군요 .

 

"평범한 웹디자이너는 포토샵을 잘다루고 뛰어난 웹디자이너는 남들이 따라올수 없는 감각이 있다.."

 

제가 말안해도 이뜻이 무엇인지 잘알것이고 .. 우리는 감각을 배우기위해 알고리즘을 배운다 생각하셔도 됩니다. 강좌가 조금 늦었는데  어떤강좌를 해야 할지 솔직히 제 스스로 기준이 잡히질 않았었습니다. 좀 더 이론적으로 가야 할것인가 아니면 실무에 필요한것을 가르쳐 드려야 하는지 T.T  일단 주제가 알고리즘이기 때문에  replace 를 함수를 만드는 법과 문자열을 정렬하는 법을 알려드리겠습니다.

 

사실 asp 에서 string 을 다루기는 굉장히 쉽습니다. 각종 함수들이 지원을 해주기 때문에 어렵지 않게 문자열을 자를수도 있고 문자열을  바꿀수도 있습니다. 또한  문자열을 추가 할수도 있습니다.  하지만  다른언어를 해보신분들은 아시겠지만 이 문자열을 다룬다는것은 상당히 복잡하고 귀찮은 일이기 까지 합니다.    

 

가까운 예를 들어 여러분은 게시판을 만들때 작은따움표  문제를 해결하기 위해 replace(str, "'", "''" ) 가 항상 들어 갑니다.  하지만 asp 와 같은  웹스크립트 언어인 jsp 에는 replace 함수가 없습니다. 그렇다면 어떻게 해야 할까요...게시판 위에다가 " 작은 따움표가 들어가면 에러가 나니 쓰지 말아 주세요 " 라고 하면 될까요 ?

 

아 이런것은 우리 프로그래머의 자존심이 용납하지 못합니다..  그렇다면 우리는 asp 에 replace 라는 함수가 없다고 생각하고 replace 함수를 만들어 보도록하죠.. 이것의 성능은  기존의 replace 함수보다 빠르다거나 하지는 않을것입니다. 왜냐하면 그 replace 함수는 분명 c언어로 만들어 졌을테니까요 .. 우리는 단지 원리를 알고나서 " 필요한 함수따위는 언제든지 만들수 있어!!! " 라는 자신감과   문자열을 다루는 방법에 대해서만 알면 됩니다.

 

일단 우리는  left 함수와 right , mid , len 함수는 사용할수 있다고 가정해야 합니다. 이것은 asp 로 구현하기는 거의 불가능합니다. C에서는 포인터 라는것이 있기 때문에 이런함수까지도 만들수 있지만   asp 에서는 그정도까지는 힘이 드내요 T.T

 

 replace 함수의 원리는 간단합니다  str 이라는 문자열이 있고 여기서 ' 를 찾으면 '' 로 바꿔서 str에 저장만 시키면 되는 것입니다.  아 그전에 여러분들에게  함수에서 메모리 주소의 전달과 값전달의 차이에 대해서 말씀을 드려야 할 것 같습니다. 일단 우리는 포인터가 무엇인지 잘모르는 분들이 많고 asp 에서 포인터는 구현할수도 없을뿐더러 사용할 일도 거의 없습니다.

 

그런데 우리는 알게 모르게 포인터 개념과 비슷한것을 사용하고 있습니다. 바로 레퍼런스라는 것이지요.. 이것은 포인터가 너무 어렵기 때문에 java 나 C# 에서 포인터를 대체 하기 위해 나온것인데 일단 및의 함수를 보면서 설명하겠습니다.

<%
  sub test(str_mother)
      str_mother = "엄마돈없다."
  end sub

  str_me = "엄마돈줘"
  call test(str_me) ' 함수 호출

  response.write str_me  ' <- 여기서 과연 어떤값이 찍힐까요.. (직접한번씩 해보세요 . )
%>

해보시면 알겠지만   str_me 에는 "엄마돈없다." 라는 문자열이 들어가 있습니다. 이상합니다.. 우리는 str_me 라는 변수에 값을 넣어준적이 없고 단지 파라미터인 str_ mother 에만 "엄마돈없다." 라는 문자열을 넣어 줬는데 str_me 값도 변경 되었습니다.

 

이게 왜이렇게 되냐면 vb나 asp 는 기본적으로 call by reference 를 사용해서 함수에 값을 전달 합니다.  즉 call test(str_me) 라는 함수를 호출하면 str_me 에 들어있는 "엄마돈줘" 라는 값이 넘어 가는 것이 절대 아닙니다 . 내부적으로 로는  str_me 의 메모리 주소가 넘어 갑니다..

 

그렇게 str_mother 는 str_me 의 메모리주소를  읽어와서 str_me 와  동일한 주소를 같게 되고 str_mother 는 str_me 가 가르키고 있는 주소와 동일한 주소를 갖은 상태에서   str_mother 의 값을 = "엄마돈없다" 로 바꾸게 되면  동일한 메모리주소를 가리키고 있는 곳의 값이 변경되게 때문에   str_me 의 값도 변경이 됩니다.

 

즉 변수의 이름은 다르지만  같은 메모리 주소값을 갖게 해서  하나의 변수값을 변경하면  그 메모리주소가 가르키고 있는 값도 변경이 됩니다. 이것은 상당히 편리한 방법이고 알게 모르게 우리는 전부 call by reference 를 사용하고 있었던 것입니다. 하지만  변경되지 않고 값만 넘겨줘야 할때도 있습니다.. 이것을 call by value 라고 하고  속도도 약간 빠르다고 합니다.

str_me = "엄마돈줘"

         sub test(byval str_temp)
                 str_temp = "엄마돈없다."
        end sub

call test(str_me)

Response.write str_me    '-> 이것의 값은 "엄마돈줘"

파라미터 앞에다가 byval 이라고 해주면 메모리 주소는 필요 없이 값만 전달 받겠다는 뜻입니다.

 

사실 이것은 asp 보다는 여러분이 vb 공부 하실때 많이 도움이 될듯하고 또 이번에 배울 함수에 서 call by referance 를 사용해야 하는데 여러분들이 헉갈리실까봐 미리 말씀 드렸습니다.

 

1. replace 함수 만들기

일단 str_mother = "엄마'천원'만줘" 에 작은 따움표가 두개 들어 있습니다. 우리는 이것을 "엄마''천원''만줘" 로 만들어야 합니다.  원리는 아주 간단합니다     들어온 문자열을 한개씩 잘라서  비교 한다음 작은따움표라면 큰따움표로 바꿔주면 되는것입니다. 초보자분들이 여기서 잘못하는것이 문자열을 한개씩 자르는 것과  마지막에 문자열을 하나씩 더해서 다시 새로운 문자열을 만들어 되돌려 주는것을 대부분 잘 못합니다. 밑에 소스를 잠깐 보겠습니다.

 <%
str_mother = "엄마천'원'만줘"             '초기의 문자열
call replace_str(str_mother, "'", "''")    ' 함수 호출
Response.Write str_mother                ' str_mother  

sub replace_str (byref str , byval equal , byval change)   ' (문자열, 비교할문자, 바꿀문자)
         for i = 1 to len(str)             ' 반복문은 str의 길이 만큼돈다.
             str_temp =  mid(str, i ,  1)    
             ' 이런식으로 하면 str_temp 에는 한개의 문자씩이 담긴다 즉 처음에는 "엄"
             ' 두 번째 반복문째에는 "마" 이런식....

             if str_temp = equal then       ' 만약에   "엄" 이라는글자가   작은따움표 와 같다면
                       str_temp = change            ' 큰따움표로 바꾼다.
             end if
             str_return  = str_return + str_temp
             ' 문자열을 하나씩 더해서 다시 하나의 문자열을 만든다. < BR >          next

         str = str_return            
         ' 되돌려 준다. (여기서 이게 가능한 이유는 byref 즉 call by reference 이기 때문)
 end sub
%>

1.  일단 str_mother 에는  "엄마천'원'만줘" 라는 값이 들어있고 이것을  call replace_str(str_mother, "'", "''")  에서 함수호출을 하였습니다. 그렇다면 함수 내부에서는 어떤 동작을할까요?. 일단 문자열을 하나하나씩 비교 하려면  반복문이 필요할것이고 이 반복문은 문자열의 끝까지 돌면 됩니다..

for i = 1 to len(str)

 

2. 그다음에는 문자열을 하나씩 잘라서 어딘가에 저장시켜야 한다. mid 함수는   ("abcdefg" , 2, 3 ) 이라고 하면 abcdefg 의 두번째 글자부터 3개를 가져온다  즉 bcd 를 가져오는 함수이다. 여기서 우리는 한글자씩 만 가져오면 된다.    즉 1부터 마지막 번호까지 가져올려면

str_temp =  mid(str, i ,  1)

 

3. 이제 str_temp 에는 첫번째글자가 담겨 있을 것이고 이것이 ' 와 같다면  '' 로 바꿔준다.  

    if str_temp = equal then         -> if str_temp = "'" then
       str_temp = change              ->   str_temp = "''"
    end if                                      -> end if

 

4. 이제 그 문자열을 하나씩 조합해서 새로운 문자를 만든다.

    str_return  = str_return + str_temp    '

 

5. 결과 값을 되돌려준다 ( 사실 되돌려준다는 말은  틀린 것이다  같은 메모리 주소에 저장 시킬 뿐이다. )     str = str_return            
    ' for 문이 끝난뒤에 그 값을 저장한다   (이것은 call by referance 이기때문에 가능하다.)

 

아마도 이 함수는 프로그램 경력이 있으신분들은 그리 어렵지 않게 스스로 만드실수 있을꺼라는 생각이듭니다.  이 원리를 이용하면 Trim (공백문자 제거 ) 함수는 쉽게 만들수 있습니다. . (이것은 여러분 스스로 한번 해봤으면 좋겠 습니다. )

이번에는 문자열 정렬에 관해서 알아 보겠습니다.

 

2. bubble sort

정렬알고리즘은 정말 무수히 많습니다. 필자가 알고 있는 정렬알고리즘만해도 8개 가까이 되고 현재도 정렬 알고리즘은 연구 되고 있고 새롭고 성능좋은 정렬 알고리즘을 개발한다면이것은  논문감입니다 :-) 그만큼 많은 사람들이 연구해왔고 최적화 되어 왔습니다. 이중에서 우리는 거품정렬(bubble sort) 을  사용해서 문자열을 정렬해볼 것입니다.  

일단 문자열을 정렬한다 함은 "bacdfe" 를 오름차순으로 정렬하면 "abcdef" 가 됩니다. 거품 정렬 알고리즘의 원리는 인접한 배열의 요소를 비교 , 교환한다음에 전체적으로 대충 정렬을 하면서  최대값을 배열의 제일 마지막으로 보내는 것을 반복하다보면 오른차순으로 정렬이 됩니다.

"fbadce" 가 있다고 치면  우선

 

   1.  f 와 b 를 비교한다
        b 가 앞에 와야 하므로 자리를 바꾼다.
        그렇게 되면  "bfadce" 가 될것이다
        다시 f 와 a를 비교한다
        a 가 앞에 있어야 하므로 자리를 바꾼다.
        그렇게 되면 "bafdce" 가 된다.
        다시 f 와 d를 비교한다
        d 가 앞에 있어야 하므로 자리를 바꾼다.
        "badfce" 가 되고 이렇게 되면서 결국 f는 제일 뒤로 가게되면서
        "badcef" 의 형태가 될것이다.  
        f가 제일 뒤로 보내지게 되면

 

   2.  처음으로 돌아가서 b 와 a를 바꾼다.
        그럼   "abdcef " 가 된다.
        다음에 b d 를 비교한다.
        d 가 더 크므로 교환할필요가 없다
        교환할필요가 없어지면서  d 화 c를 비교한다  
        (처음에 말했듯이  자리를 옮기면서 옆자리하고만 비교를 합니다. )
        c가 더 작으므로 교환해야한다. "abcdef"
        그다음에는  d 와 e를 비교 한다.
        (처음에 맨뒤로간 f와는 비교 하지 않는다.!)
        이것이 bubble sort 의 기본 정렬 방법이다.
        결국 "abcdef" 가 되고  제일 큰문자를 뒤로 보내가면서 중간중간 정렬을 해나가고 있

         다.

 

    3. 이미 "abcdef" 로 정렬은 다 되었지만 계속 해나간다면
        다시 a 와 b를 비교하고 d까지만 비교 한다 (맨뒤로보낸 e, f 는 비교 하지 않는다. )

 

이 버블 소트는  비교적 어느정도 정렬이 되있는 문자를 정렬할때 굉장히 빠른 속도를 자랑하지만 역순으로 정렬되있는 문자를  정렬할때는 비교적 느립니다. 이유는 간단합니다  앞뒤 자리를 계속 바꿔줘야 하기 때문이지요.

이것을 asp 로 나타내 보면..
<%
   strstring = "aslkjasdghglasdjfjfqhwejfasjdflkasfkhasdkjfals"  ' 정렬할 문자열
   Call bubble_sort(strstring)   ' 함수 호출
   Response.write strstring

   Sub bubble_sort(str_string)  '함수 선언부 문자열이 들어온다.
       Dim i, j                           ' 변수 선언
       Dim str_temp()              
       ' 반드시 배열로 할필요는 없지만 배열에 문자열을 하나씩 저장해 두는 것이 편하다.

       str_length = Len(str_string)    '문자열의 길이를 미리 저장 해둔다 (속도 향상을 위해서임.)
       ReDim str_temp(str_length)     ' 문자열의 길이만큼 배열을 재선언        

       For i = 1 To str_length          ' 문자열의 길이 만큼 반복문을 돈다.
           str_temp(i) = Mid(str_string, i, 1)  ' 문자열을 배열에 한글자씩 넣어주고 있다.
      Next

      For i =  0   To str_length        
      ' 여기서 부터가 버블 소트 이다.  문자열의 길이만큼 다시 반복문을 돈다.
          For j = 1   To str_length - i      ' 2중 반복문이다.
          'str_length - i 의 이미는 제일 마지막에 있는 제일 큰문자는 다시 비교할 필요가 없어서이다.

               If str_temp(j - 1) > str_temp(j) Then     ' "a" 와 "s" 를 비교 해서
                    t = str_temp(j - 1)                          ' "s"가 크면 임시 변수에 저장해놓고
                    str_temp(j - 1) = str_temp(j)           '자리를 서로 바꾼다.
                    str_temp(j) = t
               End If

          Next
      Next

      str_string = ""
      ' 반복문은 모두 끝났다 값을 되돌려주기 위해 그전에 정렬 안된 문자열을 모두 지운다.
      For i = 1 To str_length        '이부분은 str_string 에 정렬된 문자열을
          str_string = str_string + str_temp(i)
          '넣어주는 과정이다.  str_string 에는 정렬된 문자가 들어가게 된다.
      Next
End Sub
%>

지금 이 함수는 이글을 쓰면서 바로바로 만들고 있는것인데 뭔가 최적화 되지는 않은느낌입니다. 버블소트의 장점은  중간에 정렬이 다되었으면 끝까지 비교 하지 않고 중간에 멈출 수 있습니다.  

 

  이것을 소스에 넣으면 너무 복잡해 보이기 때문에  소스에서 뺐으며 중간에 멈출 수 있는 것은 버블소트의 장점입니다.  여러분이  직접 한번 해보시기 바랍니다 (힌트 : 문자열을 비교하다 교환이 일어나지 않으면  문자열은 정렬된상태 이다. 교환이 일어 나지 않을 때 for 문을 빠져나오면 된다. )

 

뭔가 복잡해 보이긴하지만 실제로 여러분이 만들어 가면서 소스를 보면 그리 어렵지도 않습니다.. 제일 윗부분의 반복문과 아래부분의 반복문은 사실 중요하지 않고 중요한 부분은

For i =  0   To str_length        
' 여기서 부터가 버블 소트 이다.  문자열의 길이만큼 다시 반복문을 돈다.
    For j = 1   To str_length - i      ' 2중 반복문이다.
    'str_length - i 의 이미는 제일 마지막에 있는 제일 큰문자는 다시 비교할 필요가 없어서이

     다.

         If str_temp(j - 1) > str_temp(j) Then     ' "a" 와 "s" 를 비교 해서
              t = str_temp(j - 1)                          ' "s"가 크면 임시 변수에 저장해놓고
              str_temp(j - 1) = str_temp(j)           '자리를 서로 바꾼다.
              str_temp(j) = t
         End If

    Next
Next

 

이부분입니다. 여기서 어떤 분들은 왜 2중 for 문으로 하냐고 물어 보시는 분들도 있을텐데.. "54321 " 이라는 문자가 있을 때  반복문을 한번만 돌리게 되면 "43215"에서 끝나 버립니다. 다시 처음으로 돌아가야 하기 때문에 2중 for 문을 써야합니다.


사실 머리가 좋은 사람들은 이부분 정도는 머리로 따라가면서 결과 값을 예측하곤 하지만   한번씩 해보면서 이해하시길 부탁 드립니다. 가장 중요한 것은 버블소트는 뒷부분 부터 정렬이 되며 앞뒤값을 비교 해서 자리바꿈을 한다는것입니다. 이해가 돼셨는지 잘 모르겠습니다  . T.T

2008/02/21 15:51 2008/02/21 15:51

RGB값을 받아서 헥사값으로 변환해 주는 함수입니다.

너무 간단해서 주석은 달지 않았습니다.



<%

Function RGB2HTMLColor( RColor, GColor, BColor )


  Dim HexR, HexB, HexG
  Dim sTemp


  'RColor
  HexR = Hex(RColor)
  If Len(HexR) < 2 Then
   HexR = "0" & HexR
  End If

  'GColor
  HexG = Hex(GColor)
  If Len(HexG) < 2 Then
  HexG = "0" & HexG
  End if

  'BColor
  HexB = Hex(BColor)
  If Len(HexB) < 2 Then
  HexB = "0" & HexB
  End if


  RGB2HTMLColor = "#" & HexR & HexG & HexB


End Function

  Response.Write RGB2HTMLColor( 255, 100, 255 )

%>

2008/02/21 15:50 2008/02/21 15:50

해외 사이트에서 퍼왔습니다.

문자열중 단어가 시작되는 첫문자를 대문자로 변환(Converting) 해줍니다.


<%
 Function Str2ProperCase(sValue)


  iPos = 1

   Do While InStr(iPos, sValue, " ", 1) <> 0
   iSpace = InStr(iPos, sValue, " ", 1)
   sTemp = sTemp & UCase(Mid(sValue, iPos, 1))
   sTemp = sTemp & LCase(Mid(sValue, iPos + 1, _
                      iSpace - iPos))
   iPos = iSpace + 1
   Loop


   sTemp = sTemp & UCase(Mid(sValue, iPos, 1))
   sTemp = sTemp & LCase(Mid(sValue, iPos + 1))

   Str2ProperCase = sTemp


End Function


'EXAMPLE:


sValue = Str2ProperCase("THIS IS A TEST")
response.write sValue 'Displays This Is A Test

%>

2008/02/21 15:50 2008/02/21 15:50

txtemail 문자열에서 Instr 함수를 이용, 해당되는 문자 "@", "." 가 있나 없나, 문자열 길이가 7보다 작은가를

체크해서 유효한 이메일 인지를 검사합니다. 닷넷의 경우는 RegularExpressionValidator 컨트롤을 사용하면

이메일 정도는 정규식을 이용해서 간단하게 검사해줍니다.


<%

Function EmailChk( txtemail )


 Dim strMessage
 
 if instr( txtemail, "@" ) = 0 OR instr( txtemail, "." ) = 0 OR Len( txtemail ) < 7 Then
     strMessage = "유요하지 않은 이메일입니다"
 else
     strMessage = "유요한 이메일입니다."
 end if

   EmailChk = strMessage


end Function


Response.Write EmailChk( "test@test.com")

%>

2008/02/21 15:49 2008/02/21 15:49

ASP에서 join과 split을 이용한 문자열 파싱(parsing) 


 저자: Daniel Joe |  날짜: 2001년 08월 17일    


join과 split는 문자열을 파싱(parsing)함에 있어 매우 유용한 함수들이다. 같단히 설명하자면, join은 하나의 일차원 배열의 내용을 하나의 문자열로 만드는 함수이고, split은 하나의 문자열 내용을 하나의 일차원 배열로 나누어 담는 함수이다.

join에 대한 문법은 다음과 같다:


join(list[, delimiter]) 


여기서 list는 문자열로 연결시킬 내용들이 들어 있는 배열을 나타낸다. Delimeter는 배열에 있는 요소들로부터 문자열을 만들 때 각 요소 사이에 들어갈 문자열을 의미한다. 이 값은 옵션으로 이것을 지정하지 않으면 내부적으로 빈 문자열(" ")로 처리된다. 이제 간단한 예를 한 번 살펴 보도록 하자.


Dim OneDimArray(5)
OneDimArray(0) = "Hello,"
OneDimArray(1) = "my"
OneDimArray(2) = "name"
OneDimArray(3) = "is"
OneDimArray(4) = "Daniel!"

Dim strSentence
strSentence = join(OneDimArray) 


위의 코드는 strSentence에 "Hello, my name is Daniel!"을 저장하게 된다. 만일 strSentence = join(OneDimArray) 부분을 strSentence = join(OneDimArray, ",") 부분으로 변경하면 strSentence에는 "Hello,,my,name,is,Daniel!"이 저장된다. 즉, 디리미터(delimeter, 구분자)는 앞의 경우 디폴트인 " " 이고, 후자의 경우는 ","인 것이다. 만일 배열의 각 요소를 하나의 문자열로 만들 때 각 요소 사이의 구분자가 없이 붙이고 싶을 경우는 단순히 strSentence = join(OneDimArray, "")라고 해주면 된다. 그 결과는 "Hello,mynameisDaniel!"이 될 것이다.


split은 join의 반대 결과를 만든다. split은 문자열을 취하여 문자열의 각 요소들을 적절한 기준으로 잘라 내 일차원 배열로 담아낸다. split의 문법은 다음과 같다:


split(String Expression[, delimiter[, count[, compare]]]) 


여기서 반드시 필요한 파라미터는 배열로 담을 문자열, Expression이다. Delimeter는 join과 마찬가지로 옵션이다. 디폴트는 " " 이다. count는 결과로 반환할 부분 문자열의 갯수이다. compare는 부분 문자열을 비교하는 방법을 결정한다. 이제 간단한 예를 한 번 살펴 보도록 하자.


Dim strSentence
strSentence = "Hello, my name is Daniel!"

Dim OneDimArray
OneDimArray = split(strSentence)
 


위의 코드는 strSentence에 담겨 있는 문자열을 OneDimArray란 일차원 배열의 각 요소에 "Hello,", "my", "name", "is", "Daniel!"을 저장한다. 만일 OneDimArray 배열에 3 요소만 저장하고 싶은 경우 count 파라미터를 이용하여 부분 문자열의 갯수를 정해주면 된다. 즉, OneDimArray = split(strSentence) 부분을 OneDimArray = split(strSentence, " ", 3)으로 변경시켜주면 된다. 이 결과는 "Hello,", "my", "name is Daniel!"이 된다. 만일 구분자로 컴마(,)를 사용하고 싶다면 OneDimArray = split(strSentence) 부분을 OneDimArray = split(strSentence, ",")로 변경시켜주면 된다. 이 결과는 "Hello", "my name is Daniel!"이 될 것이다.

앞에서도 언급했지만 join과 split은 서로 반대 관계이다. 예를 들어, 다음과 같은 코드를 보자.


Dim strSentence, strCopy
strSentence = "Hello, my name is Bob!"
strCopy = join(split(strSentence)) 


위의 코드에서 strCopy와 strSentence는 동일한 값을 갖는다.

지금까지 join과 split의 사용 방법에 대해 알아 보았다. 그렇다면 이 함수들은 언제 유용하게 사용될 수 있을까? 사실 ASP에서 문자열을 조작함에 있어 join과 split의 사용은 필수적이다. 하나의 예를 들기 위해 지난 시간에 살펴보았던 "AdRotator를 이용하여 배너 광고 로테이션 시키는 방법"에서 사용한 AdRotator.txt 파일을 살펴 보도록 하자. 그 파일에는 다음과 같은 형식의 데이터들이 저장되어 있다:


Advertiser Name
Advertiser URL
Advertiser Category
Banner ID
Comment
*
Advertiser Name
Advertiser URL
Advertiser Category
Banner ID
Comment
*
Advertiser Name
Advertiser URL
Advertiser Category
Banner ID
Comment
*

... 


이런 텍스트 파일을 이용하여 작업을 할 때 제일 먼저 하는 일은 FileSystemObject 객체를 이용하여 전체 텍스트 내용을 하나의 문자열로 읽어 들이는 것이다. 그 문자열을 str이란 변수로 담았다고 한다면 다음으로 할 일은 recArray = split(str, "*")을 해주는 것이다.

이렇게 함으로써 하나의 레코드 단위를 배열의 각 요소로 저장할 수가 있다. 마지막으로 레코드에 있는 각각의 요소를 얻으려면 elementArray = split(recArray(i), chr(13))이라고 해주면 된다. 여기서 chr(13)은 라인이 분리되어 있는 값을 의미한다.

이런 과정을 거침으로써 텍스트 파일의 내용을 적절히 파싱(parsing)을 할 수 있게 된다.

2008/02/21 15:49 2008/02/21 15:49

ASP로 개발작업을 할때 db연결 부분이나 공통으로 필요한 부분은 따로 파일로 작성해서
필요시 포함해서 쓰는 경우가 많습니다.

첫번째는 #include 를 이용한 방법이고 두번째는 Server.Execute를 이용한 방법입니다.
근데 이 두가지 방법이 외부파일을 포함해서 쓰는 공통의 방법이면서 몇가지 차이점이 있습니다.

 

차이점
1) #include는 IIS에서 ASP 파일을 실행하기 이전에 먼저 처리하지만 Server.Execute는 ASP 파일 실행시 같이 처리하게  됩니다.

   두문장이 삽입되는 생김새만 봐도 눈치챌수 있습니다.
2) #include는 삽입되는 파일과 삽입하는 파일의 변수가 공유가 되지만 Server.Execute는 변수 공유가 되지 않습니다.
   이부분은 아래 예제를 보면 이해가 가실겁니다.


예제1) Test.ASP파일의 내용이 다음과 같다고 할때
<% moneyValue = 100%>



#include로 test.asp를 포함시킨  moneyValue의 값은 100이 출력됩니다.
<%

  moneyValue = "10000"

%>
<!--#include file="test.asp"-->
<%
 
  Response.Write moneyValue
 
%>



Server.Execute로 test.asp를 포함시킨 moneyValue의 값은 Test.asp파일의 내용을 무시하고 그냥 100이 출력됩니다.

<%

  moneyValue = "10000"


  Server.Execute("Test.asp")
 
  Response.Write moneyValue
 
%>


그래도 Server.Execute문을 써야할때가 있습니다. 파일을 동적으로 삽입시켜야 할때입니다.
위에서 보셨듯이 #include는 asp구문이 끝난다음 삽입됩니다. html의 주석처리 이후에 #include문을
쓰기 때문에 <!--#include file=<%Thema%>--> 이런식으로 쓸수가 없습니다.

하지만 Server.Execute는 특정변수에다 조건에 따라서 삽입되는 파일경로를 달리하여
다음과 같이 쓸수 있습니다.
<%
 if chkThema = 1 then
   Thema = "event.asp"
 else
   Thema = "nomal.asp"
 end fif

 Server.Execute(Thema)
%>

2008/02/21 15:49 2008/02/21 15:49

= FormatDateTime 함수 =

FormatDateTime(Date[,NamedFormat])

Date : 필수적인 인수. 날짜식을 지정합니다
NamedFormat : 선택적인 인수로써 날짜/시간 형식을 나타내는 숫자 값입니다.

이 인수를 생략하면 vbGeneralDate를 사용합니다.

상수 설명
vbGeneralDate 0 날짜 또는 시간을 표시합니다. 날짜 부분이 있으면 간단하게 표시 날짜 형식으로 날짜를 표시하며, 시간 부분이 있으면 자세하게 표시 시간 형식으로 시간을 표시합니다. 날짜와 시간이 같이 있으면 두 부분을 모두 표시합니다.
vbLongDate 1 컴퓨터의 국가별 설정에서 지정한 자세하게 표시 날짜 형식으로 날짜를 표시합니다.
vbShortDate 2 컴퓨터의 국가별 설정에서 지정한 간단하게 표시 날짜 형식으로 날짜를 표시합니다
vbLongTime 3 컴퓨터의 국가별 설정에서 지정한 시간 형식으로 시간을 표시합니다
vbShortTime 4 24시간 형식(hh:mm)의 시간을 표시합니다.


- 예제 -

<%
Response.Write FormatDateTime(Now, 0) & "<BR>"
Response.Write FormatDateTime(Now, 1) & "<BR>"
Response.Write FormatDateTime(Now, 2) & "<BR>"
Response.Write FormatDateTime(Now, 3) & "<BR>"
Response.Write FormatDateTime(Now, 4) & "<BR>"
%>

2008/02/21 15:48 2008/02/21 15:48

<!-- Formatnumber, Formatcurrency 함수를 이용한 천단위 콤마찍기 짧막한 예제입니다.

       혹시 모르시는 분들 있을까봐 올립니다. -->


<%


   Dim moneyValue
   moneyValue = "100000"


   If IsNumeric(moneyValue) then 'moneyValue의 값이 숫자인지 아닌지 IsNumeric 함수를 이용해서 체크합니다
   response.write(formatnumber( moneyValue, 0 )) '0은 소숫점 자리수의 의미, Default가 2라서 소수점 자리를
   response.Write "<br><br>"                              '나타내고 싶지 않으면 0을 써주세요
   end if      

                                 

   If IsNumeric(moneyValue) then
   response.Write(formatcurrency( moneyValue, 0 )) '0은 소숫점 자리수의 의미, Default가 0이라서 생략가능
   end if


%>

2008/02/21 15:48 2008/02/21 15:48

<!-- Split 함수를 이용해서 문자열에서 특정문자를 제거하는 함수입니다.

       혹시 필요하신분 있을까봐 간단히 만들어 봤습니다. -->


<%

  Function Get_AbString( strSource, chrSource )

  Dim strTemp, chrTemp, strDest

  strTemp = strSource
  chrTemp = chrSource

  'Split 함수: 지정된 수의 부분 문자열을 포함하는 0부터 시작하는 1차원 배열을 반환합니다.
  'strDest에는 chrSource의 갯수를 반환합니다. 여기서는 2
  '분리된 문자열은 strDest(0) 부터 시작해서 반환한 strDest의 갯수만큼의 1차원 배열에 저장됩니다.
  '여기서는 strDest(0), strDest(1), strDest(2)
  strDest = Split( strTemp, chrTemp )

  strTemp = ""

  for i = 0 to ubound(strDest)

    strTemp = strTemp & strDest(i)

  next

  Get_AbString = strTemp


End Function

  Response.Write Get_AbString( "2,000,000", "," )


%>

2008/02/21 15:47 2008/02/21 15:47

★ 커서타입

타입 설명
0

adOpenForwardOnly

자료를 변경할 수 없으며 MoveNext 메소드만 지원(Default 값)

1

adOpenKeyset

Recordset 자료를 변경할 수 있지만 새로운 자료를 추가한 경우 다른 사용자에게 반영되지 않는다. 모든 Move 메소드를 지원

2

adOpenDymanic

오픈되어 있는 동안 다른 사용자들의 입력, 수정, 삭제된 내용이 변경된다. 모든 Move 메소드를 지원

3

adOpenStatic

자료를 변경할 수 없으며 Recordset 생성 후 다른 사용자가 변경한 자료는 볼 수 없다. 모든 Move 메소드를 지원


★ 락타입

타입 설명
0

adLockReadOnly

읽기전용 록. 레코드 읽는 동안 다른 사람이 데이터를 변경할 수 없고 읽을 수만 있음

1

adLockPessimistic

비관적 록. 레코드 단위로 록킹. 레코드 편집을 하는 순간부터 록을 걸어 다른 사람이 레코드를 변경할 수 없게 됨

2

adLockOptimistic

낙관적 록. 레코드 단위로 록킹. 레코드 편집이 끝나고 Update 메소드를 호출하는 경우에만 록을 걸므로 Update 전에는 편집중이라도 다른 사용자가 수정할 수 있음

3

adLockBatchOptimistic

배치 작업으로 Optimistic 록을 사용할 수 있음

2008/02/21 15:47 2008/02/21 15:47

<%


 '//Addnew 함수는 레코드셋을 이용해 데이타를 추가하는 방식이다.
 '//Addnew 함수를 통해서 데이타를 추가하면 마지막에 반드시 Update라는 메소드가 있어야지 적용이된다
 '//기존 쿼리를 사용하는 방법이 레코드셋을 이용하는것 보다 속도는 조금빠르지만 초보자에게는 약간
 '//복잡한면이 없지 않다...
 '//기존 쿼리방식은 많은 insert 문중 에러가 발생하면 Dbcon.Execute SQL 을 가리키지만 이방법은
 '//어디가 잘못되었는지 바로 지적해준다 디버깅면에서 추천할만하다

 

 '//하지만 이방법은  모든 OLEDB 제공자가 이기능을 지원하지 않는다는 것이다

 

 Dim strConnect
 Dim Rs


 strConnect = "Provider=SQLOLEDB.1;Data Source=xxxx;Initial Catalog=xxxx;user ID=xxxx;password=xxxx;"
 Set Rs = server.CreateObject("ADODB.Recordset")


 With Rs
 .open "테이블명",strConnect, adOpenStatic, adLockPessimistic, adCmdTable
 .Addnew
 .Fields("uid") = "abcd"
 .Fields("name") = "홍길동"
 .Fields("memo") = "abcdefg hijk lmn"
 .Fields("idate") = now()
 .Update
 .Close
 End With


 set Rs=nothing


 response.write "새로운 데이타가 추가되었습니다."
%>

2008/02/21 15:47 2008/02/21 15:47

ASP페이지에 Excel 스프레드시트를 표시하는 간단한 예제입니다.

쿼리문에 있는 [TEST$] 는 Excel 시트명이며 자주 에러를 발생시키는 부분과 GetString 함수는 주석으로 설명하였습니다



------------------------------------예제는 여기서부터 -------------------------------------------------------------------


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> ASP 페이지에 Excel 스프레드시트 표시하기 </TITLE>
</HEAD>
<BODY>
<%
Set dbCon = Server.CreateObject("ADODB.Connection")
strConnect = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & Server.MapPath("\") & "\TEST.xls;" '엑셀파일 경로

'다음과 같은 오류가 나왔다면 엑셀파일이 열려있거나, 아니면 사용자권한이 파일접근 금지되어 있을경우입니다
'Microsoft OLE DB Provider for ODBC Drivers 오류 '80004005'
'[Microsoft][ODBC Excel Driver]일반 오류 레지스트리 키 'Temporary (volatile) Jet DSN for process 0x8c0 Thread 0xa9c DBC '0x16d6764 Excel'을(를) 열 수 없습니다.


dbCon.Open strConnect
SQL = "Select * from [TEST$]"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL, dbCon


'ADO 2.0 이상에는 GetString이라는 함수가 있습니다. 이 함수를 이용하면 Do..Loop부분과 레코드셋의 eof를 체크하는 부분이 필요없습니다
exlValue = rs.GetString(,,"</td><td>","</td></tr><tr><td>"," ")
%>
<TABLE border=1>
<TR><TD>
<% Response.Write(exlValue)%>
</TD></TR>
</TABLE>
</BODY>
</HTML>


2탄 이어서

저번에 올린 Excel에 스프레드시트 표시하기의 발전형 예제입니다.

엑셀파일명만 알고 스프레드시트에는 무슨이름이 들어있는지 모를때 OpenSchema 메서드를 이용하여

스프레드시트명을 알아내어 스프레드시트 내용을 뿌려줍니다.


-------------------------------------예제는 여기서부터 -----------------------------------------------------------------


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> ASP 페이지에 Excel 스프레드시트 표시하기 </TITLE>
</HEAD>
<BODY>
<%
Dim SheetName, dbCon, strConnect, rsList, rs


Set dbCon = Server.CreateObject("ADODB.Connection")
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\") & "\TEST.xls " & "; Extended Properties=Excel 8.0;"  '엑셀파일 경로


dbCon.Open strConnect

'OpenSchema 메서드를 사용하여 데이터베이스의 테이블에 대한 정보가 들어있는 Recordset 개체를 반환합니다.
'스키마 상수는 다음과 같습니다.
'adSchemaColumns = 4, adSchemaProviderTypes = 22, adSchemaTables = 20
set rsList = dbCon.OpenSchema(20)

Do Until rsList.EOF Or rsList.BOF

    SheetName = rsList(2) '2는 카탈로그의 Character Set을 되돌려 줍니다.

    rsList.MoveNext

Loop


 
 SQL = "Select * from [" & SheetName & "]"


 Set rs = Server.CreateObject("ADODB.Recordset")
 rs.Open SQL, dbCon


  exlValue = rs.GetString(,,"</td><td>","</td></tr><tr><td>"," ")


%>
<TABLE border=1>
<TR><TD>
<% Response.Write(exlValue)%>
</TD></TR>
</TABLE>
<%
rs.Close
Set rs = Nothing
rsList.Close
set rsList = Nothing
dbCon.close
set dbCon = Nothing
%>
</BODY>
</HTML>

2008/02/21 15:46 2008/02/21 15:46

<%


'//GetRows 메소드는 Recordset 개체에서 데이타를 배열로 가져오는 역활을 한다.


 strConnect="DSN=test;UID=sa;PWD=;"

 set dbcon = server.CreateObject("ADODB.Connection")
 dbcon.open strConnect


 SQL = "select 필드명1, 필드명2 from 테이블명"
 set rs = dbcon.Execute(SQL)


 With Rs
 fields = Array("memuid","name") '// 2차원 배열로 값을 저장한다.
 data = .GetRows( , ,fields)


'//GetRows([Rows],[Start],[Fields])
'//인자는 생략가능하다
'//첫번째 인자는 가져올 레코드수를 지정한다 생략하면 전부다 가져온다.
'//두번째 인자는 어느레코드에서 가져올지를 정한다.
'//세번째 인자는 배열에 들어간 Field 값을 가져온다.


 .close
 end With
 set rs = nothing
 dbcon.close
 set dbcon = nothing


 Rcount = ubound(data,2)

 '//UBound([배열명]] 배열의 요소 갯수를 알려주는 함수

%>


 <table width = "100%" border="1">
 <% for i=0 to Rcount%>
 <tr>
  <td><%=Rcount-i+1%></td>
  <td><%=data(0,i)%></td>
  <td><%=data(1,i)%></td>
 </tr>
 <%next%>
 </table>

2008/02/21 15:45 2008/02/21 15:45

혹시나 모르시는 분 있을까봐 간단하게 예제 작성해봤습니다.

On Error Resume Next 구문은 에러가 발생해도 에러부분을 무시하고 넘기라는 명령문이며

에러발생시의 처리 루틴이 빠져있다면 화면에 아무런 에러메시지도 출력안하게 됩니다. 그럼 일단 개발자는

아래와 같은 소스에서는 DB연결 에러를 파악할수가 없게 됩니다. 쓰시게 될때는 에러처리 부분과 꼭 함께

쓰시거나 아니면 안 쓰시는게 좋습니다. 주석은 비교적 짧게 달았으나 한번 실행해 보시면 금방 감 오실겁니다


--------------------------------------- 예제는 여기서부터 -------------------------------------------------------------


<%


    'On Error Resume Next 구문은 에러가 발생해도 일단 에러부분을 무시하고 넘기게 됩니다.
    On Error Resume next
 
    Dim strConnect, dbCon, rs
    strConnect="DSN=test;uid=sa;pwd=1234;"

  
    SET dbCon=server.CreateObject("ADODB.Connection")
    dbCon.Open strConnect
 
    SET rs = dbCon.execute("select uid, name, addr from TestTable where uid ='"& uid &"'")


    'Error 발생했을때 처리하게 되는 루틴입니다.
    if Err.Number <> 0 then
    response.Write "<h2>DB연결에 실패하였습니다.</h2>"
    Err.Clear
    response.end
    else
    rs.Close
    Set rs = nothing
    dbCon.Close
    Set dbCon = nothing
    response.Write "<h2>DB연결에 성공하였습니다.</h2>"
    end if


%>

2008/02/21 15:45 2008/02/21 15:45

쿠키 유형에는 메모리 쿠키와 디스크기반 쿠키가 있습니다. 디스크기반 쿠키는 우리가
일반적으로 생각하는 클라이언트의 디스크에 저장되는 쿠키이며 메모리 기반 쿠키는
브라우져가 종료될때까지만 유효한 쿠키입니다.
아래 예제는 메모리기반 쿠키입니다. 디스크기반 쿠키로 사용하실려면 Expires 속성을 이용하여
다음과 같이 명시해야 합니다.
Response.Cookies("TestCookie").expires = #12/31/2010 00:00:00#

아래 예제에서는 expires 부분을 ' <-- 주석으로 막아놨습니다.


쿠키의 또 한가지 알아야 할 특성은 로드밸런싱(load balancing)을 이용하거나 이용하신분들은 아시겠지만

도메인에 종속적이라는 것입니다. 도메인명이 다르면 다른 도메인으로 디스크기반 쿠키를 사용할수가 없습

니다. 그래서 도메인명이 다른 두개의 사이트의 회원로그인 정보를 공유하자는 논의는 양사 개발담당자

의 머리를 썩게 만드는 주요한 요인이 됩니다


※ 두대이상의 웹서버를 이용한 로드밸런싱에서는 별도의 세션서버를 두지 않는이상 세션정보를 쿠키에

저장하여 처리하는 것이 일반적입니다. 기회가 된다면 로드밸런싱 하에서 로그인처리와 파일업로드 부분

에 대해서 언급할 계획입니다.


-------------------------------------예제는 여기서부터 ------------------------------------------------------------



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>쿠키예제</TITLE>
</HEAD>
<BODY>
<%

'Response.Cookies("TestCookie").expires = #12/31/2010 00:00:00#


'Response.Cookies를 사용하면 쿠키에 정보를 추가합니다.
 Response.Cookies ("TestCookie")="쿠키예제"

'Request.Cookies를 사용하여 쿠키의 정보를 읽어들입니다.
 Response.Write Request.Cookies("TestCookie")


 Response.Write "<br><br>"

'쿠키에 키를 사용하면 하나의 쿠키에 여러 정보를 저장할수 있습니다.
 Response.Cookies ("TestCookie")("Key1")="쿠키"
 Response.Cookies ("TestCookie")("Key2")="예제"
 Response.Cookies ("TestCookie")("Key3")="입니다"

'키가 사용된 쿠키의 값을 참조하기 위해서 키값을 사용합니다.
 Response.Write Request.Cookies("TestCookie")("Key1")
 Response.Write Request.Cookies("TestCookie")("Key2")
 Response.Write Request.Cookies("TestCookie")("Key3")


%>
</BODY>
</HTML>

2008/02/21 15:45 2008/02/21 15:45

여기 없는 것 같아서 퍼왔읍니다.


아래글은 트랙백의 기본개념보다는 windows + asp 환경에서의 기술적 구현을 위해 간단하게 작성된 소스입니다. 따라서 트랙백의 기본개념을 이해하신후 소스를 보시는것이 도움이 되실것입니다.또한 보다 확장적인 서비스를 위해서는 아래 소스외에 더 많은 부분을 추가하셔야 합니다.


1. 트랙백 핑 받기

 

<%


'변수 처리
bidx = Request("bidx")
strTitle = Request("title")
strExcerpt = Request("excerpt")
strURL = Request("url")


'콘텐츠 타입
Response.ContentType = "text/xml"


'변수 확인
If strURL="" or strTitle = "" or bidx = "" Then
 Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
 Response.Write "<response>"
 Response.Write "<error>1</error>"
 Response.Write "<message>Not Enough Arguments.</message>"
 Response.Write "</response>"
 Response.End
End If


'내 블로그에 글이 있는지 확인
If 해당글의수 = 0 Then
 Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
 Response.Write "<response>"
 Response.Write "<error>1</error>"
 Response.Write "<message>Not Exist Post.</message>"
 Response.Write "</response>"
 Response.End
End If


set rs = Server.CreateObject("ADODB.Recordset")
with rs
.Open trackback_table,접근문자열,adOpenStatic,adLockPessimistic,adCmdTable
.addnew
.fields ("글번호 필드명") = opt_insert_text (bidx)
.fields ("주소 필드명") = opt_insert_text (strURL)
.fields ("제목 필드명") = opt_insert_text (strTitle)
.fields ("내용 필드명") = opt_insert_text (strExcerpt)
.fields ("날짜") = now
.update

.close
end with

set rs = nothing


'정상적으로 완료되었으면 성공했다는 대답을 보내자.
Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
Response.Write "<response>"
Response.Write "<error>0</error>"
Response.Write "<message>TrackBack Success.</message>"
Response.Write "</response>"
%>


첫번째로 트랙백은 규정적으로 4개의 변수값을 전송합니다. 글제목(title),글주소(url),글내용(exerpt),블로그명(blog_name) 입니다. 여기서 필수요소는 url 입니다. 위 소스에서는 블로그명을 포함시키지 않았습니다. 그리고 글번호는 해당 글의 존재유무를 확인하기 위해 트랙백 주소에서 GET 형태로 받아옵니다.


두번째로 인코딩되는 xml 중 <error> 부분이 가장 중요합니다. 즉, error 값으로 트랙백 핑을 보낸쪽에다 대답을 하는 것입니다.0이면 성공이고 1이면 실패입니다. 그리고 <message>부분은 말그대로 추가설명입니다. 그리고 트랙백 핑은 POST 형태로 값을 받습니다. 받아오는 변수들을 Request.Form 형태로 정의해주는것이 더 좋을듯 하네요.

세번째로 위 소스에서는 간단한 xml 이라 굳이 Msxml2.DOMDocument 같은 xml 관련 서버 컴포넌트를 사용하지 않았습니다.


2. 트랙백 핑 보내기


<%
b_tb = "핑을 보낼 블로그 게시물의 트랙백 주소"

if b_tb <> "" then '만약 트랙백 주소가 입력되었다면 ..


 ' 여기서 부터 트랙백 처리
 
 ' 핑을 보낼 준비하자
 x_Posturl = Server.URLEncode(나의 글의 고유주소)
 x_BlogName = Server.URLEncode(나의 블로그명)
 x_Title = Server.URLEncode(나의 글의 제목)
 x_Excerpt = Server.URLEncode(나의 글의 내용)

 Str_tb="title="&x_Title&"&url="&x_Posturl&"&excerpt="&x_Excerpt&"&blog_name="&x_BlogName


 ' 트랙백 핑을 보내자
 set xml = server.CreateObject("msxml2.xmlhttp")
 xml.open "POST", "" & b_tb & "", false
 
 ' 몇가지 헤더처리
 xml.setRequestHeader "Accept-Language","ko"
 xml.setRequestHeader "Accept-Encoding","gzip, deflate"
 xml.setRequestHeader "Content-Type","application/x-www-form-urlencoded"
 xml.setRequestHeader "Connection","Keep-Alive"
 xml.setRequestHeader "Cache-Control","no-cache"
 xml.send (Str_tb)
 
 ' 트랙백 핑 성공여부
 If InStr(1, xml.responseText, "<error>0</error>") Then
  ' 성공일경우 처리
 Else
  ' 실패일경우 처리
 End If
 
 Set xml = Nothing

end if
%>


일반적으로 글의 저장 또는 편집시 사용하실수 있습니다. 그리고 Str_tb 변수 정의 하면서 POST 로 넘기는 변수명은 변경하시면 안됩니다. 또한 위 소스에서는 msxml2.xmlhttp 컴포넌트를 이용하여 POST 형태로 핑을 전송합니다. 트랙백 핑의 성공여부는 받아온 xml 을 디코딩 하셔도 되지만 그냥 <error>부분만 체크하기 위해 instr 로 처리하였습니다. 추가적으로 <message> 부분도 체크하여 성공 또는 실패시의 메시지를 받아오실수도 있습니다. 간혹 핑 전송시 한글이 깨어진다는 질문이 있는데, 이 경우 UrlEncoding 을 시키지 않으셨을때가 가장많습니다. 그외에는 위와 같은 방법으로 무난하게 성공하실것 입니다.



출처: http://nbloger.com/blog/xbb.asp?blogid=iendev&action=view&b_idx=205

2008/02/21 15:25 2008/02/21 15:25

사이트에서 월별, 주별 이벤트 참여자의 순위를 랭크하는 작업이 있어서 기존에 유통되는 자바스크립트 함수를

asp버전으로 급히 변환(converting)한 것입니다. 함수는 총3개로 구성되어 있으며 하단의 weekCount 함수

에 년,월의 인자만 넘겨주면 이번달에 속한주가 몇주까지 있나를 리턴(return) 해 줍니다. 


처음에 올린 datepart 함수를 이용하면 해당월에 속한 주수를 구할수 있을것 같으나 쉽지는 않습니다. 처음 예제 그대로

따라하시면 해당월에 속한주가 6주까지도 있다는 괴상한 값을 받을 것입니다.


-> wcountMonth = datepart("ww", today) - datepart("ww", firstdate) + 1  이부분에 dateserial 함수를 이용했을경우 5~6주가 넘어옴


 

------------------------------------------------함수는 여기부터 ---------------------------------------------------------


<%
 function isLeapYear (Year)
 
 dim bisReturn


 if (( Year mod 4 = 0 ) and (( Year mod 100 ) <> 0 ) or (( Year mod 400 ) = 0 )) then
   bisReturn = true
 else
   bisReturn = false
 end if

   isLeapYear = bisReturn
  
 end function


 function getDayInMonth(month,year)
 
 dim days
 
 if( month = 1 or month = 3 or month = 5 or month = 7 or month = 8 or month = 10 or month = 12 ) then
   days = 31
 else
  if ( month = 4 or month = 6 or month = 9 or month = 11 ) then
   days = 30
  else
   if  IsLeapYear(Year)  then
    days = 29
   else
    days = 28
   end if
  end if
 end if


 getDayInMonth = days

end function

function weekCount(thisYear, thisMonth)

  dim i, j
  i = 0
  j = 0

  for i = 1 to getDayInMonth(cint(thisMonth), cint(thisYear))
  
   
 
 tempDay = thisYear & "-" & thisMonth & "-"  & cstr(i)

    '월요일이 나올때 마다 j값을 증가시킨다  참고: 1은 일요일, 2는 월요일, 3은 화요일, 4는 수요일,
 '5는 목요일, 6은 금요일, 7은 일요일
    if  weekday(tempDay) = 2  then
      j = j+1
 end if

  next

  if(( thisMonth = 1 ) or ( thisMonth = 10 )) then
    j = 5
  end if


  weekCount = j

end function
%>
<% '//---- 해당년과 해당월을 weekCount 함수에 넘기면 해당월에 몇주가 있나를 리턴해줍니다.  ----//
<% response.Write weekCount( "2006", "9" ) %>


-----------------------------------------------   함수 끝  -------------------------------------------------------------


기회가 되면 컨버팅전의 자바스크립트 함수도 올리도록 하겠습니다.

2008/02/21 15:24 2008/02/21 15:24

이번달의 시작일과 마지막일을 구하는 간단한 예제입니다.

DateSerial 함수의 ToYear 와 ToMonth 의 인자는 "2006" "11" 과 같은 형식으로 넘겨주시면 됩니다.

ex) DateSerail( "2006", "11", 1 )



<%
 
ToYear = Year(Date)
ToMonth = Month(Date)

FirstDay = DateSerial(ToYear, ToMonth, 1 )
LastDay = DateSerial(ToYear, ToMonth + 1 , 0 )
Response.Write " 이번달의 시작일은 " & FirstDay & " 이고 마지막일은 " & LastDay & " 입니다 "


%>

2008/02/21 15:24 2008/02/21 15:24

페이지 처리시 캐쉬에 파일을 남기지 말아야 할경우 asp페이지 맨상단에
아래의 세줄을(주석빼고) 추가하세요


※캐쉬를 사용하지 않음으로 서버에 상당한 무리를 줄수도 있습니다.
꼭 필요할때만 사용하세요.


<% '브라우저와 서버가 캐쉬를 사용하지 말것을 지정 %>
<% Response.CacheControl = "no-cache" %>
<% Response.AddHeader "Pragma", "no-cache" %>
<% '캐쉬돈 페이지가 만료될때까지의 기간, -1은 즉시만료 입니다. %>
<% Response.Expires = -1 %>

2008/02/21 15:23 2008/02/21 15:23

혹시 모르실 분을 위한 팁!!!

걍 퍼가시면 연결 안되고, dbconnect= 이하 부분을 자신의 database설정과 맡게 변경해주셔야 됩니다.

변경 부분은 주석으로 달아 놓았으니 참고하세요


<%
 

 dim Tblname
 Tblname = request("Tblname")
 uid  = request("uid")
 name = request("name")
 addr = request("addr")


 'ODBC설정없이 db연결하기 시작
 'xxx,xxx,xxx,xxx <---- 이부분에 database서버의 ip를 기록합니다.
 'database <---- 이부분에 생성된 database명을 기록합니다.
 'userid <------ 이부분에 데이타베이스 사용자명을 기록합니다.
 'pwd    <------ 이부분에 데이타베이스 사용자의 password를 기록합니다.
 dim dbConnect, db
    dbConnect = "Provider=SQLOLEDB;Data Source=xxx,xxx,xxx,xxx;Initial Catalog=database;user ID=userid;password=pwd;"
    set db = server.createObject("ADODB.Connection")
    db.open dbConnect
 'db 오픈끝
   
    'db가 오픈되었으면 해당작업을 합니다. 여기서는 간단한 insert 작업^^
    dim Sql
 Sql = "insert into "& Tblname &"(uid, name, addr, idate) "
 Sql = sql & "values('"&uid&"','"&name&"','"&addr&"',getdate())"
 db.execute Sql

    'db를 닫고 초기화합니다.
 db.close()
 set db = nothing

%>

 
2008/02/21 15:22 2008/02/21 15:22
<%
serverscript="asp"
%>
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY>
<form>
<div align="center"><center>
<table border="0">
<tr>
<td colspan="2" align="center">서버스크립트</td>
</tr>
<tr>
<td><input type="radio" value="asp" name="Topping1"
<% If serverscript = "asp" Then Response.Write("checked") %>></td>
<td>ASP</td>
</tr>
<tr>
<td><input type="radio" value="php" name="Topping1"
<% If serverscript = "php" Then Response.Write("checked") %>></td>
<td>PHP</td>
</tr>
<tr>
<td><input type="radio" value="jsp" name="Topping1"
<% If serverscript = "jsp" Then Response.Write("checked") %>></td>
<td>JSP</td>
</tr>
</table>
</center></div>
</form>
</BODY>
</HTML>
2008/02/21 15:22 2008/02/21 15:22

퍼왔습니다. 출처가 기억안나네요.


<HTML>
<BODY>
<center><h2>ServerVariable All</h2></center>
<TABLE border="1">
<TR><TD><center>Key</center></TD>
<TD><center>Value</center></TD></TR>
<% For Each key in Request.ServerVariables %>
<TR>
<TD><center><font face="돋움" size="2"><% = key%></font></center></TD>
<TD><font face="돋움" size="2">
<%
if Request.ServerVariables(key) = "" Then
   Response.Write "&nbsp"
else
   Response.Write Request.ServerVariables(key)
end if
%>
</font></TD></TR>
<% Next %>
</TABLE>
</BODY>
</HTML>

2008/02/21 15:21 2008/02/21 15:21