2009-09-24 7 views
0

다음과 같이 전자 메일이 테이블에 있는지 확인하는 코드가있는 고전적인 ASP 페이지가 있습니다.전자 메일이 있는지 확인하십시오.

<% 
    '' //Check the submitted email against existing ones in the database 
    set CmdCheckEmail = server.CreateObject("ADODB.Command") 
    CmdCheckEmail.ActiveConnection = MM_dbconn_STRING 
    CmdCheckEmail.CommandText = "SELECT COUNT(ReferredEmail) AS 'CountEmail' FROM TenantReferral WHERE ReferredEmail = '" & Request("Email") & "'" 
    Response.Write(CmdCheckEmail.CommandText) 
    CmdCheckEmail.CommandType = 1 
    CmdCheckEmail.CommandTimeout = 0 
    CmdCheckEmail.Prepared = true 
    CmdCheckEmail.Execute() 

    countEmail = CmdCheckEmail("CountEmail") 

    set CmdCheckEmail = nothing 
    conn.close 
    set conn = nothing 

    If(countEmail >= 1) Then 
     Message = Message & "<p>This email address has already been referred.</p>" 
    End If 
%> 

그러나이 페이지는 다음 오류를보고합니다.

SELECT COUNT(ReferredEmail) AS 'CountEmail' FROM TenantReferral WHERE ReferredEmail = '[email protected]' 

ADODB.Command error '800a0cc1' 

Item cannot be found in the collection corresponding to the requested name or ordinal. 

/default2.asp, line 19 

라인 19는 다음과 같습니다.

countEmail = CmdCheckEmail("CountEmail") 

전자 메일은 테이블에 존재하며 테이블에는 다음과 같은 열이 있습니다. ReferredEmail 및 ReferredCode

누구든지이 오류에 불을 붙일 수 있는지 궁금하네요?

감사합니다.

답변

0

주 당신이 사용하고 있지만 당신의 SQL을 변경하려고 무엇 데이터베이스 : 다음

CmdCheckEmail.Execute()  
countEmail = CmdCheckEmail("CountEmail") 

또한

set rs = CmdCheckEmail.Execute() 
countEmail = rs("CountEmail") 

에, 당신은 SQL 주입 문제가 변경

SELECT COUNT(ReferredEmail) AS CountEmail FROM TenantReferral WHERE ReferredEmail = '[email protected]' 

그 쿼리와. parameterized queries을 사용해야합니다.

+0

@Orbman - 저는 MSSQL 데이터베이스를 사용하고 있지만 'CountEmail'또는 CountEmail을 사용 하던지 동일한 오류를 계속보고합니다 : ( – doubleplusgood

+0

) cmd 개체가 잘못되었습니다. 내 편집을 참조하십시오. – RedFilter

+0

감사합니다. Orbman. 지금 필요한 개체가 있습니다. 'conn' /default2.asp, 줄 20 오류 – doubleplusgood

0

CmdCheckEmail("CountEmail")은 매개 변수 컬렉션 인 Command 개체의 기본 멤버에 액세스하려고 시도합니다. 그러나 매개 변수에 액세스하지 않고 결과 레코드 세트의 필드에 액세스하려고합니다.

은 (테스트하지)이 시도 : 그것과는 별도로

Set rs=CmdCheckEmail.Execute() 

countEmail = rs("CountEmail") 

를주의 :이 줄 :

CmdCheckEmail.CommandText = "SELECT COUNT(ReferredEmail) AS 'CountEmail' FROM TenantReferral WHERE ReferredEmail = '" & Request("Email") & "'" 

SQL injection 공격에 취약합니다.

SQL 문에 리터럴 문자열을 포함하지 마십시오. 대신 매개 변수를 사용하십시오. 이 경우 Command.Parameters 컬렉션을 사용하면됩니다.

관련 문제