2013-05-02 111 views
0

我正在寫一個項目,在某些時候我必須檢查數據庫中是否有與id-textboxpassword-textbox的內容相匹配的條目。但我不知道如何在我的後端代碼(VB)中表明查詢不返回任何內容。如何檢查mysql查詢是否返回任何內容?

這是我正在使用的代碼。但它不能以某種方式工作。錯誤消息沒有被提示:

Try 
    myconn.Open() 
    Dim stquery As String = "SELECT * from accountstbl WHERE user_ID = " & IdNumb.Text 
    Dim smd As MySqlCommand 
    Dim myreader As MySqlDataReader 
    smd = New MySqlCommand(stquery, myconn) 
    myreader = smd.ExecuteReader() 
    If myreader.Read() = True Then 
     If myreader.Item("user_ID") = IdNumb.Text Then 
      If myreader.Item("password") = CurrPass.Text Then 
       'some code if the user input is valid 
      Else 
       errorPassID.Visible = True 
      End If 
     Else 
      errorPassC.Visible = True 
     End If 
    End If 
    myconn.Close() 
Catch ex As Exception 
    Dim ErrorMessage As String = "alert('" & ex.Message.ToString() & "');" 
    Page.ClientScript.RegisterStartupScript(Me.GetType(), "ErrorAlert", ErrorMessage, True) myconn.Close() 
End Try 

將不勝感激任何幫助或建議。

+0

你期待只有一個結果集返回,或能有多重火柴? – Tim 2013-05-02 07:31:30

+0

你是什麼意思? – meks 2013-05-02 10:07:20

回答

0

我會嘗試檢查閱讀器是否返回行,如果不是,則發出錯誤消息。 另外,不要使用字符串連接構建查詢,總是使用參數化查詢

 myconn.Open() 
     Dim stquery As String = "SELECT * from accountstbl WHERE user_ID = @id" 
     Dim smd = New MySqlCommand(stquery, myconn) 
     smd.Parameters.AddWithValue("@id", Convert.ToInt32(IdNumb.Text)) 
     Dim myreader = smd.ExecuteReader() 
     if Not myreader.HasRows Then 
      Dim ErrorMessage As String = "alert('No user found');" 
      Page.ClientScript.RegisterStartupScript(Me.GetType(), "ErrorAlert", ErrorMessage, True) 
      myconn.Close() 
      return 
     else 
      myreder.Read() 
      ' no need to check if id is equal, you pass it as parameter to a where clause' 
      If myreader.Item("password") = CurrPass.Text Then 
       'some code if the user input is valid ' 
      Else 
       errorPassID.Visible = True 
        ' or error message ' 
      End If 
     End If 
     myconn.Close() 
    Catch ex As Exception 
     Dim ErrorMessage As String = "alert('" & ex.Message.ToString() & "');" 
     Page.ClientScript.RegisterStartupScript(Me.GetType(), "ErrorAlert", ErrorMessage, True) 
     myconn.Close() 
    End Try 

還要注意沿導線是通過明文密碼是一個嚴重的安全漏洞。我希望你已經存儲了密碼的散列並檢查。

順便說一句,爲什麼不在查詢中也傳遞密碼哈希?財產以後這樣的:

Dim stquery As String = "SELECT * from accountstbl WHERE user_ID = @id AND password = @pwd" 

這樣,如果你有一個返回的記錄用戶通過驗證,客戶端代碼將是簡單

+0

我不相信'MySqlDataReader'具有'HasRows'屬性 - 至少不是根據我看到的文檔。儘管如此,將是最簡單的方法。 – Tim 2013-05-02 07:35:07

+0

MySqlDataReader實現DbDataReader,我現在無法測試它,但我期望該屬性存在 – Steve 2013-05-02 07:49:54

+0

我將它分解爲2個,因爲我需要提示2種類型的錯誤消息。一個如果密碼無效另一個如果用戶ID是錯誤的 – meks 2013-05-02 10:11:00

相關問題