개요
HTML 태그에 설정하는 값과 DB에 저장하는 값이 일치 하지 않을 때는
짝을 이루는 함수를 만들어 사용하면 수월 합니다.
내용
보통 input type="text" 이 넘은 DB text 타입 컬럼에 그대로 저장 해주면 됩니다.
그런데 <input type="checkbox" name="isSMS" checked /> 이건 어떻습니까?
체크박스의 값을 저장하기 위해 DB에 어떤 컬럼을 만드시나요?
보통은 bit 또는 char(1) 로 만드실 껍니다. 어떤 DB는 true, false도 되었던거 같은데....
여튼 여기서는 bit 또는 char(1) 타입의 컬럼에 저장한다고 칩시다.
HTML을 SUBMIT() 하여 저 체크박스의 값을 뽑아 보면,
isSMS = Request.Form("isSMS") 으로 뽑겠죠?
checked 일때는 "on" 이라고 설정 됩니다.
그럼 "on" 을 그대로 DB에 저장 할 수 없으니,
"on" 일 때는 "1"로 바꿔주고, 아닐 때는 "0"으로 바꿔준 다음 DB에 저장하면 됩니다.
여기까지는 저장하는 방법이구요, 이제는 불러올때를 살펴봅시다.
DB에 "1" 또는 "0" 이라고 저장했으니, select 하여,
isSMS= rs("isSMS") 이렇게 뽑아 보면,
"1" 또는 "0"이라고 나올 껍니다.
그럼 "1"을 태그에 그대로 먹일 순 없으니,
"1"은 "checked"로 바꿔주고, "0"이면 ""(빈칸)으로 바꿔주고 나서 먹이면 됩니다.
이 내용을 실제 코딩으로 하면, 매번 If .. Else .. End If 문장을 수도 없이 써야 합니다.
이런 경험한적 있으실 껍니다. 아마 수백 수천번씩은 경험하는 내용이 아닌가 싶습니다.
짝 함수
전 아래와 같이 짝을 이루는 함수를 만들어 사용합니다.
'tagValue를 DB에 저장 가능한 형태로 변환한다.
'tagValue는 사실 Request.Form("isSMS") 으로 뽑은 값이다.
Function toDBValue_checkbox(tagValue)
If tagValue = "on" then
toDBValue_checkbox = "1"
Else
toDBValue_checkbox = "0"
End If
End Function
'dbValue를 태그에 적용 가능한 형태로 변환한다.
Function toTagValue_checkbox(dbValue)
If dbValue = "1" Then
toTagValue_checkbox = "checked"
Else
toTagValue_checkbox = ""
End If
End Function
사용법
Tag에서 값을 받아, DB에 저장하려 할 때
isSMS= Request.Form("isSMS")
isSMS= toDBValue_checkbox(isSMS) '"1" 또는 "0"
DB에서 불러와, Tag에 값을 적용할 때
isSMS= rs("isSMS")
isSMS= toTagValue_checkbox(isSMS) '"checked" 또는 ""(빈칸)
<input type="checkbox" name="isSMS" <%=isSMS%>>
참고
3항 연산자가 지원되는 언어에서는 쌍 함수 만드는 것 보다
3항 연산자를 사용하는 것이 더욱 유리할 지도 모릅니다.
코딩 속도 때문인데요. ASP.NET의 경우 tag를 DB에 저장할 때,
isSms.Checked ? "1" : "0"
이래 주면 되거든요. 구지 함수를 만들 필요가 없지요.
꺼낼 때에는 바인딩 개념을 쓰니깐 Checked='<%# (bool)Eval("isSms") %>' 이딴 식으로 하지요.
'ASP > ASP My Library' 카테고리의 다른 글
ASP용 String.Format() 함수, eregi_replace() 함수, SQL 인젝션 방지 함수 (0) | 2013.10.01 |
---|
개요
쿼리문 작성 어떻게 하나요?
그냥 막코딩 하면 되지요~~
가독성 따윈 필요 없으니
", name=" + name + ", nick=" +
이런 식으로 해도 되지요.
열맞추고 줄맞추고 해서 가독성 높일 수도 있습니다.
저도 전에 그렇게 했었어요.
하지만 잠깐 시간을 내어 아래 함수 사용법을 익히면,
가독성이 높은 쿼리문을 작성 할 수 있습니다.
가독성이 높아지면 실수할 확률이 적어지고, 디버깅 횟수가 줄게 되어
결과적으로 빠른 코딩이 가능해 집니다.
가장 중요한 함수는 가독성을 위한 stringFormat()과 보안을 위한 toDbString() 입니다.
함수들
<%
'닷넷의 String.Format을 흉내낸 함수 입니다.
Function stringFormat(sVal, aArgs)
Dim i
For i=0 To UBound(aArgs)
sVal = Replace(sVal,"{" & CStr(i) & "}",aArgs(i))
Next
StringFormat = sVal
End Function
'아래와 같이 결과를 변수에 무조건 대입해야 합니다. 아니면 문법 오류가 발생 합니다.
'Dim result
'result = stringFormat("this {0} a tes{1} string containing {2} values", _
' Array("is", "t", "some"))
'PHP의 eregi_replace 를 흉내낸 함수 입니다.
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
'문자열을 쿼테이션으로 감싸주는 것을 기본으로 하여,
'사용자가 입력한 ' 에 대한 지원과
'SQL 인젝션 방지 그리고 자바스크립트 삽입 방지를 지원합니다.
Function toDbString(str)
str = Replace(str, "'", "''")
str = "'" + str + "'"
str = eregi_replace("<script", "< script", str)
str = eregi_replace("</script", "< /script", str)
toDbString = str
End Function
%>
사용법
<%
query = stringFormat("update bbsCon set title={0}, content={1}, ip={2} where id={3}", _
Array(toDbString(title), _
toDbString(content), _
toDbString(Request.ServerVariables("REMOTE_ADDR")), _
id _
) _
)
query = stringFormat("insert into bbsCon (title, content, nick, ip) values ({0}, {1}, {2}, {3})", _
Array(toDbString(title), _
toDbString(content), _
toDbString(Session("nick")), _
toDbString(Request.ServerVariables("REMOTE_ADDR")) _
) _
)
query = stringFormat("delete from bbsCon where id={0}", _
Array(id))
query = stringFormat("select id, dtReg, title, nick, readCnt, ip from bbsCon order by id desc", _
Array())
query = stringFormat("select * from bbsCon where id={0}", _
Array(id))
%>
'ASP > ASP My Library' 카테고리의 다른 글
ASP HTML Tag 값과 DB 값을 호환 시키기 위한 짝 함수 - checkbox (0) | 2013.10.04 |
---|