2017-03-07 4 views
0

私は、mysqlデータベースとユーザーの電子メールとパスワード用のテーブルを持つvb.netアプリケーションを持っています。私はいくつかのログインが可能であることに気づきはじめました。他のユーザーは自分自身ですべてのユーザーアカウントを試してみました。奇数番号のログインログインがすべて動作し、偶数番号のログインはすべて行われませんでした。私はこれがなぜ機能していないのかという手がかりを持っていません。以下ユーザーのメールアドレスとパスワードを持つテーブルでは、他のすべてのユーザーのみがログインできます

コード:

Partial Public Class Login 

    Inherits Page 

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 

     Email.Focus() 

    End Sub 

    Protected Sub LogIn(sender As Object, e As EventArgs) Handles btnLogin.Click 


     Dim conn As New MySqlConnection 

     Dim cmd As MySqlCommand 

     Dim rdr As MySql.Data.MySqlClient.MySqlDataReader 

     Dim query As String 
     Dim name As String = "" 
     Dim time_out As Integer 
     Dim user_access As Integer 
     Dim pswrd As String 
     Dim e_mail As String 
     Dim firstname As String 
     Dim lastname As String 



     Try 

      conn = New MySqlConnection(connStr) 

      conn.Open() 

      query = "SELECT * FROM user" 

      cmd = New MySqlCommand(query, conn) 

      rdr = cmd.ExecuteReader 

      Do While rdr.HasRows = True 

       firstname = "" 
       lastname = "" 
       pswrd = "" 
       time_out = 0 
       user_access = 1 

       rdr.Read() 

       firstname = rdr.GetString(rdr.GetOrdinal("first_name")) 
       lastname = rdr.GetString(rdr.GetOrdinal("last_name")) 
       e_mail = rdr.GetString(rdr.GetOrdinal("email")) 
       pswrd = rdr.GetString(rdr.GetOrdinal("password")) 
       user_access = rdr.GetString(rdr.GetOrdinal("access")) 
       time_out = rdr.GetString(rdr.GetOrdinal("timeout")) 


       If pswrd = Password.Text And e_mail = Email.Text Then 

        session_email = e_mail 
        session_access = user_access 
        session_timeout = time_out 
        session_first = firstname 

        Session("Session_User") = session_email 
        Session("Session_TimeOut") = time_out 
        Session("Session_Access") = session_access 
        Session("Session_First") = session_first 

        Response.Write(session_first & " your access level is ... " & session_access & vbCrLf & "With an access level of... " _ 
         & vbCrLf & "1 You can create work orders And view most other things" _ 
         & vbCrLf & "2 You can create work orders, View and or Modify some items. Please be careful" _ 
         & vbCrLf & "3 You have full Create, Edit and Delete access. Please be careful Jedi Master!" _ 
         & vbCrLf & vbCrLf & "You have " & time_out & " minutes to complete your task.", vbSystemModal, "Logged In") 

        GoTo JumpPoint2 

       End If 


       If rdr.Read() = False Then 

        Response.Write("Your Login Attempt Failed " & vbCrLf & "Either your email address or password are NOT correct" & vbCrLf & "or you do not have access to this system yet." & vbCrLf & "Contact Management if you need an account set up for you.", vbSystemModal, "Log In Failure") 

        GoTo JumpPoint1 

       End If 

      Loop 
JumpPoint1: 
     Catch ex As Exception 

      Response.Write("Login Fail by Exception : " & vbCrLf & vbCrLf & ex.Message) 

     End Try 

JumpPoint2: 

     conn.Close() 

     If session_access = "1" Or session_access = "2" Or session_access = "3" Then 

      Response.Redirect("~/MainMenu.aspx") 

     End If 

    End Sub 

End Class 


End of Code: 

任意のアイデアをいただければ幸いです。

+0

パスワードをプレーンテキストとして保存しないでください – Plutonix

+0

最終的にそこに着くでしょう。 vb.netとMySQLの新機能すべての例に圧倒されました。 –

答えて

1

これは、ループ内の各繰り返しで.Readを2回呼び出すためです。これは、他のすべての行をスキップします。あなたのループは、これに変更します。

Dim bolValidated As Boolean = False 

Do While rdr.Read() 

    .. 
    'Update bolValidated to True if you find a match.' 


Loop 

If Not bolValidated Then 

    Response.Write("Your Login Attempt Failed ...") 

End If 

よりよい解決策は、しかしでしょう処理を減らすために、あなたのSQLステートメントを変更するには:

SELECT TOP(1) * FROM User WHERE email = @Email AND password = @Password 

usingステートメントでの接続をラップすることはどちらか悪いアイデアではないでしょう。

+0

優秀な提案。これは確かに完了します。 –

関連する問題