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

Résolu/Fermé
-
 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


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
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 005
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
Messages postés
2
Date d'inscription
vendredi 11 janvier 2013
Statut
Membre
Dernière intervention
11 janvier 2013

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