2013-05-02 108 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

相关问题