Tengo algo de código para leer de una base de datos mysql, pero me preguntaba ¿cómo puedo modificar esto para ver si un usuario existe en la tabla?

gracias

    Private Sub GetDBData()
    Try
        'prepare connection query 
        strQuery = "SELECT users.Username, users.Password " & _
        "FROM users " & _
        "WHERE Username='User'"
        SQLCmd = New MySqlCommand(strQuery, dbCon)
        'open db and start query
        dbCon.Open()
        DR = SQLCmd.ExecuteReader
        While DR.Read
            MysqlData.Text = MysqlData.Text & DR.Item("Username") & Space(10) & DR.Item("Password") & vbCrLf
        End While
        'done so closing db
        DR.Close()
        dbCon.Close()

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub
  • En un vistazo, por favor, utilice SQL parametrizada. Está abierta para la inyección de SQL.
InformationsquelleAutor user1244772 | 2012-08-07

5 Comentarios

  1. 2

    Una forma fácil es hacer una consulta como la siguiente:

    SELECT COUNT(*) FROM users WHERE Username='user123';

    Ejecutar, tomar de nuevo el valor que devuelve y si es 0, entonces los usuarios no existe. Si es 1, entonces existe y si es mayor que 1, entonces algo está mal (tiene más de un usuario con el mismo nombre de usuario).

  2. 2

    Mi VB bastante oxidado, pero aquí está el quid de la cuestión;

    Private Sub GetDBData()
    Try
        'prepare connection query 
        strQuery = "SELECT users.Username, users.Password " & _
        "FROM users " & _
        "WHERE Username='User'"
        SQLCmd = New MySqlCommand(strQuery, dbCon)
        'open db and start query
        dbCon.Open()
        DR = SQLCmd.ExecuteReader
    
        If DR.HasRows Then
    
            While DR.Read
                MysqlData.Text = MysqlData.Text & DR.Item("Username") & Space(10) & DR.Item("Password") & vbCrLf
            End While
        Else
            'COMMENT: Your user didn't exist
        End If
    
        'done so closing db
    
        'COMMENT: move to a finally() section and check objects are not null before closing
        DR.Close()
        dbCon.Close()
    
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

    End Sub

  3. 2

    Uso commandcon parameters para evitar la Inyección de código SQL. Una estrategia para que si sólo la comprobación de nombre de usuario de la existencia con la realización de la comparación es crear una función que devuelve booleano. A continuación es un ejemplo de código basado en sus necesidades.

    Private Function IsUserExist(userName as string) AS Boolean
    
            Dim returnValue as boolean = false
    
            strQuery = "SELECT COUNT(*)"
            strQuery &= "FROM users "
            strQuery &= "WHERE Username = @xUserName "
    
            Using xConn as new MySQLCnnection("connectionStringHere")
                Using xComm as New MySQLCommand()
                    With xComm
                        .Connection = xConn
                        .CommandText = strQuery
                        .CommandType = CommandType.Text
                        .Parameters.AddWithValue("@xUserName", userName)
                    End With
                    Try
                        xConn.Open()
                        If CInt(xComm.ExecuteScalar()) > 0 Then
                            returnValue = true
                        End If
                    Catch ex as MySQlException
                        MsgBox(ex.Message)
                        returnValue = false
                    Finally
                        xConn.Close
                    End Try
                End Using
            End Using
    
            return returnValue
    End Sub
  4. 2

    Modificarlo? Demasiado malo con eso.
    No uso de bloque, a excepción de la deglución, y el potencial de ataque de inyección de sql.

    Algo así (yo no lo hago VB, pero la idea básica es la de sonido)

    Private Function UserExists(argUser As string) As Bool
      strQuery = "SELECT Username FROM users WHERE Username=?User"
      Using SQLcmd = New MySqlCommand(strQuery, dbCon)
        SQLCmd.Parameters.Add("?User",argUser)  
        dbCon.Open()
        Using reader = SQLCmd.ExecuteReader()
          return reader.Read()
        End Using
      End Using
    End Function

    Estaría crear instancias de una conexión, así en vez de conseguir que desde donde quiera que se encuentran (en un bloque using) como si se tratara de mí.

    • Tal vez una pregunta estúpida, pero ¿qué ?El usuario medio?
    • Parametrizar la consulta de manera Efectiva ?El usuario será reemplazado con el valor del argumento en SQLCmd.Los parámetros.Añadir llamada, de una manera que no se podía abrir hasta un ataque de inyección de sql.
  5. 0
    Protected Sub btnlogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnlogin.Click
        Dim myAdapter As New MySqlDataAdapter
        Dim myCommand As New MySqlCommand
        Dim myData As MySqlDataReader
        Dim conn As MySqlConnection = New MySqlConnection("Data Source=localhost;Database=name;User ID=root;Password=pwd;")
    
        Dim loginstring As String = "SELECT uname,password,type FROM logindetails WHERE uname = '" + txtuname.Text + "' AND password = '" + txtpwd.Text + "' "
        Try
            conn.Open()
        Catch myerror As MySqlException 'If it fails do this... (i.e. no internet connection, etc.)
            MsgBox("Error connecting to database. Check your internet connection.", MsgBoxStyle.Critical)
        End Try
    
        myCommand.Connection = conn
        myCommand.CommandText = loginstring
        myAdapter.SelectCommand = myCommand
        myData = myCommand.ExecuteReader
    
        If myData.HasRows = 0 Then
            MsgBox("Invalid Credentials", MsgBoxStyle.Critical)
        Else
            Response.Redirect("Adminhome.aspx")
            MsgBox("Logged in as " & txtuname.Text & ".", MsgBoxStyle.Information)
        End If
        conn.Close()
    End Sub
    • Por favor, no acaba de proporcionar el código de soluciones de solo

Dejar respuesta

Please enter your comment!
Please enter your name here