Search Results for '프로그래밍/Asp'
198 posts related to '프로그래밍/Asp'
- 2009/07/16 asp게시판 설치 -아티보드편
- 2009/05/27 URL 경로 구하기
- 2009/05/26 RSS 페이지의 구현
- 2009/05/26 모든 TextBox PostBack 막기, ProgressBar JavaScript Event 를 연결하기
- 2009/05/26 문자열에서 한글인것만 찾아낼 때
- 2009/05/26 ASP에 함수나 DB 연결 방법
- 2009/05/26 파라메터 데이터 타입 상수
- 2009/05/26 ServerVariables 컬렉션
- 2009/05/26 Page 로딩시 상태바 구현
- 2009/05/26 setInterval()과 XMLHTTP 를 이용하여 페이지 Refresh
- 2009/05/26 크로스 탭 쿼리문
- 2009/05/26 정규식을 이용하여 원하는 태그만 허용하는 방법
- 2009/05/26 base64 인코드, 디코드 - asp용 (한글 지원)
- 2009/05/26 select, radio, checkBox 쉽게 사용하기
- 2009/05/26 ASP에 Excel 스프레드시트 표시하기
- 2009/05/26 수신확인 & 수신거부 관련
- 2009/05/26 날자관련 팁
- 2009/05/26 로그인시 아이디가 같은 사용중인 아이디 Session끊을려면
- 2009/05/26 리프레쉬 없이 디비 내용 가져오기.
- 2009/05/26 블로그 트랙백의 구현 (WINDOWS+IIS+ASP 환경)
- 2009/05/26 이전 화면에서 넘어 오는 변수 이름과 값들을 찍어보자
- 2009/05/26 엑셀 파일 파일 및 디비에 저장하는 코드 입니다
- 2009/05/26 ASP를 사용한 폼 핸들링(5) - CDONTS 작업
- 2009/05/26 맥 어드레스 알아내는 방법
- 2009/05/26 ASP 파일처리 함수
- 2009/05/26 ASP 문자열함수+ 디버깅함수
- 2009/05/26 ASP 시간함수 1
- 2009/05/26 Mac Address알아내기
- 2009/05/19 ASP 암호를 역변환 하기
- 2009/05/16 특정테이블이 쿼리분석기가 안먹히고 테이블명이 잘못되었다고 나올때 -사용자를바꾸어준다-
function URL_Parser(strURL)
on error resume next
With ObjRegExp
.Global = true
.IgnoreCase = true
.Pattern = "http://(([a-zA-Z][-a-zA-Z0-9]*([.][a-zA-Z][-a-zA-Z0-9]*){0,3})||([0-9]{1,3}([.][0-9]{1,3}){3}))"
workURL = .Replace(strURL, "")
end With
set ObjRegExp = nothing
end function
HTTP_REFERER 를 이용해서 이전 URL 정보를 받는다.
얻어진 정보가 없다는것은 브라우저에서 직접 입력했거나 빈페이지에서 즐겨찾기등이라는것을 의미한다.
set_URL 값을 이용 통계 테이블에 해당 도메인이 존재하면 카운터 증가 / 없으면 추가 등으로 작업한다.
get_URL = Request.ServerVariables("HTTP_REFERER")
if get_URL = "" or isnull(get_URL) then
set_URL = "Direct Connect"
else
set_URL = URL_Parser(get_URL)
end If
Option Explicit
Response.ContentType = "text/xml"
%>
<!-- #include virtual="/Lib/db.asp" -->
<!-- #include virtual="/Lib/lib.asp" -->
<!-- #include virtual="/Lib/adovbs.inc" -->
<%
Dim cn, rs, sql, config
sql = "SELECT TOP 20 * FROM posts WHERE is_public = 1 ORDER BY regdate DESC"
Set cn = GetConnection("Blog", True)
Set rs = cn.Execute(sql)
config = Split(Application("BlogConfig"), "|")
%>
<?xml version="1.0" encoding="EUC-KR" ?>
<rss version="2.0">
<channel>
<title><% = config(5) %></title>
<link>http://<% = Request.ServerVariables("HTTP_HOST") %></link>
<description><% = config(6) %></description>
<copyright><% = config(5) %></copyright>
<generator>Bullog for ASP 3.0</generator>
<%
If (Not rs Is Nothing) And (Not rs.EOF) Then
Do While Not rs.EOF
%>
<item>
<title><% = rs("subject") %></title>
<link>http://<% = Request.ServerVariables("HTTP_HOST") %>/Archive/<% = rs("uid") %></link>
<description><![CDATA[<% = rs("content") %>]]></description>
<pubDate><% = rs("regdate") %></pubDate>
</item>
<%
rs.MoveNext
Loop
End If
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
%>
</channel>
</rss>
/// Form 의 TextBox 에서 Enter키를 치면 PostBack 되는 것을 막고 버튼에 Progress Bar JavaScript Event 를 연결
/// </summary>
public void PreventSubmitOnEnter()
{
string strFormName;
HttpContext hc = HttpContext.Current;
hc.Response.Write("<div id='divProgress' style='DISPLAY: none; LEFT: 30%; POSITION: absolute; TOP: 15%'><IMG id='img' src='../images/loadingbar.gif'></div>");
if (!IsPostBack)
{
foreach (System.Web.UI.Control formCont in this.Controls)
{
if (formCont is System.Web.UI.HtmlControls.HtmlForm)
{
strFormName = formCont.ClientID;
foreach(System.Web.UI.Control cont in formCont.Controls)
{
// TextBox 에는 Enter 키 이벤트 막기
if ( cont is System.Web.UI.WebControls.TextBox )
{
TextBox tbox = cont as TextBox;
tbox.Attributes.Add("onkeypress","if(event.keyCode==13){return false;}");
}
// Button 에는 ProgressBar 이벤트 연결
else if ( cont is System.Web.UI.WebControls.Button)
{
Button btn = cont as Button;
string strHandler = "javascript:document."+strFormName+".style.display = 'none' ; document.all.img.src='../images/loadingbar.gif' ; document.all.divProgress.style.display='';";
btn.Attributes.Add("onclick", strHandler);
}
}
}
} // foreach (System.Web.UI.Control formCont in this.Controls)
} // if ( !PostBack)
} // 메소드
/// 문자가 한글인지 여부를 판단합니다.^^
/// </summary>
/// <returns>문자의 한글여부</returns>
private bool IsHanguel(Char ch)
{
if ( char.GetUnicodeCategory(ch) ==System.Globalization.UnicodeCategory.OtherLetter ) // 한글이면
{
return true;
}
else
{
return false;
}
}
<%
'---a.asp 소스 시작---
'---DB 연결에 쓰이는 개체를 예로 듭니다.---
SET objConn = Server.CreateObject("ADODB.Connection")
strConnection = "Provider = SQLOLEDB; Data Source = DB서버명; Initial Catalog =DB명; User Id = DB접근계정; Password = DB접근비밀번호;"
objConn.Open strConnection
'---함수 예---
function writeTest(strText)
Response.Write(strText &"<br>")
end function
'---a.asp 소스 끝---
%>
main.asp에는 아래와 같이 불러옵니다.
여기서 주의할 점은 a.asp와 main.asp는 같은 폴더에 있어야 합니다.
<!--#include file="a.asp"-->
<%
dim sql
sql="select * from 테이블명"
set result=objConn.execute(sql) '--DB 개체 호출
do while not result.eof
writeTest(result("칼럼명")) '---함수 호출
result.moveNext
Loop
'---아래 부분은 b.asp로 작성해서 다시 include로 써주어도 됩니다.---
set result=nothing
objConn.Close
set objConn=nothing
%>
adBigInt 20 8바이트의부호있는정수
adBinary 128 바이너리형
adBoolean 11 불린형(True/False)
adBSTR 8 Null로종료하는Unicode문자열형
adChar 129 문자열형
adCurrency 6 전달형
adDate 7 날자형
adDBDate 133 yyyy-mm-DD형식의날자형
adDBTime 134 hh-mm-ss형식의시간형
adBDTimeStamp 135 날자나시간중일부만표시
adDecimal 141 0진형
adDouble 5 배정도부동소수점형
adEmpty 0 형을지정하지않음
adError 10 32BIT에러코드
adGUID 72 고유의글로벌식별자(GUID)
adIDispatch 9 OLE보므젝트Idispatch인터페이스로의포인터
adInteger 3 4바이트의부호있는정수
IUnknown 13 OLE오브젝트IUnknown인터페이스로의포인터
adLongVarBinary 205 LongBinary형(Parameter오브젝트만)
adLongVarchar 201 LongChar형(Parameter오브젝트만)
adLongVarWChar 203 Null로종료하는Unicode문자열형(Parameter오브젝트만)
adNumeric 131 수치형
adSingle 4 단정도부동소수점형
adSmallInt 2 2바이트의부호있는정수
adTinyInt 16 1바이트의부호있는정수
adUnsignedBigInt 21 8바이트의부호없는정수
adUnsignedInt 19 4바이트의부호없는정수
adUnsignedSmallInt 18 2바이트의부호없는정수
adUnsignedTinyInt 17 1바이트의부호없는정수
adUserDefined 132 사용자정의변수
adVarBinary 204 바이너리형(Parameter오브젝트만)
adVarChar 200 문자열형(Parameter오브젝트만)
adVariant 12 오토메이션배리언트형
adVarWChar 202 Null로종료하는Unicode문자열형(Parameter오브젝트만)
adWchar 130 Null로종료하는Unicode문자열형
ServerVariables 컬렉션은 미리 정의된 환경 변수 값을 저장합니다.
구문
Request.ServerVariables (server environment variable)
매개 변수
server environment variable
찾을 서버 환경 변수 이름을 지정합니다. 이 값은 다음 값들 중 하나일 수 있습니다.변수 설명
ALL_HTTP
클라이언트가 보낸 모든 HTTP 헤더
ALL_RAW
원본 형식으로 된 모든 헤더를 찾습니다. ALL_RAW와 ALL_HTTP의 차이는 ALL_HTTP가 헤더 이름 앞에 HTTP_ 프리픽스를 놓고 헤더 이름은 항상 대문자입니다. ALL_RAW에서 헤더 이름과 값은 클라이언트가 보낼 때만 나타납니다.
APPL_MD_PATH
ISAPI DLL을 위한 (WAM) 응용 프로그램에 대한 메타베이스 경로를 찾습니다.
APPL_PHYSICAL_PATH
메타베이스 경로에 따라 실제 경로를 찾습니다. IIS는 APPI_MD_PATH를 실제 (디렉터리) 경로로 변환하여 이 값을 보냅니다.
AUTH_PASSWORD
클라이언트의 인증 대화 상자에 입력한 값입니다. 이 변수는 기본 인증을 사용할 때만 이용할 수 있습니다.
AUTH_TYPE
보호 스크립트에 접근할 때 사용자를 인증하기 위해 서버가 사용하는 인증 방법입니다.
AUTH_USER
인증된 사용자 이름입니다.
CERT_COOKIE
Returned as a string 클라이언트 보증서를 위한 고유 ID입니다. 전체 클라이언트 보증서를 위한 서명으로 사용될 수도 있습니다.
CERT_FLAGS
클라이언트 보증서가 있는 경우 bit0은 1로 설정됩니다.
클라이언트 보증서의 보증 기관이 유효하지 않을 경우(서버 CA 목록에 없을 경우) bit1은 1로 설정됩니다.
CERT_ISSUER
클라이언트 보증서의 발급 필드(O=MS, OU=IAS, CN=user name, C=USA).
CERT_KEYSIZE
SSL(Secure Sockets Layer) 연결 키 크기의 비트 수. (예: 128)
CERT_SECRETKEYSIZE
서버 보증서 개인 키의 비트 수. (예: 1024)
CERT_SERIALNUMBER
클라이언트 보증서의 일련 번호 필드
CERT_SERVER_ISSUER
서버 보증서의 발급 필드
CERT_SERVER_SUBJECT
서버 보증서의 제목 필드
CERT_SUBJECT
클라이언트 보증서의 제목 필드
CONTENT_LENGTH
클라이언트가 제공한 내용의 길이
CONTENT_TYPE
내용의 데이터 종류. HTTP 쿼리 GET, POST 및 PUT 등의 내용을 첨부한 쿼리에서 사용됩니다.
GATEWAY_INTERFACE
서버에서 사용되는 CGI 개정 기능. 형식은 CGI/개정입니다.
HTTP_<HeaderName>
HeaderName 헤더에 저장된 값입니다. 이 표에 기록되지 않은 다른 모든 헤더는 ServerVariables 컬렉션에서 값을 해제하기 위해 HTTP_로 시작해야 합니다.
참고 서버는 실제 헤더에서의 대시와 같은 HeaderName에 있는 모든 밑줄(_)을 해석합니다. 예를 들어, HTTP_MY_HEADER를 지정하면 서버는 MY-HEADER로 보내진 헤더를 찾습니다.
HTTPS
요청이 보안 채널(SSL)에 들어 오면 ON을 보내고, 요청이 비 보안 채널에 있을 경우는 OFF를 보냅니다.
HTTPS_KEYSIZE
SSL(Secure Sockets Layer) 연결 키 크기의 비트 수. (예: 128)
HTTPS_SECRETKEYSIZE
서버 보증서 개인 키의 비트 수. (예: 1024)
HTTPS_SERVER_ISSUER
서버 보증서의 발급자 필드.
HTTPS_SERVER_SUBJECT
서버 보증서의 제목 필드.
INSTANCE_ID
문자 형식의 IIS 인스턴스를 위한 ID. 인스턴스 ID가 1이면 문자열로 나타납니다. 이 변수를 이용하면 요청이 속하는 (메타베이스의)웹-서버 인스턴스의 ID를 저장할 수 있습니다.
INSTANCE_META_PATH
요청에 응답하는 IIS 인스턴스를 위한 메타베이스 경로입니다.
LOCAL_ADDR
요청이 들어온 서버 주소를 보냅니다. 한 기계에 여러 IP 주소를 가질 수 있는 multi-homed 기계에 있어서 중요한 사항이며 요청이 사용했던 주소를 찾아낼 수 있습니다.
LOGON_USER
사용자가 로그인 된 Windows NT® 계정.
PATH_INFO
클라이언트가 제공한 추가 경로 정보. 실제 경로와 PATH_INFO 서버 변수를 이용하여 스크립트에 접근할 수 있습니다. 정보가 URL로부터 오는 경우는 CGI 스크립트로 보내지기 전에 서버가 먼저 이를 분석합니다.
PATH_TRANSLATED
경로를 차지하고 필요한 가상에서 실제로 매핑을 수행하는 PATH_INFO 변환 버전입니다.
QUERY_STRING HTTP
요청의 물음표(?) 다음에 오는 문자열에 저장된 쿼리 정보.
REMOTE_ADDR
요청을 만드는 원격 호스트의 IP 주소.
REMOTE_HOST
요청을 만드는 호스트 이름. 서버에 이 정보가 없으면 REMOTE_ADDR을 설정하고 이것을 빈 채로 둡니다.
REMOTE_USER
사용자가 보낸 매핑 처리 되지 않은 사용자-이름 문자열. 이것은 실제로 사용자가 보내는 이름이며 서버에 설치된 인증 필터로 수정한 것들과는 반대되는 것입니다.
REQUEST_METHOD
요청을 만들기 위해 사용한 방법. HTTP의 경우 GET이나 HEAD, POST 등이 있습니다.
SCRIPT_NAME
실행되는 스크립트의 가상 경로입니다. 이것은 URL의 자체 참조를 위해 사용됩니다.
SERVER_NAME
URL 자체 참조에 나타나 듯이 서버의 호스트 이름, DNS 별명 또는 IP 주소입니다.
SERVER_PORT
요청이 보내진 포트 번호입니다.
SERVER_PORT_SECURE
0 또는 1을 포함하는 문자열입니다. 요청이 보안 포트에서 처리되면 1이고 그렇지 않으면 0입니다.
SERVER_PROTOCOL
요청된 정보 프로트콜의 이름 및 버전입니다. 형식은 protocol/revision입니다.
SERVER_SOFTWARE 요청에 응답하고 게이트웨이를 실행하는 서버 소프트웨어 이름 및 버전입니다. 형식은 name/version입니다.
URL URL의 기본 위치를 제공합니다.
<%@ Language=VBScript %>
<% Response.Buffer = true %>
<center>
<b>잠시만 기다려 주세요.</b>
<br>
<OBJECT
id=bbb
name=bbb
style="WIDTH: 300px; TOP: 500px; HEIGHT: 24px;Align: center;"
classid="clsid:0713E8D2-850A-101B-AFC0-4210102A8DA7"
codebase="http://activex.microsoft.com/controls/vb6/comctl32.cab" >
<PARAM NAME="BorderStyle" VALUE="0">
<PARAM NAME="Bordercolor" VALUE="42343243243">
<PARAM NAME="Enabled" VALUE="1">
</OBJECT>
<div id=kkkk name=kkkk></div>
<% Response.Flush %>
<%
'실행 응답시간
aaa = 1000
%>
<%
'100% 완료시 보여질 페이지
strVirtualResult = "aaa.asp"
%>
<% for i = 1 to aaa %>
<script language="JavaScript">
<% Response.Flush %>
kkkk.innerHTML = '<%=100 * (i/aaa)%>';
<% Response.Flush %>
bbb.Value = <%=100 * (i/aaa)%>;
<% Response.Flush %>
if (bbb.Value == 100){
window.location.href = '<%=strVirtualResult %>';
}
<%response.write "kkkk.innerHTML =' Loading... " & cint(100 * (i/aaa)) & "%'" %>
</script>
<%next%>
<% Response.End%>
<% Response.Clear%>
# setInterval()과 XMLHTTP 를 이용하여 페이지 Refresh
* 장점
1) 브라우저 진행율 표시 안나타남
2) Refresh 소리 없음
--> 이 소스는 정해진 시간마다 회원이 로그아웃 했는지를 체크하기 위해 만들었습니다.
로그인상태의 회원은 LOGON 값을 현재시간으로 업데이트하고,
로그아웃상태인 회원은 LOGON 값이 널(null)이 됩니다.
* logon.asp 는 로그인한 회원정보를 보여주는 파일입니다.
* logon_update.asp 는 logon_time.asp 파일을 일정간격으로 refresh한 효과를 냅니다.
* logon_time.asp 파일은 현재시간을 LOGON 값에 넣어줍니다.
(1) XMLHTTP 설명
1. XMLHTTP 메서드
Abort 현재 HTTP 요청을 취소합니다.
GetAllResponseHeaders 응답 메시지에서 모든 헤더 필드를 검색합니다.
GetResponseHeader 응답 본문에서 HTTP 헤더의 값을 검색합니다.
Open HTTP서버에 대한 연결을 엽니다.
SetRequestHeader 요청 헤더 필드 중 하나를 설정합니다.
Send HTTP 서버로 요청을 보냅니다. 본문이 포함될 수 있습니다.
2. XMLHT TP 속성 : 속성을 사용하여 요청 확인
--> XMLHTTP 속성을 사용하면 요청을 확인할 수 있을 뿐만 아니라 서버로부터
반환된 값을 검색하여 요청으로 발생한 모든 오류를 확인할 수 있습니다.
=========================================================================
속성 값 설명
=========================================================================
OnReadyStateChange 이벤트 처리기 참조 비동기 작업에서만 사용합니다.
이 속성은 데이터가 서버에서 반환되는 것과 같은
대기 상태가 변경될 때 이벤트 처리기 호출을 지정합니다.
ReadyState Integer 비동기 작업의 상태, uninitialized (0), loading (1),
loaded (2), interactive (3), completed (4)를 나타냅니다.
ResponseBody Variant 배열 응답의 본문을 배열로 반환합니다.
ResponseStream IStream 응답의 본문을 ADO Stream 개체로 반환합니다.
ResponseText String 응답의 본문을 텍스트 문자열로 반환합니다.
ResponseXML XMLDocument 개체 응답의 본문을 MSXML XMLDOM 파서로 분석된 것으로
반환합니다.
Status Long 서버가 반환한 HTTP 상태 코드
StatusText String HTTP 응답 라인 상태
=========================================================================
(2) 소스 설명
'----------logon.asp 시작------------------
' member_uid : 회원 고유번호
<iframe width="0" height="0" border="0" frameborder="0" src="/logon_update.asp?member_uid=<%=member_uid%
>"></iframe>
'----------logon.asp 끝 ------------------
'----------logon_update.asp 시작------------------
<%
Dim member_uid
member_uid = Trim(Request.QueryString("member_uid")) ' 회원 고유번호
%>
<html>
<head>
<script language="javascript">
<!--
// logon_update.asp 파일을 로드한다.
function pageLoad() {
// (1) XMLHTTP 객체를 생성합니다.
var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP")
// (2) HTTP서버에 대한 연결을 엽니다.
xmlHTTP.open("get","logon_time.asp?member_uid=<%=member_uid%>",false);
// (3) HTTP 서버로 요청을 보냅니다.
xmlHTTP.send();
}
function intervalCall() {
setInterval("pageLoad()", 5000); // 5초간격으로 pageLoad()함수 호출
}
//-->
</script>
</head>
<body onload="intervalCall()">
</body>
</html>
'----------logon_update.asp 끝------------------
'----------logon_time.asp 시작------------------
<!--#include virtual="/dbconnect.asp"-->
<%
On Error Resume Next
Dim member_uid
member_uid = Trim(Request.QueryString("member_uid")) ' 회원 고유번호
Dim Dbcon, Rs, sqlQuery
' dbconnect.asp 에 정의된 DbOpen()함수를 통해 DB Connection 객체 생성
'(@@ 이부분은 직접 정의하여 사용하세요 ^^;)
Set Dbcon = DbOpen()
' 로그인한지 10초가 초과한 회원의 logon필드값을 널(NULL)로 업데이트
strSQL = ""
strSQL = "UPDATE MEMBER_INFO"
strSQL = strSQL & " SET LOGON = NULL"
strSQL = strSQL & " WHERE DATEDIFF(SECOND, LOGON, getdate()) > 10"
Dbcon.Execute(strSQL)
sqlQuery = ""
sqlQuery = "SELECT * FROM MEMBER_INFO WHERE MEMBER_UID="& member_uid
' 회원 로그온 시간 업데이트
Set Rs = Server.CreateObject("ADODB.Recordset")
With Rs
.Source = sqlQuery
.ActiveConnection = Dbcon
.CursorType = adOpenStatic
.LockType = adLockPessimistic
.Open , , , ,adCmdText
.Fields("LOGON_TIME") = Now
.Update
End With
' Error 체크 (@@ ErrorCheck() 함수도 dbconnect.asp 에 정의됨.)
Call ErrorCheck("회원 로그온 시간 UPDATE 처리")
Rs.Close
Set Rs = Nothing
' DB Connection 객체 Close
DbClose(Dbcon)
%>
'----------logon_time.asp 끝------------------
create table #temp_lib1
(
a char(1),
b varchar(10),
c int
)
insert into #temp_lib1 values('A', '상품1', 10)
insert into #temp_lib1 values('A', '상품2', 20)
insert into #temp_lib1 values('A', '상품3', 30)
insert into #temp_lib1 values('B', '상품1', 10)
insert into #temp_lib1 values('C', '상품3', 15)
insert into #temp_lib1 values('A', '상품3', 40)
insert into #temp_lib1 values('B', '상품4', 50)
insert into #temp_lib1 values('C', '상품2', 10)
insert into #temp_lib1 values('C', '상품3', 20)
insert into #temp_lib1 values('D', '상품2', 20)
insert into #temp_lib1 values('C', '상품5', 20)
select a 창고, b 상품, c 수량 from #temp_lib1
-----------------------------
출력
-----------------------------
창고 상품 수량
-----------------------------
A 상품1 10
A 상품2 20
A 상품3 30
B 상품1 10
C 상품3 15
A 상품3 40
B 상품4 50
C 상품2 10
C 상품3 20
D 상품2 20
C 상품5 20
-----------------------------
이렇게 입력되었습니다.
결과를 만드는 쿼리는..
declare @b varchar(10)
declare @sql varchar(8000)
set @sql = 'select x.a 창고, '
declare c_cursor cursor for
select b
from #temp_lib1
group by b
order by b for read only
open c_cursor
fetch next from c_cursor into @b
while @@fetch_status = 0
begin
set @sql = @sql + 'max((case x.b when ''' + cast(@b as varchar(10)) + ''' then x.sum_c else 0 end)) ' + cast(@b as varchar(10)) +', '
fetch next from c_cursor into @b
end
close c_cursor
deallocate c_cursor
set @sql = left(@sql, len(@sql)-1)
set @sql = @sql + ' from '
set @sql = @sql + '( select a, b, sum(c) sum_c '
set @sql = @sql + ' from #temp_lib1 '
set @sql = @sql + ' group by a, b) as x '
set @sql = @sql + 'group by x.a '
set @sql = @sql + 'order by x.a'
exec(@sql)
-----------------------------------------------------------
출력
-----------------------------------------------------------
창고 상품1 상품2 상품3 상품4 상품5
-----------------------------------------------------------
A 10 20 70 0 0
B 10 0 0 50 0
C 0 10 35 0 20
D 0 20 0 0 0
-----------------------------------------------------------
몇일동안 정규표현식과 씨름하다가 만들었습니다.
정해진 태그만 딱 허용하면 테러당할일은 없겠지요..
<%
'//패턴으로 치환할수 있는 eregi_replace()함수를 구현
'//PHP에는 있으나 ASP에는 없기 때문
Function eregi_replace(pattern, replace, text)
Dim eregObj:
Set eregObj = New RegExp:
eregObj.Pattern = pattern: '//패턴 설정
eregObj.IgnoreCase = True: '//대소문자 구분 여부
eregObj.Global = True: '//전체 문서에서 검색
eregi_replace = eregObj.Replace(text, replace): '//Replace String
End Function
'//허용태그 외의 모든 태그제거 함수
Function strip_tags(str,allowtags)
Dim content:
Dim tags:
content = str:
tags = replace(allowtags,",","|"):
content = eregi_replace("<(/?)(?!/|" & tags & ")([^<>]*)?>", "<$1$2>", content):
contents = eregi_replace("(javascript:|vbscript:)+","$1//",contents):
contents = eregi_replace
("(.location|location.|onload=|.cookie|alert(|window.open(|onmouse|onkey|onclick|view-
source:)+","//",contents): '//자바스크립트 실행방지
strip_tags = content:
End Function
'//사용예
Dim permitTags, comment:
permitTags = "br,a,img,table,b,font,div,center,embed":
comment = "<font color=red>허용하지 않은 태그</font>가<br>잘 <b>보이나요?</b><br><script></script>":
comment = comment & "<div align=center>아주 유용할꺼에요~</div><body><html><xmp><pre>":
response.write strip_tags(comment,permitTags):
%>
Option Explicit
Dim sBASE_64_CHARACTERS, sBASE_64_CHARACTERSansi
sBASE_64_CHARACTERS
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sBASE_64_CHARACTERSansi = strUnicode2Ansi(sBASE_64_CHARACTERS)
Function strUnicodeLen(asContents)
Dim asContents1 : asContents1 ="a" & asContents
Dim Len1 : Len1=Len(asContents1)
Dim K : K=0
Dim I, Asc1
For I=1 To Len1
Asc1 = asc(mid(asContents1,I,1))
IF Asc1 < 0 Then Asc1 = 65536 + Asc1
IF Asc1 > 255 Then
K = K + 2
ELSE
K = K + 1
End IF
Next
strUnicodeLen = K - 1
End Function
Function strUnicode2Ansi(asContents)
Dim Len1 : Len1 = Len(asContents)
Dim I, VarCHAR, VarASC, VarHEX, VarLOW, VarHIGH
strUnicode2Ansi = ""
For I = 1 to Len1
VarCHAR = Mid(asContents,I,1)
VarASC = Asc(VarCHAR)
IF VarASC < 0 Then VarASC = VarASC + 65536
IF VarASC > 255 Then
VarHEX = Hex(VarASC)
VarLOW = Left(VarHEX,2)
VarHIGH = Right(VarHEX,2)
strUnicode2Ansi = strUnicode2Ansi & ChrB("&H" & VarLOW ) & ChrB
("&H" & VarHIGH )
Else
strUnicode2Ansi = strUnicode2Ansi & ChrB(VarASC)
End IF
Next
End Function
Function strAnsi2Unicode(asContents)
Dim Len1 : Len1 = LenB(asContents)
Dim VarCHAR, VarASC, I
strAnsi2Unicode = ""
IF Len1=0 Then Exit Function
For I=1 To Len1
VarCHAR = MidB(asContents,I,1)
VarASC = AscB(VarCHAR)
IF VarASC > 127 Then
strAnsi2Unicode = strAnsi2Unicode & Chr(AscW(MidB(asContents,
I+1,1) & VarCHAR))
I = I + 1
Else
strAnsi2Unicode = strAnsi2Unicode & Chr(VarASC)
End IF
Next
End function
Function Base64encode(asContents)
Dim lnPosition
Dim lsResult
Dim Char1
Dim Char2
Dim Char3
Dim Char4
Dim Byte1
Dim Byte2
Dim Byte3
Dim SaveBits1
Dim SaveBits2
Dim lsGroupBinary
Dim lsGroup64
Dim M3, M4, Len1, Len2
Len1 =LenB(asContents)
IF Len1 < 1 Then
Base64encode = ""
Exit Function
End IF
M3=Len1 Mod 3
IF M3 > 0 Then asContents = asContents & String(3 - M3, ChrB(0))
IF m3 > 0 Then
Len1 = Len1 + (3 - M3)
Len2 = Len1 - 3
Else
Len2 = Len1
End IF
lsResult = ""
For lnPosition = 1 To Len2 Step 3
lsGroup64 = ""
lsGroupBinary = MidB(asContents, lnPosition, 3)
Byte1 = AscB(MidB(lsGroupBinary, 1, 1)) : SaveBits1 = Byte1
And 3
Byte2 = AscB(MidB(lsGroupBinary, 2, 1)) : SaveBits2 = Byte2
And 15
Byte3 = AscB(MidB(lsGroupBinary, 3, 1))
Char1 = MidB(sBASE_64_CHARACTERSansi, ((Byte1 And 252) 4) + 1,
1)
Char2 = MidB(sBASE_64_CHARACTERSansi, (((Byte2 And 240) 16)
Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = MidB(sBASE_64_CHARACTERSansi, (((Byte3 And 192) 64)
Or (SaveBits2 * 4) And &HFF) + 1, 1)
Char4 = MidB(sBASE_64_CHARACTERSansi, (Byte3 And 63) + 1, 1)
lsGroup64 = Char1 & Char2 & Char3 & Char4
lsResult = lsResult & lsGroup64
Next
IF M3 > 0 Then
lsGroup64 = ""
lsGroupBinary = MidB(asContents, Len2 + 1, 3)
Byte1 = AscB(MidB(lsGroupBinary, 1, 1)) : SaveBits1 = Byte1
And 3
Byte2 = AscB(MidB(lsGroupBinary, 2, 1)) : SaveBits2 = Byte2
And 15
Byte3 = AscB(MidB(lsGroupBinary, 3, 1))
Char1 = MidB(sBASE_64_CHARACTERSansi, ((Byte1 And 252) 4) + 1,
1)
Char2 = MidB(sBASE_64_CHARACTERSansi, (((Byte2 And 240) 16)
Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = MidB(sBASE_64_CHARACTERSansi, (((Byte3 And 192) 64)
Or (SaveBits2 * 4) And &HFF) + 1, 1)
IF M3=1 Then
lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61)
Else
lsGroup64 = Char1 & Char2 & Char3 & ChrB(61)
End IF
lsResult = lsResult & lsGroup64
End IF
Base64encode = lsResult
End Function
Function Base64decode(asContents)
Dim lsResult
Dim lnPosition
Dim lsGroup64, lsGroupBinary
Dim Char1, Char2, Char3, Char4
Dim Byte1, Byte2, Byte3
Dim M4, Len1, Len2
Len1 = LenB(asContents)
M4 = Len1 Mod 4
IF Len1 < 1 Or M4 > 0 Then
Base64decode = ""
Exit Function
End IF
IF MidB(asContents, Len1, 1) = ChrB(61) Then M4 = 3
IF MidB(asContents, Len1-1, 1) = ChrB(61) Then M4 = 2
IF M4 = 0 Then
Len2 = Len1
Else
Len2 = Len1 - 4
End IF
For lnPosition = 1 To Len2 Step 4
lsGroupBinary = ""
lsGroup64 = MidB(asContents, lnPosition, 4)
Char1 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 1, 1)) -
1
Char2 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 2, 1)) -
1
Char3 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 3, 1)) -
1
Char4 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 4, 1)) -
1
Byte1 = ChrB(((Char2 And 48) 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & ChrB(((Char3 And 60) 4) Or (Char2 * 16)
And &HFF)
Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
lsGroupBinary = Byte1 & Byte2 & Byte3
lsResult = lsResult & lsGroupBinary
Next
IF M4 > 0 Then
lsGroupBinary = ""
lsGroup64 = MidB(asContents, Len2 + 1, M4) & ChrB(65)
IF M4=2 Then
lsGroup64 = lsGroup64 & chrB(65)
End IF
Char1 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 1, 1)) - 1
Char2 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 2, 1)) - 1
Char3 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 3, 1)) - 1
Char4 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 4, 1)) - 1
Byte1 = ChrB(((Char2 And 48) 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & ChrB(((Char3 And 60) 4) Or (Char2 * 16) And &HFF)
Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
IF M4=2 Then
lsGroupBinary = Byte1
elseIF M4=3 Then
lsGroupBinary = Byte1 & Byte2
end IF
lsResult = lsResult & lsGroupBinary
End IF
Base64decode = lsResult
End Function
'################################## 사용 샘플 ##################################
Dim ORIGNvalue : ORIGNvalue = "하완어환오라ㅓ고ㅓ엉ㅁㄹ22ㅁㅁ@@ㅇㅁㄹ;ㄴㅇ
aabcsdfaeerdfadf"
Dim EncodeA : EncodeA = strAnsi2Unicode(Base64encode(strUnicode2Ansi
(ORIGNvalue)))
Dim DecodeA : DecodeA = strAnsi2Unicode(Base64decode(strUnicode2Ansi(EncodeA)))
response.write "------------------------------------------------------------------------<BR>"
response.write "lsResult : " & ORIGNvalue & "<BR>"
response.write "lsResult : " & EncodeA & "<BR>"
response.write "lsResult : " & DecodeA & "<BR>"
response.write "------------------------------------------------------------------------<BR>"
%>
참고로 이건 제가 한건 아니고 아는 친구가 한건데 꼭 asp로만 해야하는 경우엔 사용해보세요...
길어서 설명은 그렇구요...뭐 간단히 말씀드리면 ANSI->Base64->유니코드 이런식으로 알고 있습니다.
것보담은 잘 못보는 asp 표현 형태가 있을겁니다. MSDN에 찾아보면 다 나오구요...
개인적으로 asp에 이런 표현도 있구나 하고 놀랐던 기억이 있습니다. 함 공부들 해보세요~~
dll 형태로 만들어본적도 있는데요. 그건 외국 컴포넌트 응용해서 만들어봤습니다.
결과는 동일하더군요. 아마 base64의 원리가 이런것 같습니다.
좋은 날 되세요~
vb의
HTML 코드중에 select, radio, checkBox가 많이 쓰일때 제가 쓰는 함수입니다.
함께 테스트 할수 있는 예제를 같이 써넣을께요.. ^^
----------------------------------------------------------------------------------
<HTML>
<HEAD>
<TITLE> Select, Radio, checkBox </TITLE>
<script language="javascript">
<!--
function radioButton(formElement)
{
alert(formElement.value);
}
function checkBox(formElement)
{
alert(formElement.value);
}
function selectBox(formElement)
{
alert(formElement.value);
}
//-->
</script>
</HEAD>
<BODY>
<%=selectBox("selectHobby", "영화감상,음악감상,골프,바둑", "음악감상", "onchange='selectBox(this)'")%>
<%
response.write vbcr & "<br><br>" & vbcr
response.write radioButton("radioHobby", "영화감상,음악감상,골프,바둑", "골프", "onclick='radioButton(this)'")
response.write vbcr & "<br><br>" & vbcr
response.write checkBox("checkBoxHobby", "영화감상,음악감상,골프,바둑", "바둑", "onclick='checkBox(this)'")
'selectbox
function selectBox(name, value, selectValue, javaScript)
dim sValue, i, totalView
totalView = "<select name='" & name & "' " & javaScript & ">" & vblf
sValue = split(value, ",")
for i = 0 to ubound(sValue)
totalView = totalView & "<option value='" & sValue(i) & "'"
if sValue(i) = selectValue then
totalView = totalView & " selected"
end if
totalView = totalView & ">" & sValue(i) & "</option>" & vblf
next
totalView = totalView & "</select>"
selectBox = totalView
end function
'radio
function radioButton(name, value, selectValue, javaScript)
dim sValue, i, totalView
sValue = split(value, ",")
for i = 0 to ubound(sValue)
totalView = totalView & "<input type='radio' name='" & name & "' value='" & sValue(i) & "'"
if sValue(i) = selectValue then
totalView = totalView & " checked"
end if
if not isnull(javaScript) or javaScript <> "" then
totalView = totalView & " " & javaScript
end if
totalView = totalView & ">" & sValue(i) & " " & vblf
next
radioButton = totalView
end function
'checkbox
function checkBox(name, value, selectValue, javaScript)
dim sValue, i, totalView
sValue = split(value, ",")
for i = 0 to ubound(sValue)
totalView = totalView & "<input type='checkbox' name='" & name & "' value='" & sValue(i) & "'"
if sValue(i) = selectValue then
totalView = totalView & " checked"
end if
if not isnull(javaScript) or javaScript <> "" then
totalView = totalView & " " & javaScript
end if
totalView = totalView & ">" & sValue(i) & " " & vblf
next
checkBox = totalView
end function
%>
</BODY>
</HTML>
----------------------------- 수정 ------------------------------
아무래도 사용을 하다보니 한계가 느껴지네요.. ㅋㅋ
그래서 몇가지더 수정을 해서 올립니다. 다만 이런 Function을 사용하는건..
회원가입 혹은 입사지원 같은 폼 형태에서 사용하시는게 좋습니다.
일반 페이지에서 이걸 쓴다면.. -_- 몇개 안되시면 그냥 HTML에 적용하시는게 빠를수도 있습니다. ^^
<%
'----------------------------------------------------------------------------------
' selectBox 만들기
' - name : select 이름
' - value : option의 value값 형태는("1,2,3")
' - title : option의 title값 형태는("1,2,3")
' - selectValue : 선택된 값
' - style : style 적용값
' - vClass : css 값
' - javascript : javascript 내용
'----------------------------------------------------------------------------------
Function selectBox(name, value, title, selectValue, style, vClass, javascript)
sValue = split(value, ",")
if title <> "" then
sTitle = split(title, ",")
end if
write = "<select name='" & name & "' "
if style <> "" then
write = write & " style='" & style & "' "
end if
if vClass <> "" then
write = write & " class='" & vClass & "' "
end if
if javascript <> "" then
write = write & javascript
end if
write = write & ">"
for i = 0 to ubound(sValue)
write = write & "<option value='" & sValue(i) & "'"
if sValue(i) = selectValue then
write = write & " selected"
end if
write = write & ">"
if title <> "" then
write = write & sTitle(i)
else
write = write & sValue(i)
end if
write = write & "</option>"
next
write = write & "</select>"
Response.Write write
End Function
'----------------------------------------------------------------------------------
' radio 만들기
' - name : radio 이름(공통)
' - value : value값 형태는("1,2,3")
' - title : title값 형태는("1,2,3")
' - checkValue : 체크된 값
' - alignNum : 정렬시 사용되는 숫자
' - style : style 적용값
' - vClass : css 값
' - javascript : javascript 내용
'----------------------------------------------------------------------------------
Function radio(name, value, title, checkValue, alignNum, style, vClass, javascript)
sValue = split(value, ",")
if title <> "" then
sTitle = split(title, ",")
end if
for i = 0 to ubound(sValue)
write = write & "<input type='radio' name='" & name & "' value='" & sValue(i) & "'"
if sValue(i) = checkValue then
write = write & " checked"
end if
if style <> "" then
write = write & " style='" & style & "'"
end if
if vClass <> "" then
write = write & " class='" & vClass & "'"
end if
if javascript <> "" then
write = write & javascript
end if
write = write & ">"
if title <> "" then
write = write & sTitle(i)
else
write = write & sValue(i)
end if
if alignNum <> "" then
if (i+1) mod alignNum = 0 then
write = write & "<br>"
end if
end if
next
Response.Write write
End Function
'----------------------------------------------------------------------------------
' checkbox 만들기
' - name : radio 이름(공통)
' - value : value값 형태는("1,2,3")
' - title : title값 형태는("1,2,3")
' - checkValue : 체크된 값
' - alignNum : 정렬시 사용되는 숫자
' - style : style 적용값
' - vClass : css 값
' - javascript : javascript 내용
'----------------------------------------------------------------------------------
Function checkBox(name, value, title, checkValue, alignNum, style, vClass, javascript)
sValue = split(value, ",")
if title <> "" then
sTitle = split(title, ",")
end if
for i = 0 to ubound(sValue)
write = write & "<input type='checkbox' name='" & name & "' value='" & sValue(i) & "'"
if instr(checkValue, sValue(i)) > 0 then
write = write & " checked"
end if
if style <> "" then
write = write & " style='" & style & "'"
end if
if vClass <> "" then
write = write & " class='" & vClass & "'"
end if
if javascript <> "" then
write = write & javascript
end if
write = write & ">"
if title <> "" then
write = write & sTitle(i)
else
write = write & sValue(i)
end if
if alignNum <> "" then
if (i+1) mod alignNum = 0 then
write = write & "<br>"
end if
end if
next
Response.Write write
End Function
%>
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<%call selectBox("testSelect", "1,2,3,4,5", "", "3", "", "", "")%>
<br><br>
<%call radio("testRadio", "1,2,3,4,5", "", "3", "3", "", "", "")%>
<br><br>
<%call checkBox("testCheck", "1,2,3,4,5", "", "1,2", "3", "", "", "")%>
</BODY>
</HTML>
ASP에 Excel 스프레드시트 표시하기
Nadine Cheff, 웹 기술 저자
인터넷 정보 서비스 문서화 팀
Microsoft Corporation
1999년 11월 15일
본 팁은 Microsoft Excel 스프레드시트를 ASP(Active Server Page)에 표시하는 데 사용할 수 있는 기술을 다
룹니다. ASP에 제공되는 표준 서버 구성요소 중에는 ADO(ActiveX Data Objects)가 있습니다. 본 팁의 코드
샘플은 ADO가 모든 종류의 데이터를 액세스 할 수 있도록 해 주는 연결 메커니즘이라는 것을 보여 줍니다.
Excel 스프레드시트를 ASP에 표시하려면 다음 규칙을 따라야 합니다.
스프레스시트를 만들 때에는 특별한 형식이나 열 레이블을 포함시켜서는 안됩니다.
워크북 이름 붙이기
Excel 스프레드시트를 열고 ASP 페이지에 표시하고자 하는 행과 열을 선택하여 반전시킵니다. 반전된 영역
이 워크북이 됩니다.
삽입 메뉴에서 이름을 선택하고 정의를 누릅니다.
등록된 이름이 있으면 그 이름을 모두 선택하고 삭제를 누릅니다.
워크북 이름을 입력하고 추가를 누른 다음 확인을 누릅니다.
워크북 이름과 같은 이름을 스프레드시트에 붙이기
페이지 맨 아래 스프레드시트 탭을 마우스 오른쪽 단추로 누릅니다.
이름 바꾸기를 선택합니다.
위의 워크북과 같은 이름을 입력하고 입력을 선택합니다.
이 워크북을file://WINNT/system32/inetsrv/iisadmin/폴더 이름과 file://inetpub/wwwroot에 저장합니다.
다음 스크립트를 입력하고 file://inetpub/wwwroot에 저장합니다.
<HTML>
<HEAD>
<TITLE>ASP Page에 Excel 스프레드시트 표시하기</TITLE>
<link rel=".../stylesheet" href="iistanbul.css">
</HEAD>
<BODY BGCOLOR="#FFFFFF" text="#000000" >
<H1>목차</H1>
<p>이 링크를 사용하여 특정 월의 컨텐트 보기
<br><a href="#Aug">Aug 99</a> <a href="#Sept">Sept 99</a>
<% @language=vbscript %>
<%
Set oConn = Server.CreateObject("ADODB.Connection")
strConn = "Driver={Microsoft Excel Driver (*.xls)}; DBQ=" &
Server.MapPath("iisadmin") "websiteASPTOC.xls;" '워크북을 저장한 파일 주소
oConn.Open strConn
strCmd = "SELECT * from `ASPTOC `"
Set oRS = Server.CreateObject("ADODB.Recordset")
oRS.Open strCmd, oConn
Response.Write "<TABLE BORDER=1 BGCOLOR=#FFFFFF BORDERCOLOR=#a3a3a3
BORDERCOLORLIGHT=#000000
BORDERCOLORDARK=#767676><tr><td>"
Response.Write oRS.GetString (, -1, "</tr><td>", "</td></tr><tr><td>", NBSPACE)
%>
</TABLE>
</BODY>
</HTML>
mailwriteok.asp
<%
frommail=request("frommail") '메일주소를 넘겨받음
title=request("title") '메일제목을 넘겨받음
content=request("content") '메일내용을 넘겨받음
title = replace(title,"'","''") '메일제목을 디비에 저장하기위해 replace처리를 해줌
content=replace(content,"'","''") '위와같음
content=replace(content,chr(13)&chr(10),"<br>") '이건 걍.....
SQL = "SELECT receiver FROM mail"
set rs = Server.CreateObject("ADODB.Recordset")
rs.open SQL,session("db")
'보낼메일주소가 저장되어 있는 테이블에서 메일주소를 검색함
sql= "select MAX(num) from mailinsert"
set rss=Server.CreateObject("ADODB.Recordset")
rss.open SQL,session("db")
'메일제목과 내용이 저장될 테이블에서 가장큰 넘버값을 검색함
if Isnull(rss(0)) then
number=1
else
number=rss(0)+1
end if
rss.Close
'테이블에 아무것도 없으면 넘버는 1이고 그렇지 않으면... 알죠?
do until rs.eof
'until문을 썼음..
SQL = "INSERT INTO mailinsert (num,writeday,receiver,title,content,mailread)VALUES "
SQL = SQL & "(" & number
SQL = SQL & ",'" & now() & "'"
SQL = SQL & ",'" & rs("receiver") & "'"
SQL = SQL & ",'" & title & "'"
SQL = SQL & ",'" & content &"'"
SQL = SQL & ",0)"
session("db").Execute SQL
'메일일련번호,날짜,보내는메일주소,메일제목,메일내용,0값을 mailinsert테이블에 저장함
'mailread가 0이면 메일을 읽지 않은것이고 1이면 읽은것이고...
set mail=server.createobject("cdonts.newmail") '메일객체 생성(CDONTS)
mail.to = rs("receiver")'받는사람
mail.from=frommail '보내는사람
mail.subject=title '제목
mail.body=content & "<img src=http://www.ttt.com/checkReceiver.asp?idx="&number&" width=0 height=0>"
'가장중요함.. 메일내용끝에 img태그를 써서 메일일련번호(number값)를 checkReceiver.asp파일로 넘겨줌..
'이거 구현하는게 가장 힘들었음.. 머리가 나빠서.. 캬캬캬
'우리회사 윤대리님 아니었으면 구현못했음.. 윤대리님에게 무진장 감사하다는 말씀 올립니다.
mail.bodyformat=0 '태그형태로 보냄
mail.mailformat=0
mail.send '메일보내기
number = number + 1
'number를 왜 +1해주는지 알죠?
rs.movenext
loop
rs.Close
Response.redirect "mailsendok.html"
%>
자 이제는 상대방이 메일을 읽으면 메일일련번호를 checkReceiver.asp로 넘겨주겠죠?
그럼 checkReceiver.asp를 알아보죠.
checkReceiver.asp
<%
Sql = "update mailinsert set mailread=1 where num=" & request("idx")
session("Db").execute sql
%>
checkReceiver.asp파일은 간단하죠?
메일일련번호를 checkReceiver.asp에서 넘겨받으면 메일일련번호와 똑같은 것을
1로 업데이트 해주는 것입니다.
위에서도 말했지만 mailread가 0이면 안읽은 것이고 1이면 읽은것이죠.
이제 끝입니다.
무진장 간단하죠?
이렇게 간단한것을 무려 3일동안 머리싸매고 고민했습니다.
그리고 우리회사 윤대리님 아니었으면 구현하지도 못했죠..
내 아이큐가 그렇게 나쁜게 아닌데...캬캬캬
그러고 보니까 이 모든 것이 태오님 책에서 보고베끼고 응용한 것이네요..
끝으로 loveroad님,태오님,우리회사 윤대리님에게 감사의 말씀 올립니다.
p.s : 소스가 뭔가 이상하다고 생각되어도 뭐라고 하면 안됨..
어찌되었던간에 엠팔,드림위즈,한메일,핫메일,천리안,아웃룩에서 모두 수신확인 가능한것을
확인했으니깐요....
어제 Date()-1
한주 체크(오늘날짜기준) Between Date()-1 and Date()-7
이번주 날짜 Between Date()-(WeekDay(Date())-1) AND Date()+(7-WeekDay(Date()))
지난주 일주일날짜 Between Date()-6-WeekDay(Date()) AND Date()-WeekDay(Date())
2주전 일주일날짜 Between Date()-13-WeekDay(Date()) AND Date()-WeekDay(Date())-7
이번달 month((Now())
올해 Year(Now())
지난해 Year(Now())-1
오늘로부터 작년 365일 Between Date() And Date()-365 / Between Date() and SerialDate(Year(Now())-1;Month(Now());Day(Now()))+1
할 때 한 사용자가 서비스가 중지되는 동시접속 방지의 기능을 본 적이 있을 것이다. 그러나 인터넷의 회원제
사이트에서는 이런 기능들을 찾아보기 힘들 것이다. 인터넷이라는 특성상 강제로 클라이언트를 종료하기 위
한 기능들이 부족하기 때문이다. 그렇지만 실제 상용의 서비스를 하는 사이트라면 한번씩은 이 문제에 대해
서 고민을 하게 된다. 만일 인터넷에서 동시접속을 방지하고자 한다면 어떻게 하면 좋을까? 지금부터 그 방법
을 공개하도록 하겠다.
1) 동시접속 방지의 밑그림
인터넷상에서 동시접속을 방지하고자 하면 어떤 알고리즘을 이용하면 가능할까? 지금부터 동시접속 방지를
위한 밑그림을 그려보겠다. 우선 홈페이지에 접속하는 클라이언트가 가지는 고유한 값이 있는지 알아보아야
한다. 크게 하드웨어적인 IP 주소가 있을 것이고, 서버에서 자동으로 할당되는 SessionID 값 등이 있을 것이
다. 이중 하드웨어적인 클라이언트의 접속 주소를 나타내는 IP 주소를 동시접속 방지의 핵심 키로 이용해 보
도록 하자. 처음 사용자가 접속하여 회원 로그인을 할 때 해당 클라이언트의 IP 주소를 테이블에 저장한다. 한
번 사이트에 접속하였으면 동적 IP를 사용하고 있어도 그 IP의 값이 변경되지 않는다. 이런 IP의 값을 사이트
이용 중 수시로 테이블에 저장되어 있는 값과 동일한지 검사하는 과정을 거친다. 한 사용자가 접속하여 사용
한다면 아무런 문제가 일어나지 않을 것이다. 그러나 동일한 아이디로 다른 사용자가 사이트의 접근을 시도하
는 경우 동시접속 방지의 기능이 수행되게 하여 동시접속을 방지하게 된다. 이미 한 사용자가 neovis라는 아
이디로 접속하여 사용하고 있는 상황에서 다른 사용자가 neovis라는 아이디로 접속을 시도한다고 생각해 보
자. 앞서 로그인 과정에서 클라이언트의 IP 주소를 저장한다고 하였다. 그렇기 때문에 다른 컴퓨터에서 접속
을 하게 되면 이미 저장되어 있는 IP 주소가 현재 접속을 시도하는 사용자의 IP 주소로 변경된다. 이렇게 되면
이미 로그인이 되어 있는 사용자는 어떻게 될까? 사이트 내에서 서비스를 이용할 때마다 현재 클라이언트의
IP 주소와 테이블에 저장되어 있는 값의 비교를 하는 동시접속 체크를 통해 IP 주소가 다른 값을 가지게 때문
에 자동으로 접속을 해제시켜 버리게 될 것이다. 이런 원리를 이용하여 인터넷에서 동시접속을 방지할 수 있
는 것이다.
두 대의 다른 클라이언트 컴퓨터를 사용하여 같은 사용자가 접속을 시도할 경우라도 먼저 접속한 컴퓨터에서
사이트 접속이 해제되기 때문에 서비스의 이용에서 사용자의 불편함은 없다. 또한 동적 IP를 사용하는 경우
나 컴퓨터가 다운되더라도 로그인 과정에서의 동시접속에 대한 확인절차가 없기 때문에 사용자는 아무런 기
능의 제약 없이 사이트로 접근할 수 있는 것이다. 단 두 사람이 동시에 접속할 때에만 체크를 하기 때문에 홈
페이지 상에서 훌륭히 동시 접속 사용자를 방지할 수 있다고 하겠다.
2) 동시접속 방지 모듈 구성하기
동시접속을 방지할 수 있는 방법을 알아보았다. 이런 알고리즘을 이용하여 실제 사이트에 적용할 수 있는 코
드들을 만들어 보도록 하자. 각각의 코드들이 완벽하게 독립적으로 실행되는 것이 아니기 때문에 필요한 곳
에 직접 추가시켜 작업해야 원하는 효과를 얻을 수 있을 것이다.
① 로그인 처리 부분의 IP 주소 저장
회원 테이블이나 다른 로그인에 관련된 테이블에 로그인을 하는 사용자의 IP 주소를 저장하는 부분이 추가되
어야 한다. 단순히 기존의 필드의 값을 수정하는 쿼리문을 추가하면 되기 때문에 구현에 큰 문제점은 없을 것
이다.
----------------------------------------------------------------------------------------------------
strSQL = "update member set IP = '" & Request.ServerVariables("REMOTE_ADDR") & "' where USER_ID = '" &
USER_ID & "'"
IpUpdate = dbCon.execute(SQL)
----------------------------------------------------------------------------------------------------
회원 테이블인 member 테이블에 사용자의 IP 주소를 저장하는 IP 필드에 현재 접속하는 사용자의 IP 주소를
업데이트하는 쿼리문이다. 각 시스템에 맞게 이외의 다른 정보들도 같이 수정할 수 있으니 참고하기 바란다.
② 현재 접속 IP와 저장 IP 비교하기
이렇게 하여 저장된 IP 주소를 이용하여 사이트 이용 중 자신의 현재 IP 주소와 비교하는 과정을 거치게 된다.
실제 IP 주소의 값을 비교하는 코드는 다음과 같다.
----------------------------------------------------------------------------------------------------
<%
if Session("userid") <> "" then
' 접속한 사용자의 IP 주소 필드를 가져와 현재 IP 주소와 비교
strSQL = "select count(user_id) from member "
strSQL = strSQL & " where user_id='" & Session("userid") & "'"
strSQL = strSQL & " and ip = '" & Request.ServerVariables("REMOTE_ADDR") & "'"
Set Count_RS = dbCon.Execute(strSQL)
if Count_RS(0) = 0 then
' 중복 접속한 아이디 처리
' 사용자 사이트 환경에 맞게 에러 구문 처리
end if
end if
%>
----------------------------------------------------------------------------------------------------
위의 코드에서 보듯이 Count_RS(0)의 값이 0이면 처음 로그인을 하였을 때의 IP 주소와 현재 사용하고 있는 IP
의 주소가 다른 경우를 나타낸다. 이런 경우에는 앞서 살펴보았듯이 동일한 아이디로 접속하고 있는 경우이
기 때문에 해당 사용자에게 현재의 아이디가 중복 사용되고 있다는 메시지와 비밀번호 교환을 당부하는 메시
지를 출력하면서 현재 접속되어 있는 세션을 끊고 사이트의 처음으로 다시 이동하면 된다. 실제 이 부분의 코
드는 각 해당 사이트마다 환경이 다르므로 직접 넣어보기 바란다. 그리고 실제 동시접속을 방지하기 위해서
위의 코드를 하나의 파일로 만들어 모든 페이지에 인클루드를 시켜 사용하게 된다면 사이트 내에서 어떤 페이
지로 접속하더라도 중복 사용자 확인 과정을 거치게 되는 것이다. 각 사이트의 환경에 맞게 인클루드를 직접
넣어 테스트를 해 보자.
이렇게 하여 인터넷의 홈페이지에서 하나의 아이디를 가지고 중복으로 접속하는 것을 방지하는 방법에 대해
서 알아보았다. 예를 든 방법은 가장 기초적인 정보만 가지고 이용하기 때문에 부족한 부분이 많이 있을 수 있
다. 각 사이트의 관리자라면 IP 주소 이외의 기타 접속 시간이나 클라이언트의 환경을 저장하여 다양한 방법
으로 비교를 수행하는 방법들도 고려하여 모듈을 이용하면 더욱더 좋은 결과를 얻을 수 있을 것이다.
음..아시는 분들도 계시리라 생각합니다만.. 제가 웹 프로그램을 하다 보니깐.. 이부분의 필요성은 언제라도 있더라구요..리프래쉬 없이 디비값을 가져오는 방법... 참고로 제가 만든 사이트에서 쇼핑존의 슬라이더 쇼핑~~ 하기 클릭해 보시면.. 카테고리 불러올때 아래 방식을 사용했습니다.(http://www.misozine.com) 머~~ 광고라고 하면 할말없고요..
개발자 분들 참고 하세요.. 마우스 오른쪽 클릭은 막아놨는데.. 그래도 웹좀 하신분들은 소스 어케 보는지 알겁니다..허허..
이 소스는 자바스크립트로 개체들을 찾아 가는게 핵심입니다..
아무쪼록 개발자 분들 힘내세요.. 우리나라 현실이 노가다 현실이라서리...쩌업~~
첫번째 프레임 페이지 입니다.
<frameset rows="100%,*" cols="*" framespacing="0" frameborder="NO" border="0">
<frame src="SlideShow.asp?<%IF Trim(request.querystring) = "" Then Response.Write(request.Form) ELSE Response.Write(request.QueryString)%>" name="mainFrame" >
<frame src="about:blank" scrolling="NO" noresize name="hiddenFrame" >
</frameset>
SlideShow.asp라는 파일에서 임의의 이벤트가 발생하면 이 파일의 특정 콤보에 값을 채우는 방법입니다
이 방식을 사용하면 새로고침의 한계를 뛰어 넘을 수 있습니다.
parent.document.frames['hiddenFrame'].document.location='top.asp?mode=CSSpec&ProductCode=' + document.frmSlide.ProductCode.value; 이런 방식으로 숨겨진 프레임 top.asp파일을 호출합니다. 이런식으로 사이트에 hidden 프레임을 만들어 두면 그렇게 멀게만 느껴졌던 디비호출을 마음대로 할 수 있습니다
=>Top.asp만 잘 정의 하면 대부분의 요청을 asp리프레쉬 없이 처리 할 수 있습니다.
// 여기는 Top.asp에 해당하는 내용입니다
mode에 따라서
<script language="javascript>
var TargetDoc= parent.document.frames["mainFrame"].document;
var oOption;
IF Request("mode") = "CSSpec" THEN
Set adocmd = Server.CreateObject("ADODB.Command")
WITH adocmd
.ActiveConnection = DbConn
.CommandType = adCmdStoredProc
.CommandText = "IS_CSEnterOrderCounts"
.Parameters.Refresh
.Parameters.Item("@ProductCode").Value= Cint(Request("ProductCode"))
Set RS = .Execute
END WITH
%>
for( key in TargetDoc.frmSlide.CSSpec)
{
TargetDoc.frmSlide.CSSpec.remove(key);
}
<%
Do While Not RS.EOF
%>
oOption = TargetDoc.createElement('OPTION');
oOption.value="<%=Trim(RS("ColorCode")) %>;<%=Trim(RS("SizeCode")) %>";
oOption.text ="<%=Trim(RS("Name") )%>-<%=Trim(RS("Size"))%>";
TargetDoc.frmSlide.CSSpec.add(oOption);
<%
RS.MoveNext
Loop
RS.close()
END IF%>
</script>
이글은 트랙백의 기본개념보다는 windows + asp 환경에서의 기술적 구현을 위해 간단하게 작성된 소스입니다. 따라서 트랙백의 기본개념을 이해하신후 소스를 보시는것이 도움이 되실것입니다.또한 보다 확장적인 서비스를 위해서는 아래 소스외에 더 많은 부분을 추가하셔야 합니다.
1. 트랙백 핑 받기
<%
'콘텐츠 타입 '변수 확인 '내 블로그에 글이 있는지 확인 set rs = Server.CreateObject("ADODB.Recordset") .close set rs = nothing '정상적으로 완료되었으면 성공했다는 대답을 보내자.
|
첫번째로 트랙백은 규정적으로 4개의 변수값을 전송합니다. 글제목(title),글주소(url),글내용(exerpt),블로그명(blog_name) 입니다. 여기서 필수요소는 url 입니다. 위 소스에서는 블로그명을 포함시키지 않았습니다. 그리고 글번호는 해당 글의 존재유무를 확인하기 위해 트랙백 주소에서 GET 형태로 받아옵니다.
두번째로 인코딩되는 xml 중 <error> 부분이 가장 중요합니다. 즉, error 값으로 트랙백 핑을 보낸쪽에다 대답을 하는 것입니다.0이면 성공이고 1이면 실패입니다. 그리고 <message>부분은 말그대로 추가설명입니다. 그리고 트랙백 핑은 POST 형태로 값을 받습니다. 받아오는 변수들을 Request.Form 형태로 정의해주는것이 더 좋을듯 하네요.
세번째로 위 소스에서는 간단한 xml 이라 굳이 xmlhttp 같은 xml 관련 서버 컴포넌트를 사용하지 않았습니다.
2. 트랙백 핑 보내기
<%
if b_tb <> "" then '만약 트랙백 주소가 입력되었다면 ..
Str_tb="title="&x_Title&"&url="&x_Posturl&"&excerpt="&x_Excerpt&"&blog_name="&x_BlogName ' 트랙백 핑을 보내자
end if
|
일반적으로 글의 저장 또는 편집시 사용하실수 있습니다. 그리고 Str_tb 변수 정의 하면서 POST 로 넘기는 변수명은 변경하시면 안됩니다. 또한 위 소스에서는 xmlhttp 컴포넌트를 이용하여 POST 형태로 핑을 전송합니다. 트랙백 핑의 성공여부는 받아온 xml 을 디코딩 하셔도 되지만 그냥 <error>부분만 체크하기 위해 instr 로 처리하였습니다. 추가적으로 <message> 부분도 체크하여 성공 또는 실패시의 메시지를 받아오실수도 있습니다. 간혹 핑 전송시 한글이 깨어진다는 질문이 있는데, 이 경우 UrlEncoding 을 시키지 않으셨을때가 가장많습니다. 그외에는 위와 같은 방법으로 무난하게 성공하실것 입니다.
보통은 aaa = Request("aaa")
이런식으로 코딩을 하게하죠,
갯수가 한두개이면 큰 무리 없는데.
한번에..100개정도 넘어온다고 치면,, 대략 낭패죠,,
코딩이 지겨울텐데..
요걸 한번 써보세요..
첫줄에 요렇게 코딩하시고,
뒤에 Response.End 로 끝내시고,
실행시켜보시면,
전화면에서 넘어오는것들의 변수 이름과 해당하는 값들을 찍어 줍니다.
그냥 마우스로 죽~ 긁어다가,, 붙이면 코딩이 한결 편해지죠..
---------------------------------------------------------------
'이건 포스트로 넘어오는값을 찍어주는거
For Each objItem In Request.Form
makestr = objItem & " = "
makestr = makestr & "Request(" & chr(34) & objItem & chr(34) & ")"
Response.Write makestr & " ': " & Request.Form(objItem) & "<br>"
Next
--------------------------------------------------------------
--------------------------------------------------------------
'이것은 Get 방식으로 넘어오는 값을 찍어주는거.
For Each objItem In Request.querystring
makestr = objItem & " = "
makestr = makestr & "Request(" & chr(34) & objItem & chr(34) & ")"
Response.Write makestr & " ': " & Request.Form(objItem) & "<br>"
Next
-------------------------------------------------------------
제일 윗줄에 이걸들을 쓰시던지
아니면,, FUNCTION 을 만들어서 호출하시던지 하세요.
^^
uploadfile.asp
<script language="JavaScript">
function checkit() {
if (document.excelupform.excelfile.value == "") {
alert("파일을 선택해 주십시요 !");
// document.excelupform.excelfile.focus();
self.location.class='MIME' href="uploadfile.asp"
// return false;
} else {
excelupform.action="fileuploading.asp";
excelupform.submit();
}
}
function filecheck(){
if(document.excelupform.excelfile.value.length < 1) {
alert("파일을 선택해 주십시요. ^^");
document.excelupform.excelfile.focus();
return false;
} else{
checkit();
}
}
//-->
</script>
<FORM OnKeyPress="javascript:filecheck();" name="excelupform" method="post" encType="multipart/form-data" >
<TABLE border=0 cellPadding=0 cellSpacing=0 width="600" align="center">
<tr><TD height="40" align="center"><INPUT name="excelfile" type="file"></TD></TR>
<TR>
<TD height="40" align="center"><a class='MIME' href="javascript:checkit()"><img src="../../images/bt_send.gif" border="0"></a></TD>
</TR></TABLE></FORM>
fileuploading.asp
<%@ Language=VBScript %>
<!-- #include file = "../../lib/dbopen.inc" -->
<!-- #include file="../../lib/certification.inc" -->
<%
on error resume next
set uploadform = Server.CreateObject("SiteGalaxyUpload.Form")
Set filesystemobj = Server.CreateObject("Scripting.FileSystemObject")
attach_file = UploadForm("excelfile").FilePath
upfilename = Mid(attach_file, InstrRev(attach_file, "") + 1) ' 파일명을 얻는다.
strName = Mid(upfilename, 1, Instr(upfilename, ".") - 1) ' 확장자를 제외한 파일명을 얻는다.
strExt = Mid(upfilename, Instr(upfilename, ".") + 1) '확장자를 얻는다.
' 엑셀파일을 체크 한다.
if(strExt="xls") then %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<%
' 랜덤 숫자를 통해서 구분을 한다.
Randomize
myvalues = Int((100000000000 * Rnd) + 1) ' 1에서 100000000000까지 중에서 무작위 값을 발생합니다.
''''''''''''''각 아이디당 폴더를 생성한다.'''''''''''''''''''''''''''
folder_ex = "c:temp"& CcID
If (filesystemobj.FolderExists(folder_ex)) Then
' response.Write("id folder exist")
Else
filesystemobj.CreateFolder(folder_ex)
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
onlyTrue = True ' 우선 같은이름의 파일이 존재한다고 가정
countFileName = 0 ' 파일이 존재할 경우, 이름 뒤에 붙일 숫자를 세팅함.
''''''''''''''''각 폴더에 파일을 저장한다.''''''''''''''''''''''''''''
saveDate = Date
fn = "c:temp"&CcID&""&strName&saveDate&".xls" ' 저장할 파일의 완전한 이름을 만듦
file2dbname= strName&saveDate&".xls"
response.Write(file2dbname)
uploadform("excelfile").SaveAs(fn)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''엑셀파일 보기 ''''''''''''''''''''''''
xlsFile = fn
Set objApp = CreateObject("Excel.Application") '엑셀 객체 생성
Set objWorkbooks = objApp.Workbooks 'WorkBooks 객체 생성
Set objWorkbook = objWorkbooks.Open(xlsFile) 'Excel 파일 Open
Set objWorksheet = objWorkbook.Worksheets(1) 'Worksheet 객체 생성
Set objRange = objWorksheet.UsedRange '사용된 영역 객체 생성
aData= objRange.value '사용된 영역의 값들을 2차원배열 aData로 넘김
%>
<table cellpadding="0" cellspacing="0" border="1" width="540" align="center">
<tr><td width="60" align="center">Number</td><Td width="120" align="center">고유한 키값</Td>
<Td width="120" align="center">이 름</Td><Td width="140" align="center">전화번호</Td><td width="80">날 짜</td></tr>
<% For i=1 to uBound(aData, 1) ' 배열의 끝까지 행루프 %>
<tr><td align="center"><%=i%></td>
<td align="center"><%=myvalues%></td>
<% For j=1 to uBound(aData, 2) ' 배열의 끝까지 열루프 %>
<%if j=1 then%>
<td align="center">
<%=aData(i,1)%>
<% 'Dim member()
'member = aData(i, 1)%>
</td>
<% end if%>
<%if j=2 then%>
<td align="center">
<%=aData(i,2)%>
<% 'Dim phoneNum()
'phoneNum = aData(i, 2)%>
</td>
<% end if%>
<% Next ' 배열의 끝까지 열 루프 끝 %>
<td><%=saveDate%></td>
</tr>
<% Next ' 배열의 끝까지 행 루프 끝 %>
</table>
<%
' seedkey 및 업로드 날짜를 디비에 저장한다.
for i=1 to uBound(aData, 1)
sql = "INSERT INTO excel2db(SEEDKEY,NAME,PHONE_NUMBER,UPLOAD_DATE,MESSAGE) VALUES "
sql = sql & "('"&myvalues&"','"&aData(i,1)&"','"&aData(i,2)&"','"&saveDate&"','')"
dbs.Execute(sql)
next
%>
<%
Set objRange = Nothing
Set objWorksheet = Nothing
objWorkbook.Close
Set objWorkbook = Nothing
Set objWorkbokks = Nothing
Set objApp = Nothing
'''''''''''''''''''''''''엑셀파일 보기 끝 ''''''''''''''''''''''''''''''' %>
<% else %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
<!--
alert("엑셀 파일만 업로드 가능합니다.")
self.location.class='MIME' href="uploadfile.asp"
//-->")
</script>")
<% end if
set fs = Nothing
set real_fn = Nothing
set uploadform = Nothing
%>
</head>
<body></body>
</html>
하지만 CDONTS를 사용하기 전에 우선 그것이 무엇인지를 알아야만 한다. 어떤 Microsoft 문서 자료에서는 Collaboration Data Object를 다음과 같이 설명한다.
“CDONTS는 웹 기반의 어플리케이션에 메시징 기능을 제공하기 위해 특별히 디자인된 Simple Mail Transfer Protocol(SMTP)를 위한 특별한 OLE 서버이다.”
마이크로소프트에 익숙하지 않은 사람은, CDONTS가 웹 페이지와 SMTP 서버 사이의 중개인 역할을 수행하는 것으로서 (이 폼과 같은) 웹에서 이메일을 통해 누군가에게 데이터를 전송하는 통신을 가능하게 하는 것으로 이해하면 된다.
CDONTS는 아주 강력하며 기능도 많지만 여기서는 간단히 다루고, 이 페이지의 끝부분에 CDONTS에 대한 다른 강좌 몇 개의 링크를 제공할 것이다. 무엇보다도 먼저 CDONTS와 같은 서버 객체를 사용할 때마다 그것의 인스탄스를 실행시킬(또는 보다 간단하게 말해서 그것을 사용할 수 있게 만들) 필요가 있다. 지금까지 만든 폼 핸들링 코드에 몇 줄을 추가하면 그렇게 만들 수 있다. CDONTS를 위한 코드는 다음 예에서 모두 라인 단위로 설명하도록 하겠다.
<% if Request.Querystring("isSubmitted") = "yes" then Dim fname, lname Dim objCDO fname = Request.Querystring("First_Name") lname = Request.Querystring("Last_Name") "Here is where we insert new code to invoke CDONTS "This line invokes the object using the name objCDO Set objCDO = Server.CreateObject("CDONTS.NewMail") objCDO.From = "corinth@enfused.com" "That"s me :) objCDO.To = "youremail@domain.com" objCDO.Cc = "someoneimportant@whitehouse.gov, buycheese@cheese.com" objCDO.Bcc = "bgates@microsoft.NET" objCDO.Subject = "Submitted form data from my page" objCDO.Body = "Name: " & fname & " " & lname objCDO.BodyFormat = 1 objCDO.MailFormat = 1 objCDO.Send "Notice that response.write changed to ConfirmMsg = "I will explain why in just a little while. ConfirmMsg = "Thanks for submitting your name!" end if %> |
이제 한 줄씩 살펴보기만 하면 무엇이 일어나는지 정확하게 알 수 있을 것이다. 불러낸 객체의 메쏘드 또는 프로퍼티를 참조하려 할 때마다 지정한 이름을 사용해야 한다는 것을 기억해두자(이 예에서는 아래에서 보여주는 것처럼 마침표가 뒤에 붙는 objCDO임). (주의: 이 값들이 모두 Send 명령 앞에만 있다면 순서는 상관없다)
먼저 From은 이메일을 보내는 사용자의 이메일 주소로서, 문자열이다. 일단은 이것을 이메일 주소로 지정하자. 일반적으로 사용자에게 이 필드를 채우게 하는 것이 좋을 것이다. 그것을 어떻게 제공하는지는 이 글의 끝에서 보여주겠다. 하지만 이제까지 다루었던 것을 잘 이해하고 있나 확인하는 차원에서 먼저 스스로 해보기를 권장한다.
objCDO.From = "corinth@enfused.com" "That"s me :) |
팁: 필자에게 스팸 메일을 보내지 마라. 스팸 외 모든 합법적인 이메일 ? 질문, 코멘트 또는 비판은 환영한다. 그러나 필자는 바쁜 사람이며 즉각 회신할 수는 없다는 것을 기억해 주기 바란다.
To는 의도한 수신자의 이메일 주소이다. 이 필드를 제작자 자신(바로 독자)의 이메일 주소(들)로 작성해라. 다중 이메일인 경우에는 콤마로 구분한다(사실 다른 필드에서도 마찬가지이다). 이 필드들은 모두 문자열 값들을 가져야 하므로 인용 기호를 빠뜨려서는 안된다.
objCDO.To = "youremail@domain.com" |
CC, BCC는 전달하고 싶은 임의의 참조인(Carbon Copies 또는 Blind Carbon Copies)의 이메일 주소들이다.
objCDO.Cc = "someoneimportant@whitehouse.gov, buycheese@cheese.com" objCDO.Bcc = "bgates@microsoft.NET" |
Subject는 이메일의 주제로 보이게 지정한 임의의 문자열이다.
objCDO.Subject = "Submitted form data from my page" |
Body는 메시지의 본문 또는 주요 컨텐츠이다. 이메일로 전송될 수 있기만 하다면 원하는 무엇이든 문자열 포맷으로 여기에 쓸 수 있다. 바로 여기에 변수를 위치시키고 전송할 것이다.
objCDO.Body = "Name: " & fname & " " & lname |
팁: 위의 코드는 ASP와 CDONTS의 중요하면서도 강력한 기본 원소를 예로 보여주는데, 디자이너는 고정된 문자열을 사용하는 대신에 이러한 CDONTS 속성에 대한 변수에 지정할 수 있다. 이 기능을 이용하면 디자이너의 역량이 확장되므로 창조적으로 작업할 수 있다. 문자열 변수를 이용하여 생활을 보다 편리하게 만들어보기 바란다. 아마도 주제 폼 필드도 만들 수 있을 것이므로 사용자에게 자신의 주제를 제출하게 할 수도 있다.
다음 두 프로퍼티는 전송될 이메일의 타입이 HTML인지 아니면 단순한 텍스트인지를 결정한다. 여기에서는 편의상 메시지를 단순한 텍스트로 보낼 것이다. HTML로 전송하고 싶으면 이 변수들을 0으로 변경하고 Body 문자열을 HTML 코드로 작성하면 된다.
objCDO.BodyFormat = 1 objCDO.MailFormat = 1 |
마지막으로 코드의 끝부분은 실제로 서버에게 메시지를 전송하라고 알린다.
objCDO.Send |
Response.Write 대신 ConfirmMsg = 를 사용한 조그마한 트릭이 있는데, 그것은 확인 메시지를 좀 더 좋게 포맷하기 위해 사용되었다. ConfirmMsg 변수를 이용하여 무엇을 할 것인지는 전체 페이지에 대한 마지막 손질을 할 때 보여줄 것이다.
여기까지가 이 페이지에서 다루려 했던 CDONTS에 대한 모든 것이다. 코딩 과정을 돕기 위해 간편한 CDONTS 참고 테이블을 만들었으니 참고하기 바란다.
CDONTS 링크
ASP Today: CDONTS 세팅 및 사용하기
15 Seconds: CDO를 이용하여 HTML 전송하기
15 Seconds: Collaboration Data Object와 IIS 4.0
Power ASP: CDONTS 컴포넌트 사용하기… (attachments 포함)
ASP Watch: CDONTS를 이용하여 이메일 보내기
Microsoft CDONTS 문서 자료
<%@ LANGUAGE="VBSCRIPT"%>
<%
strIP = Request.ServerVariables("REMOTE_ADDR")
strMac = GetMACAddress(strIP)
strHost = Request.ServerVariables("REMOTE_HOST")
function GetMACAddress(strIP)
Set net = Server.CreateObject("wscript.network")
Set sh = Server.CreateObject("wscript.shell")
sh.run "%comspec% /c nbtstat -A " & strIP & " > c:" & strIP & ".txt",0,true
Set sh = nothing
Set fso = createobject("scripting.filesystemobject")
Set ts = fso.opentextfile("c:" & strIP & ".txt")
macaddress = null
Do While Not ts.AtEndOfStream
data = ucase(trim(ts.readline))
if instr(data,"MAC ADDRESS") Then
macaddress = trim(split(data,"=")(1))
Exit Do
End if
loop
ts.close
Set ts = nothing
fso.deletefile "c:" & strIP & ".txt"
Set fso = nothing
GetMACAddress = macaddress
End function
%>
<body>
<%Response.Write("Your IP is : " & strIP & "" & vbcrlf)%>
<%Response.Write("Your MAC is : " & strMac & vbcrlf)%>
</body>
'==================================================================================
'== 설명 : 폴더 존재 여부를 체크하여 폴더 만들기
'== 이름 : ChkDirecoty(dir, gubun, dir_status)
'== 변수 : dir(경로명), gubun(폴더구분자),dir_status(가상경로:v, 물리적경로:p)
'== 반환 : String
'===================================================================
Sub ChkDirectory(dir,gubun, dir_status)
Dim objFile, objStream
Dim i,tmp
Set objFile = Server.CreateObject("Scripting.FileSystemObject")
for i = 0 to ubound(split(dir,gubun))-1
tmp = tmp&split(dir,gubun)(i)&gubun
If dir_status = "v" then
IF not(objFile.folderexists(Server.MapPath(tmp))) then
objFile.createfolder(Server.MapPath(tmp))
End If
Elseif dir_status = "p" then
IF not(objFile.folderexists(tmp)) then
objFile.createfolder(tmp)
End If
End If
next
Set objFile = Nothing
End Sub
'===================================================================
'== 설명 : 화일 지우기
'== 이름 : DeleteTxtFile(FileName, path_status)
'== 변수 : FileName : 전체 화일명, status : 파일경로 형태(v:가상경로,r:물리적경로)
'== 반환 : String
'===================================================================
Sub DeleteTxtFile(FileName, path_status)
Dim objFile, objStream, Err
' On Error Resume Next
Set objFile = Server.CreateObject("Scripting.FileSystemObject")
If path_status = "v" then
objFile.DeleteFile Server.MapPath(FileName)
Else
objFile.DeleteFile FileName
End If
Set objFile = Nothing
' Err.Clear
End Sub
'===================================================================
'== 설명 : 고유한 파일이름으로 변환
'== 이름 : GetUniqueName
'== 변수 : String
'== 반환 : String
'===================================================================
Function GetUniqueName(byRef strFileName, DirectoryPath)
Dim strName, strExt
strName = Mid(strFileName, 1, InstrRev(strFileName, ".") - 1) ' 확장자를 제외한 파일명을 얻는다.
strExt = Mid(strFileName, InstrRev(strFileName, ".") + 1) '확장자를 얻는다
Dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Dim bExist : bExist = True
'우선 같은이름의 파일이 존재한다고 가정
Dim strFileWholePath : strFileWholePath = DirectoryPath & "" & strName & "." & strExt
'저장할 파일의 완전한 이름(완전한 물리적인 경로) 구성
Dim countFileName : countFileName = 0
'파일이 존재할 경우, 이름 뒤에 붙일 숫자를 세팅함.
Do While bExist ' 우선 있다고 생각함.
If (fso.FileExists(strFileWholePath)) Then ' 같은 이름의 파일이 있을 때
countFileName = countFileName + 1 '파일명에 숫자를 붙인 새로운 파일 이름 생성
strFileName = strName & "-" & countFileName & "." & strExt
strFileWholePath = DirectoryPath & "" & strFileName
Else
bExist = False
End If
Loop
GetUniqueName = strFileWholePath
End Function
'===================================================================
'== 설명 : 클라이언트에서 업로드된 파일명 리턴
'== 이름 : ChkFileName
'== 변수 : String
'== 반환 : String
'===================================================================
Function ChkFileName(name)
Dim tmpName, tmpExt, arrTmpName, tmpFileName
tmpName = Mid(name, 1, InstrRev(name, ".") - 1)
tmpExt = Mid(name, InstrRev(name, ".") + 1)
arrTmpName = split(tmpName,"")
tmpName = arrTmpName(Ubound(arrTmpName))
tmpFileName = tmpName&"."&tmpExt
ChkFileName = tmpFileName
End Function
'==================================================================================
'== 설명 : 화일 존재 여부를 체크하여 리턴
'== 이름 : ChkDirecoty(dir_status, filePath)
'== 변수 : dir_status(가상경로:v, 물리적경로:p), filePath(디렉토리포함)
'== 반환 : 존재(true), 없음(false)
'===================================================================
Function ChkFileExist(dir_status, filePath)
Dim objFile, tmpFile
Set objFile = Server.CreateObject("Scripting.FileSystemObject")
IF dir_status="v" then
tmpFile = Server.MapPath(filePath)
Else
tmpFile = filePath
End IF
If objFile.FileExists(tmpFile) then
chkFileExist=true
else
chkFileExist=false
End If
Set objFile = Nothing
End Function
%>
'== 설명 : 문장을 해당 자릿수만큼 <br>이 들어간 문장으로 변환
'== 이름 : MakeBr(Str,Pos)
'== 변수 : Str(String),Pos(Int)
'== 반환 : String
'===================================================================
Function MakeBr(Str,Pos)
Dim StrLen, TmpStr, i, Midcnt, Start, Surplus
StrLen = len(Str)
If (StrLen Mod Pos) = 0 then
MidCnt = Fix(StrLen/Pos)
Else
MidCnt = Fix(StrLen/Pos) + 1
End If
for i = 1 to MidCnt
if i = 1 then
TmpStr = TmpStr&Mid(Str,i,pos)&"<br>"
Else
TmpStr = TmpStr&Mid(Str,((i-1)*Pos)+1,pos)&"<br>"
End If
next
MakeBr = TmpStr
End Function
' ##################################################################################
' 검색에서 selected
' ##################################################################################
Function getSelected(search,t)
if search = t then
getSelected ="selected"
end if
End function
' ##################################################################################
' checked
' ##################################################################################
Function getChecked(tag,y)
If tag = y then
getChecked = "checked"
End if
End function
' ##################################################################################
' 자동링크
' ##################################################################################
FUNCTION autolink(CONTENT)
DIm Re
Set re = New RegExp
' First Pass for http
re.Pattern = "(w+)://([^/:]+)(:d*b)?([^# n<]*).*n"
re.Pattern = "http://([0-9a-zA-Z./@:~?&=_-]+)"
re.Global = True
re.IgnoreCase = True
' ASP seems to be not supporting .MultiLine method.
're.MultiLine = True
CONTENT = re.Replace(CONTENT,"<a target=_blank href='http://$1'>http://$1</a>")
' Second Pass for mail
re.Pattern = "([_0-9a-zA-Z-]+(.[_0-9a-zA-Z-]+)*)@([0-9a-zA-Z-]+(.[0-9a-zA-Z-]+)*)"
autolink = re.Replace(CONTENT,"<a href='mailto:$1@$3'>$1@$3</a>")
END FUNCTION
' ##################################################################################
' 문자열 체크 (리턴값:boolean)
' ##################################################################################
Function chkStrFlag(Val, chkStr)
Dim flag, MyPos
If Val = "" then
flag = false
Else
Mypos =Instr(Val,chkStr)
If MyPos = 0 then
flag=false
Else
flag=true
End If
End If
chkStrFlag = flag
End Function
'##################################################################################
' 문자열 체크 (공백이나 NULL값 체크)
' Val : 체크 값, r_Val (대체값)
'##################################################################################
Function replaceVal(val, r_Val)
Dim flag, MyPos
If (val = "") or IsNull(Val) then
replaceVal = r_Val
Else
replaceVal = val
End If
End Function
'##################################################################################
' 숫자값 자릿수만큼 문자로 변경 (공백이나 NULL값 체크)
' Val : 체크 값, chkLen 자릿수 , r_Val(대체값)
'##################################################################################
Function chkLenReplaceVal(val,chkLen, r_Val)
Dim chkCnt, MyPos
chkCnt = len(Cstr(val))
If chkCnt < chkLen then
chkLenReplaceVal = val
for i = 1 to (chkLen-chkCnt)
chkLenReplaceVal = r_Val&chkLenReplaceVal
next
Else
chkLenReplaceVal = val
End If
End Function
'##################################################################################
' 널값,""값 확인
' Val : 체크 값
' retun 값 : true, false
'##################################################################################
Function chkBlank(val)
If (val = "") or IsNull(Val) then
chkBlank = true
Else
chkBlank = false
End If
End Function
'##################################################################################
' 비교값 리턴
' Val : 체크 값
' retun 값 : true, false 또는 대치 문장
'##################################################################################
Function replaceStr(str, chkStr, replaceStr1, replaceStr2)
If str = chkStr then
replaceStr = replaceStr1
Else
replaceStr = replaceStr2
End If
End Function
'##################################################################################
' NULL값 만들기
' Val : 값
' retun 값 : NULL, 문장
'##################################################################################
Function makeNull(str)
If str="" or IsNull(str) then
makeNull = "NULL"
Else
makeNull = str
End IF
End Function
'##################################################################################
' HTML 태그 지우기 (정규식표현)
' 인자 : strHTML:문장, patrn : 패턴 문장
' retun 값 : String
'##################################################################################
Function stripHTML(strHTML, patrn)
Dim objRegExp, strOutput
Set objRegExp = New Regexp
objRegExp.IgnoreCase = True
objRegExp.Global = True
objRegExp.Pattern = patrn
'objRegExp.Pattern = "<.+?>" '''' 태그완전히없앰
strOutput = objRegExp.Replace(strHTML, "")
stripHTML = strOutput
Set objRegExp = Nothing
End Function
'##################################################################################
' 문자 잘라내기
'##################################################################################
Function CutString(Str,Length,Patten)
If Len(Str) > Length Then
CutString = Left(Str,Length-3) & patten
Else
CutString = Str
End If
End Function
별건 아니구요..그냥 가끔 디버깅시에 쓰는 함수에요
####################################################
Sub DbPrintErrMsg(obj)
Dim errLoop
For Each errLoop In obj.Errors
response.write "#############<br>"
response.write "Error Number: " & errLoop.Number & "<br>"
response.write "Description: " & errLoop.Description & "<br>"
response.write "Source: " & errLoop.Source & "<br>"
response.write "SQL State: " & errLoop.SQLState & "<br>"
response.write "Native Error: " & errLoop.NativeError & "<br>"
response.write "#############<br>"
Next
End Sub
########폼값 확인할때###################
Sub Prt_RequestForm(obj)
Dim item
For Each item In obj
response.write "#############<br>"
response.write item&" : " &obj(item)& "<br>"
response.write "#############<br>"
Next
End Sub
ex) Prt_RequestForm(Request.Form), Prt_RequestForm(Request.QueryString),
Prt_RequestForm(UploadForm)
'함수명 : getWeekDayNum(chkDate)
'인자 : chkDate - 문자열
'기능 : 날짜를 받아 날짜의 정수값 표현리턴
'+++++++++++++++++++++++++++++++++++++++
Function getWeekDayNum (chkDate)
Dim chkVal
chkVal = WeekDay(chkDate)
getWeekDayNum = chkVal
End Function
'+++++++++++++++++++++++++++++++++++++++
'함수명 : getDayName(chkDate)
'인자 : chkDate - 문자열
'기능 : 날짜를 받아 요일명 리턴
'+++++++++++++++++++++++++++++++++++++++
Function getDayName (chkDate)
Dim chkVal, strDayName
chkVal = WeekDay(chkDate)
strDayName = WeekDayName(chkVal)
getDayName = strDayName
End Function
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'함수명 : getMonthFirstSunday(chkDate)
'인자 : chkDate - 문자열("YYYY-MM-DD")
'기능 : 날짜를 받아 그 달의 첫번째 일요일 날짜 리턴
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function getMonthFirstSunday(chkDate)
Dim chkVal, thisMonthStart
thisMonthStart = DateSerial(Year(chkDate), Month(chkDate),1)
chkVal = WeekDay(thisMonthStart)
If chkVal = 1 then
getMonthFirstSunday = thisMonthStart
Else
getMonthFirstSunday = DateAdd("d",7-(chkVal-1) , thisMonthStart)
End If
End Function
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'함수명 : getMonthLastSunday(chkDate)
'인자 : chkDate - 문자열
'기능 : 날짜를 받아 그 달의 마지막 일요일 날짜 리턴
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function getMonthLastSunday(chkDate)
Dim chkVal, nextMonthStart
nextMonthStart = DateSerial(Year(chkDate), Month(chkDate)+1,1)
chkVal = WeekDay(nextMonthStart)
If chkVal = "1" then
getMonthLastSunday = DateAdd("ww",-1, nextMonthStart)
Else
getMonthLastSunday = DateAdd("d",-(chkVal-1) , nextMonthStart)
End If
End Function
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'함수명 : getWeekSunDay(chkDate)
'인자 : chkDate - 문자열
'기능 : 날짜를 받아 날짜의 주차의 해당 일요일을 리턴
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function getWeekSunDay(chkDate)
Dim chkVal, firstSunDay
firstSunday = getMonthFirstSunDay(chkDate)
diff = DateDiff("ww",firstSunday, chkDate)
If diff = 0 then
getWeekSunDay = firstSunday
Else
getWeekSunDay = DateAdd("ww",diff,firstSunday)
End If
End Function
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'함수명 : getWeekSunDayCnt(chkDate)
'인자 : chkDate - 문자열
'기능 : 날짜를 받아 날짜의 주차의 해당 일요일의 그 달의 카운터를 리턴
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function getWeekSunDayCnt(chkDate)
Dim chkVal, firstSunDay
firstSunday = getMonthFirstSunDay(chkDate)
diff = DateDiff("ww",firstSunday, chkDate)
If diff = 0 then
getWeekSunDayCnt = 1
Else
getWeekSunDayCnt = diff+1
End If
End Function
'+++++++++++++++++++++++++++++++++++++++
'서브명 : subDayInfo(chkDate)
'인자 : chkDate - 문자열
'기능 : 날짜를 받아 요일명, 요일 번호, 그 달의 첫번째 일요일, 마지막 일요일 값 리턴
'+++++++++++++++++++++++++++++++++++++++
Sub subDayInfo(chkDate)
dayName = getDayName(chkDate)
dayVbVal = getWeekDayNum(chkDate)
firstSunday = getMonthFirstSunday(chkDate)
lastSunday = getMonthLastSunday(chkDate)
response.write chkDate &"관련 정보<br>"
response.write "요일 : "& dayName&"<br>"
response.write "정수값 : "& dayVbVal&"<br>"
response.write "그 달의 첫번째 일요일 : "& firstSunDay&"<br>"
response.write "그 달의 마지막 일요일 : "& lastSunDay&"<br>"
End Sub
chkDate = "2003-07-22"
Call subDayInfo(chkDate)
response.write getWeekSunDay(chkDate)&":"
response.write getWeekSunDayCnt(chkDate)
%>
<%
strIP = Request.ServerVariables("REMOTE_ADDR")
strMac = GetMACAddress(strIP)
strHost = Request.ServerVariables("REMOTE_HOST")
function GetMACAddress(strIP)
Set net = Server.CreateObject("wscript.network")
Set sh = Server.CreateObject("wscript.shell")
sh.run "%comspec% /c nbtstat -A " & strIP & " > c:" & strIP & ".txt",0,true
Set sh = nothing
Set fso = createobject("scripting.filesystemobject")
Set ts = fso.opentextfile("c:" & strIP & ".txt")
macaddress = null
Do While Not ts.AtEndOfStream
data = ucase(trim(ts.readline))
if instr(data,"MAC ADDRESS") Then
macaddress = trim(split(data,"=")(1))
Exit Do
End if
loop
ts.close
Set ts = nothing
fso.deletefile "c:" & strIP & ".txt"
Set fso = nothing
GetMACAddress = macaddress
End function
%>
<body>
<%Response.Write("Your IP is : " & strIP & "
" & vbcrlf)%>
<%Response.Write("Your MAC is : " & strMac & vbcrlf)%>
</body>
ASP 암호화 하기
function form_submit() {
var letters = 'ghijklabvwxyzABCDEFef)_+|<>?:mnQRSTU~!@#$%^VWXYZ`1234567opGHIJKLu./;'+"'"+'[]MNOP890-='+'\\'+'&*("{},cdqrst'+"\n";
var split = letters.split("");
var num = '';
var encrypted = '';
<%
if f_jumin = 1 then
%>
encrypted = '';
var it = document.ps_user.jumin2.value;
var c = '';
var b = '0';
var chars = it.split("");
while(b<it.length)
{c = '0';while(c<letters.length)
{if(split[c] == chars[b])
{if(c == "0") { c = ""; }
if(eval(c+10) >= letters.length){
num = eval(10-(letters.length-c));
encrypted += split[num];}
else{num = eval(c+10);encrypted += split[num];}
}
c++;}
b++;}
document.ps_user.jumin2.value = encrypted;encrypted = '';
<%
end if
%>
encrypted = '';
var c1 = '';
var it1 = document.ps_user.pin.value;
var b1 = '0';
var chars1 = it1.split("");
while(b1<it1.length){c1 = '0';
while(c1<letters.length){if(split[c1] == chars1[b1]){if(c1 == "0") { c1 = ""; }if(eval(c1+10) >= letters.length){num = eval(10-(letters.length-c1));
encrypted += split[num];}else{num = eval(c1+10);encrypted += split[num];}}c1++;}b1++;}document.ps_user.pin.value = encrypted;encrypted = '';
document.ps_user.submit();
}
-------------------------------------------------------------------------------------------------------------------------
var encrypted = '';
var it = document.ps.pin.value;
var b = '0';var chars = it.split("");
while(b<it.length) {
c = '0';
while(c<letters.length)
{if(split[c] == chars[b])
{if(c == "0") { c = ""; }
if(eval(c+10) >= letters.length)
{num = eval(10-(letters.length-c));
encrypted += split[num];}else{num = eval(c+10);
encrypted += split[num];}
}
c++;
}
b++;
}document.ps.pin.value = encrypted;encrypted = '';
---------------------------------------------------------------------------------------------------------------------
역변환
<script>
function decode_letters(it){
var letters = 'ghijklabvwxyzABCDEFef)_+|<>?:mnQRSTU~!@#$%^VWXYZ`1234567opGHIJKLu./;'+"'"+'[]MNOP890-='+'\\'+'&*("{},cdqrst'+"\n";
var split = letters.split("");
var num = '';
var c = '';
var decrypted = '';
var b = '0';
var chars = it.split("");
while(b<it.length){
c = '0';
while(c<letters.length){
if(split[c] == chars[b]){
if(c == "0") { c = ""; }
if(eval(c-10) < 0){
num = eval(letters.length+(c-10));
decrypted += split[num];
}else{
num = eval(c-10);
decrypted += split[num];
}
}
c++;
}
b++;
}
alert(decrypted);
return decrypted;
}
</script>
exec sp_changeobjectowner '기존소유자이름.테이블명', 'dbo'