Voir si la ligne existe user/pass en MySQL sur VB.net

Résolu
lesiteduhtml -  
 lesiteduhtml -
Bonjour à tous,
Je travaille en VB.Net et j'aurai besoin d'aide pour pouvoir me connecter avec l'aide d'une base de données MySQL.
Je me connecte donc en MySQL, j'inscris mon identifient et mon mot de passe qui sont stockés dans des variables, ensuite je regarde quel ID correspond au PASS et au USER.
Si ce sont les même, alors je dit "Vous êtes connecté !" Sinon je dit : "Vous n'êtes pas connecté !".

Voici le code :
Imports MySql.Data.MySqlClient


Public Class Form1

    Public ConnexionSql As String = "Database=jeu;" & "Data Source=monnomdedomaine.fr;" & "User Id=monid;Password=******;" & "Connection Timeout=20" 'Cela je l'ai modifié :)

    Public Sub Lecture()
        Try
            Dim USER As String = TXTBOX_USER.Text
            Dim PASS As String = TXTBOX_PASS.Text
            Dim query As String = "SELECT id from users Where pass = @PASS"
            Dim query2 As String = "SELECT id from users Where user = @USER"
            Dim connection As New MySqlConnection(ConnexionSql)
            Dim command As New MySqlCommand(query, connection)
            Dim command2 As New MySqlCommand(query2, connection)
            Dim iduser As Integer
            Dim idpass As Integer

            connection.Open()

            Try

                iduser = command.ExecuteNonQuery
                idpass = command2.ExecuteNonQuery

                If iduser = idpass Then
                    LB_CONNECT.Text = "Bravo vous êtes connecté :)"
                Else
                    LB_CONNECT.Text = "Le nom d'utilisateur ou le mot de passe est faux :("
                End If

            Catch ex As Exception
                LB_ERREUR.Text = ex.Message
            End Try



            connection.Close()
        Catch ex As Exception
            LB_ERREUR.Text = ex.Message
        End Try
    End Sub
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub BT_COMMENC_Click(sender As System.Object, e As System.EventArgs) Handles BT_COMMENC.Click
        Lecture()
    End Sub
End Class


3 réponses

  1. lesiteduhtml
     
    Excusez-moi vraiment mais j'ai trouvé la réponse depuis longtemps (je ne me souvenais plus avoir posté la question sur ce forum.
    Voici comment on fait pour d'éventuel demandeurs:
      
    try  
    Public ConnexionSql As String = "Database=madatabase;" & "Data Source=monsite.fr;" & "User Id=monid;Password=monpass;" & "Connection Timeout=20"
    Dim connection As New MySqlConnection(ConnexionSql)
                connection.Open()
    Dim query As String = "SELECT id FROM matable WHERE pass = @pass and user = @user LIMIT 1" 'Moi mon pass je l'ai concacter puis md5ter :)
                Dim command As New MySqlCommand(query, connection)
                command.Prepare()
                command.Parameters.AddWithValue("@pass", PASS) '@pass ne peux rien dire dans la query, je lui dit donc qu'il est égale à la variable PASS.
                command.Parameters.AddWithValue("@user", USER)
                Dim mysqlReader As MySqlDataReader = command.ExecuteReader()
                ' Call Read before accessing data. 
                Dim hasmatch As Boolean = False
                While mysqlReader.Read()
                    Dim record As IDataRecord = CType(mysqlReader, IDataRecord)
                    If record(0) Then
                        hasmatch = True
                    End If
                End While
                If hasmatch Then
                    userbon = TXTBOX_USER.Text
                    LB_CONNECT.Text = "Bravo " & USER & ", vous êtes connectés"
                    TXTBOX_PASS.Clear()
                    TXTBOX_USER.Clear()
    'là vous mettez tout ce que vous vouez faire si le user est bon.
                    Exit Sub
                Else
                    MsgBox("Vous n'êtes pas connecté")
                    LB_CONNECT.Text = "Vous n'êtes pas connectés"
                End If
                'mysqlReader.Close()
                ' Call Close when done reading.
                mysqlReader.Close()
                connection.Close()
            Catch ex As Exception
                LB_ERREUR.Text = ex.Message 'ou MsgBox si vous voulez
            End Try
    

    Voilà, au revoir et merci d'avoir répondu à ma demande
    Amicalement
    Jérôme
    3
  2. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Bonjour,

    Tu ne dis pas quel est ton problème !
    Est-ce que tu as une erreur à l'exécution ?
    À la compilation ?
    Est-ce que le comportement n'est pas celui attendu ?

    Sinon, ta méthode d'authentification n'est pas bonne.
    Imagine que deux utilisateurs aient le même mot de passe : tu ne sais pas quel id te sera retourné en premier.

    Il vaut mieux faire une seule requête qui vérifie les deux égalités :
    SELECT count(id) from users Where pass = @PASS AND user = @USER

    Et vérifier que le résultat est positif (comprendre : qu'il y a au moins une ligne qui contienne ce User et ce Pass)

    Xavier
    0
  3. mryapados Messages postés 4 Statut Membre
     
    Si ça peut aider...

    Voici une classe, écrite il y a longtemps mais qui marche bien qui permet de travailler dans une base mysql : exécuter des requêtes sql, lire, écrire des données...

    'il faut avoir importé dans les références : MySql.Data
    'Disponible sur : https://dev.mysql.com/downloads/connector/net/

    Imports MySql.Data.MySqlClient
    
    Public Class SQLM
    
    #Region "Variables"
        Private Const inObjectError = vbObjectError + 100
    
        Private dbSQLM As MySqlConnection
    
        Private _Current_Row As Integer = 0 'Variable de propriété : GET/SET : N° de ligne en cour lue dans la table 
        Private _EoT As Boolean = True 'Variable de propriété : GET : Indique si l'on est arrivé en fin de table
        Private _SQL As String = "" 'Variable de propriété : GET/SET : Requête SQL en cour
        Private _Rows As Integer = 0 'Variable de propriété : GET : Nombre de lignes total
        Private _Cols As Integer = 0 'Variable de propriété : GET : Nombre de colonnes total
    
        Private _DataTable As DataTable
        'Variable de propriété : GET : Le DataTable en cour = ON PEUT NAVIGUER DIRECTEMENT DEDANS après avoir executer 
        'la fonction query ou query_auto (Si on ne veut pas passer par les fonctions simplifié que j'ai crée ci-dessous)
    
        Private _Affected_Rows As Integer = 0 'Variable de propriété : GET/SET : Le nombre de lignes affectés par une requête non SELECT
    
        Private _Option_NonQuery_Auto As Boolean = True 'Variable de propriété : GET : Définit une option qui laisse la classe déterminer elle même le type de requête : SELECT ou non
    
        Private _SQLError As Boolean = False
        Private _SQLErrorExpression As String = ""
    #End Region
    #Region "Liste des propriétés"
        Public Property Current_Row() As Integer
            Get
                Return _Current_Row
            End Get
            Set(ByVal Current_Row As Integer)
                _Current_Row = Current_Row
            End Set
        End Property
        Public Property SQL() As String
            Get
                Return _SQL
            End Get
            Set(ByVal SQL As String)
                _SQL = SQL
            End Set
        End Property
        Public Property Option_NonQuery_Auto() As Boolean
            Get
                Return _Option_NonQuery_Auto
            End Get
            Set(ByVal Option_NonQuery_Auto As Boolean)
                _Option_NonQuery_Auto = Option_NonQuery_Auto
            End Set
        End Property
        Public ReadOnly Property Rows() As Integer
            Get
                Return _Rows
            End Get
        End Property
        Public ReadOnly Property Cols() As Integer
            Get
                Return _Cols
            End Get
        End Property
        Public ReadOnly Property EoT() As Boolean
            Get
                Return _EoT
            End Get
        End Property
        Public ReadOnly Property DataTable() As DataTable
            Get
                Return _DataTable
            End Get
        End Property
        Public ReadOnly Property Affected_Rows() As Integer
            Get
                Return _Affected_Rows
            End Get
        End Property
        Public ReadOnly Property Column(ByVal Index As Integer) As String
            Get
                Return _DataTable.Columns(Index).Caption
            End Get
        End Property
        Public ReadOnly Property SQLError() As Boolean
            Get
                Return _SQLError
            End Get
        End Property
        Public ReadOnly Property SQLErrorExpression() As String
            Get
                Return _SQLErrorExpression
            End Get
        End Property
    #End Region
    #Region "New"
        Private Sub New()
            MyBase.New()
        End Sub
        Public Sub New(ByVal ConnectionString As String)
            MyClass.New()
            dbSQLM = New MySqlConnection(ConnectionString)
        End Sub
        Public Sub New(ByVal SQL As String, ByVal ConnectionString As String)
            MyClass.New(ConnectionString)
            Query_Auto(SQL)
        End Sub
    
    #End Region
    #Region "Connexion / Fermeture"
        Public Sub Connect()
            dbSQLM.Open()
        End Sub
        Public Sub Close()
            dbSQLM.Close()
        End Sub
    #End Region
    #Region "Query"
        Public Function Query(ByVal SQL As String) As Boolean
            'Execute la requête SQL fournie en argument 
            'et détermine si elle est de type SELECT ou non (si la 
            'propriété Option_NonQuery_Auto est égal à True) afin 
            'd'affecté dans les propriétés de "retour" des valeurs adéquates
            Return Query_NonQuery_Auto(SQL)
        End Function
        Public Function Query(ByVal SQL As String, ByVal NonQuery As Boolean) As Boolean
            'Execute la requête SQL stocké dans la propriété SQL
            'selon le mode NonQuery
            Dim RST As Boolean = False
            Return Query_Execute(SQL, NonQuery)
        End Function
    #End Region
    #Region "Query_Auto (Connexion et deconnexion automatique)"
        'Fonctions identiques à Query sauf que la connexion et 
        'la deconnexion à la base se fait automatiquement (pourvu qu'on 
        'est bien remplit les propriétés de connexion
        Public Function Query_Auto(ByVal SQL As String) As Boolean
            Dim RST As Boolean = False
            Connect()
            RST = Query_NonQuery_Auto(SQL)
            Close()
            Return RST
        End Function
        Public Function Query_Auto(ByVal SQL As String, ByVal NonQuery As Boolean) As Boolean
            Dim RST As Boolean = False
            Connect()
            RST = Query_Execute(SQL, NonQuery)
            Close()
            Return RST
        End Function
    #End Region
    #Region "Traitement de le requête SQL"
        Private Function As_SELECT(ByVal SQL As String) As Boolean
            'Détermine si la requête est de type SELECT
            If SQL.Substring(0, 6).ToLower.ToString = "select" Then Return True
            Return False
        End Function
        Private Function Query_NonQuery_Auto(ByVal SQL As String) As Boolean
            'Détermine le mode d'execution de la requete : SELECT ou AUTRE
            If _Option_NonQuery_Auto Then
                Dim NonQuery As Boolean = Not As_SELECT(SQL)
                Return Query_Execute(SQL, NonQuery)
            Else
                Return Query_Execute(SQL, False)
            End If
            Return Nothing
        End Function
    
        Private Function Query_Execute(ByVal SQL As String, ByVal NonQuery As Boolean) As Boolean
            'Execute la requête
    
            'Initialise les propriétés
            _Current_Row = 0
            _EoT = True
            _Rows = 0
            _Cols = 0
            _DataTable = Nothing
            _Affected_Rows = 0
            _SQLError = False
    
            'Debug.Print(SQL)
    
            Try
                If NonQuery Then
                    'Si la requête n'est pas de type SELECT et donc ne renvoit pas de DataTable
                    Dim reader As MySqlDataReader
                    Dim cmd As New MySqlCommand(SQL, dbSQLM)
                    reader = cmd.ExecuteReader()
    
                    'affecte la proprité contenant le nombre d'enregistrement affecté par la requête
                    _Affected_Rows = reader.RecordsAffected
    
                Else
                    'La requête renvoit un DataTable
                    Dim RST_DataTable As DataTable = New DataTable
                    Dim Table As New DataSet
                    Dim da As New MySqlDataAdapter
                    da = New MySqlDataAdapter(SQL, dbSQLM)
                    da.Fill(Table, "RST")
                    RST_DataTable = Table.Tables("RST")
    
                    'Affecte les propriétés
                    _Current_Row = 0
                    If RST_DataTable.Rows.Count = 0 Then
                        _EoT = True
                    Else
                        _EoT = False
                    End If
                    _Rows = RST_DataTable.Rows.Count
                    _Cols = RST_DataTable.Columns.Count
                    _DataTable = RST_DataTable
                End If
    
            Catch ex As MySqlException
                _SQLError = True
                _SQLErrorExpression = ex.Message
                'MessageBox.Show("Error connecting to the server: " + ex.Message + vbCrLf + vbCrLf + "SQL : " + vbCrLf + SQL, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Finally
                _SQL = SQL
            End Try
    
            Return Not _SQLError
        End Function
    
    #End Region
    #Region "Fonctions de navigation de le DataTable"
        Private Function Update_Current_Row(ByVal Current_Row As Integer) As Boolean
            'Met à jour la propriété Current_Row si possible
            Dim RST As Boolean = False
            If Current_Row > 0 Then
                If Current_Row <= _DataTable.Rows.Count Then
                    _Current_Row = Current_Row
                    If _Current_Row = _DataTable.Rows.Count Then
                        _EoT = True
                    End If
                    RST = True
                End If
            End If
            Return RST
        End Function
    
        Public Function Record_Previous() As Boolean
            'Recule de 1 la propriété Current_Row si possible
            Return Update_Current_Row(_Current_Row - 1)
        End Function
    
        Public Function Record_Next() As Boolean
            'Avance de 1 la propriété Current_Row si possible
            Return Update_Current_Row(_Current_Row + 1)
        End Function
    
        Public Function Get_Value(ByVal key As Object) As Object
            'Permet de récupéré la valeur de la colonne "key" qui peut 
            'soit être de type String (key) soit de type Numerique (Index)
            'en fonction de la propriété Current_Row 
            Dim RST As Object
            Dim Row = _Current_Row
            If IsNumeric(key) Then
                RST = _DataTable.Rows(Row).Item(CInt(key))
            Else
                RST = _DataTable.Rows(Row).Item(key.ToString)
            End If
            Return RST
        End Function
    
        Public Function Get_Value() As Dictionary(Of String, Object)
            'Permet de récupéré les valeurs de la ligne Current_Row et les place dans un tableau associatif
            Dim RST As New Dictionary(Of String, Object)
            Dim Row = _Current_Row
            Dim j As Integer = 0
            Dim Key As String = ""
            With _DataTable
                For j = 0 To .Columns.Count - 1
                    Key = .Columns(j).ColumnName
                    RST.Add(Key, .Rows(Row).Item(Key))
                Next
            End With
            Return RST
        End Function
    
        Public Function ColumnExist(ByVal Column As String) As Boolean
            Dim RST As Boolean = False
            If _DataTable.Columns.Contains(Column) Then RST = True
            Return RST
        End Function
    
        Public Sub Dispose()
            If dbSQLM IsNot Nothing Then dbSQLM.Dispose()
            _Current_Row = 0
            _EoT = True
            _SQL = ""
            _Rows = 0
            _Cols = 0
            If _DataTable IsNot Nothing Then _DataTable.Dispose()
            _Affected_Rows = 0
            _Option_NonQuery_Auto = True
        End Sub
    
    #End Region
    
    
        Public Shared Function EscapeSQL(ByVal Value As String) As String
            Return Value.Replace("\", "\\")
        End Function
    
    
        Public Shared Function Addslashes(ByVal Value As String, Optional ByVal Esc As Char = CChar("\")) As String
            Dim RST As String = Value
    
            If Not Esc = Nothing Then
                Dim Co() As Char = RST.ToCharArray
                Dim Cf() As Char
                Dim MyC As New Char
    
                ReDim Cf(-1)
                For Each MyC In Co
                    If MyC = "'" Or MyC = Chr(34) Or MyC = Esc Or MyC = Chr(0) Or MyC = "'" Then
                        ReDim Preserve Cf(Cf.Length)
                        Cf(Cf.Length - 1) = Esc
                    End If
                    ReDim Preserve Cf(Cf.Length)
                    Cf(Cf.Length - 1) = MyC
                Next
                RST = Cf
            End If
    
            Return RST
        End Function
        Public Shared Function Stripslashes(ByVal Value As String, Optional ByVal Esc As Char = CChar("\")) As String
            Value = Value.Replace(Esc + Chr(34), Chr(34))
            Value = Value.Replace(Esc + Esc, Esc)
            Value = Value.Replace(Esc + Chr(0), Chr(0))
            Value = Value.Replace(Esc + "'", "'")
            Value = Value.Replace(Esc + "'", "'")
    
            Return Value
        End Function
    
        Public Shared Function EntoureVar(ByVal Expression As String, Optional ByVal Entoure As Char = CChar("'")) As String
            Return EntoureVar(Expression, False, Entoure)
        End Function
    
        Public Shared Function EntoureVar(ByVal Expression As String, Force As Boolean, Optional ByVal Entoure As Char = CChar("'")) As String
            If Not Force And IsNumericNotSpace(Expression) Then
                Return Expression.Replace(",", ".")
            Else
                Return Entoure + Addslashes(Expression) + Entoure
            End If
        End Function
        Public Shared Function IsNumericNotSpace(ByVal Expression As String) As Boolean
            If Expression.IndexOf(" ") = -1 Then
                If IsNumeric(Expression) Then Return True
            End If
            Return False
        End Function
    
    
    
        Public Function RunQuery(ByVal Query As String) As DataSet
            Try
                dbSQLM.Open()
                Dim DA As New MySqlDataAdapter
                Dim MyRs As New DataSet
                DA.SelectCommand = New MySqlCommand(Query, dbSQLM)
                DA.Fill(MyRs)
                dbSQLM.Close()
                Return MyRs
            Catch ex As Exception
                dbSQLM.Close()
                Err.Raise(inObjectError + 2, "SQLM_MySQL", "Erreur lors de la requete:" + vbCrLf + vbCrLf + Query + vbCrLf + vbCrLf + ex.Message)
                Return New DataSet
            End Try
        End Function
    
    
    End Class


    exemple d'utilisation :
            Dim S As New SQLM("SELECT * FROM composer WHERE idarticle = " + Father.Id.ToString, Parametres.ConnectionStringArticles)
            While Not S.EoT
                Dim Id As Integer = CInt(S.Get_Value("idcomposant"))
                Dim Quantite As Single = CSng(S.Get_Value("quantite"))
    
    		'(...)
    		'(...)
    
                S.Record_Next()
            End While
    0