IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Récupérer la valeur d'un champ après recherche


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut Récupérer la valeur d'un champ après recherche
    Bonjour
    Je suis coincé sur un problème de requête SQL, et je ne sais pas si je prends la bonne direction.
    Je m'explique : j'ai une table avec 3 champs => Id_Util - Utilisateur - MdP.

    Dans le textbox d'un formulaire, j'écris le nom d'un utilisateur, une première routine vérifie l'existance de cet utilisateur (ça, ça marche) mais j'aimerais sortir la valeur du champs MdP correspondant à mon utilisateur.
    J'ai essayé avec SELECT FROM, mais ça ne marche pas

    MErci pour votre aide pécieuse
    Stéphane

  2. #2
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select MdP from LaTable where Utilisateur = 'blablabla'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select MdP from LaTable where Id_Util = ..

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Oui c'est ce que j'ai tenté de faire. Mais cela ne marche pas
    Mon formulaire non lié à une table pocède 2 champs textbox : Utilisateur et MdP, un bouton OK et un autre ANNULER

    La table tbl_ComptesUtilisateur compte 3 champs décrits ci-dessus : Id_Util - Utilisateur - MdP.

    Je souhaite avoir la valeur du MdP de la ligne sélectionnée afin de la comparer au mot de passe écrit par l"utilisateur

    Ci dessous mon premier code qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub Bt_OK_Click()
    Dim strUtil As String
    Dim rs As Recordset
    Dim qdReq As QueryDef
    
    ' Nom du client
    strUtil = Me.Utilisateur
    ' Création de la requete
    Set qdReq = CurrentDb.CreateQueryDef("", "SELECT * FROM tbl_ComptesUtilisateur WHERE tbl_ComptesUtilisateur.Utilisateur LIKE '" & strUtil & "';")
    Set rs = qdReq.OpenRecordset
    ' L'utilisateur existe ?
    If rs.BOF And rs.EOF Then
    MsgBox "Utilisateur inconu", vbCritical, "Erreur"
    Exit Sub
    End If
    If IsNull(Me.Txt_MotDePasse) Then
        MsgBox "Tapez un mot de passe !", vbExclamation, "Erreur"
        Me.Txt_MotDePasse.SetFocus
        Exit Sub
    End If
    If Me.Txt_MotDePasse = ICI LA VALEUR TROUVE DANS LE CHAMPS MdP Then
        ' Fermer la boîte de dialogue "Identification"
        DoCmd.Close
        blnPasswordOK = True
    Else
        MsgBox "Mot de passe incorrect.", vbCritical, "Erreur"
        Me.Txt_MotDePasse.SetFocus
    End If
    End Sub
    Merci pour votre aide

  4. #4
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Dans ce cas, faites simplement une recherche sur les 2 valeurs pour voir si le couple user-pwd existe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from LaTable where Utilisateur = 'blabla' and MdP = 'xxxx'

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Bon sang !! je n'y arrive pas !

    ci-dessous mon code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Bt_OK_Click()
    Dim verif As Integer
    verif = "SELECT COUNT(*) FROM tbl_ComptesUtilisateur WHERE utilisateur =" & Me.txt_Utilisateur & "AND mdp =" & Me.Txt_MotDePasse
    If verif = 0 Then
    MsgBox "pas bon"
    Else
    MsgBox "ok"
    End If
    End Sub
    J'ai une erreur d'exécution '13' incompatibilité de type au niveau de la ligne 3

    Merci de votre réponse

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Un peut de recherche t'aurait donnée la réponse, car ce genre de problème revient 10 fois par jour :

    http://access.developpez.com/faq/ind...riteres#txtQry

    Suivant le type de champ il faut utiliser des simples quotes (texte), rien (numérique), dièse (date).

    Philippe

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Bonsoir Philippe
    J'ai fait des recherches mais surement pas avec les bons critères.

    Bon, cela ne marche toujours pas, j'ai fait le code ci-dessous, mais toujours erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Bt_OK_Click()
    Dim verif As Integer
    Dim util As String
    Dim MdP As String
     
    util = Me.txt_Utilisateur
    MdP = Me.Txt_MotDePasse
    verif = "SELECT COUNT(*) FROM tbl_ComptesUtilisateur WHERE utilisateur = '" & util & "'AND mdp = '" & MdP
    If verif = 0 Then
    MsgBox "pas bon"
    Else
    MsgBox "ok"
    End If
    End Sub

  8. #8
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Il manque encore des quotes !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    verif = "SELECT COUNT(*) FROM tbl_ComptesUtilisateur WHERE utilisateur = '" & util & "'AND mdp = '" & MdP &"'"
    Et aussi, faites attention à votre code, car si vous ne pensez pas à doubler les quotes à l'intérieur de vos variables "util" et "mdp", il sera vulnérable aux injections SQL !

    Par exemple, si vous entrez ' or 1=1-- comme nom d'utilisateur et n'importe quoi comme mot de passe, votre requête devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from tbl_ComptesUtilisateur WHERE utilisateur = '' or 1=1-- AND mdp = 'du blabla'
    et renverra le nombre d'utilisateurs de votre table et validera la connexion.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Bonsoir SLE et merci de ton aide
    Premierement : étant une débutant "connaissant", peux tu m'expliquer
    Et aussi, faites attention à votre code, car si vous ne pensez pas à doubler les quotes à l'intérieur de vos variables "util" et "mdp", il sera vulnérable aux injections SQL !
    J'avais déjà essayé cette solution mais cela ne fonctionne toujours pas
    mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Bt_OK_Click()
    Dim verif As Integer
    Dim util As String
    Dim MdP As String
     
    util = Me.txt_Utilisateur
    MdP = Me.Txt_MotDePasse
    verif = "SELECT COUNT(*) FROM tbl_ComptesUtilisateur WHERE utilisateur = '" & util & "'AND mdp = '" & MdP & "'"
    If verif = 0 Then
    MsgBox "pas bon"
    Else
    MsgBox "ok"
    End If
    End Sub

  10. #10
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    L'explication, la voilà
    Citation Envoyé par SLE Voir le message
    Par exemple, si vous entrez ' or 1=1-- comme nom d'utilisateur et n'importe quoi comme mot de passe, votre requête devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from tbl_ComptesUtilisateur WHERE utilisateur = '' or 1=1-- AND mdp = 'du blabla'
    et renverra le nombre d'utilisateurs de votre table et validera la connexion.
    Renseigne-toi sur les injections SQL. Tu trouveras plein d'articles avec google qui expliquent comment on peut altérer les requêtes SQL exécutées par un programme quand les zones de saisie ne sont pas bien protégées.
    Si tu tapes une ' dans une des zones de saisie, la requête est modifiée, et soit elle va planter parce qu'elle n'est plus syntaxiquement correcte, soit, si tu es face à quelqu'un de malveillant qui maîtrise le SQL, elle pourra faire d'autres choses à ton insu, et ça peut aller très loin !

    Dans ton code ci-dessus, tu affectes une reqûete (string) à ta variable verif, qui attend un integer, donc forcément ça peut pas fonctionner. Tu dois exécuter ta requête et affecter son résultat à ta variable.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Merci SLE de m'aider

    J'étais persuadé que le résultat de
    était un chiffre
    Mais en mettant ma variable "verif" en STRING => j'ai toujous la même erreur.

  12. #12
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Oui, le résultat est bien un chiffre >= 0, mais ici, tu affectes la requête, qui elle est une chaîne. => Types incompatibles
    Tu dois déclarer une variable de type string, qui va contenir la requête, puis exécuter cette requête, et ensuite récupérer son résultat dans la variable verif qui elle, est de type integer !
    Dans ton code, il manque la partie la plus importante, où tu exécutes la requête !

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    bon, j'avance!
    l'erreur change de ligne
    Pourriez vous de dire ce que revoie la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    verif = "SELECT COUNT(*) FROM tbl_ComptesUtilisateur WHERE utilisateur = '" & util & "'AND mdp = '" & MdP & "'"

    Quel sont les résultats de ma variable "verif"

    je teste avec 0 et "" : c'est pas la solution

    je bloque...

  14. #14
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Va voir ici (vers la fin, dans Using a SQL string to open a Recordset)

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Encore merci de ta réponse.
    J'avance et commence à comprendre le problème entre la requête SQL et son exécution.
    J'ai fait le nouveau code ci-dessous, plus d'erreur mais mon comptage d'enregistrement reste à 1 même si le MdP n'est pas le bon est donc le comptage devrait être à 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Bt_OK_Click()
    Dim str_verif As String
    Dim verif As Recordset
    Dim util As String
    Dim MdP As String
     
    util = Me.txt_Utilisateur
    MdP = Me.Txt_MotDePasse
    str_verif = "SELECT COUNT(*) FROM tbl_ComptesUtilisateur WHERE utilisateur = '" & util & "'AND mdp = '" & MdP & "'"
     
    Set db = CurrentDb()
    Set verif = db.OpenRecordset(str_verif)
     
    If verif.RecordCount = 0 Then
    MsgBox "pas bon"
    Else
    MsgBox "ok"
    End If
    End Sub
    Stéphane

  16. #16
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    C'est encore normal.
    Tu ne dois pas vérifier le RecordCount, qui sera toujours 1 dans ce cas (un "select count(*)" renvoit toujours un enregistrement) mais regarder ce qu'il y a comme valeur dans la première (et unique) colonne de ton premier (et unique) enregistrement.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Ouf, ça marche

    Merci SLE pour ton aide
    Ci-fessous pour partage le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub Bt_OK_Click()
    Dim str_verif As String
    Dim verif As Recordset
    Dim Comptage As Integer
    Dim util As String
    Dim MdP As String
     
    util = Me.txt_Utilisateur
    MdP = Me.Txt_MotDePasse
    str_verif = "SELECT COUNT(*) FROM tbl_ComptesUtilisateur WHERE utilisateur = '" & util & "'AND mdp = '" & MdP & "'"
     
    'Set db = CurrentDb()
    Set verif = CurrentDb.OpenRecordset(str_verif)
     
    If verif.Fields(0).Value = 0 Then
    MsgBox "pas bon"
    Else
    MsgBox "ok"
    End If
    verif.Close: Set verif = Nothing
    End Sub

  18. #18
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Super, mais attention que ton code est toujours vulnérable aux injections SQL et qu'il est très facile de le contourner.

    Essaie de mettre ' or 1=1-- dans ton TextBox "Utilisateur" et ce que tu veux comme mot de passe, et tu verras que ça sera validé !

    Essaie aussi de mettre un nom d'utilisateur qui contient une apostrophe, et là tu verras que ça plante...

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    Alaors là, je ne comprends pas du tout ce que tu veux dire dans les injonctions SQL
    Dans ma base, j'ai un autre code qui vérifie que le login existe bien dans la table avant que le focus passe sur le mot de passe.
    Quand je tape ' or 1=1-- ça me met une erreur d'exécution '3075' Erreur de syntaxe dans la chaine dans l'expression
    tbl_ComptesUtilisateur.Utilisateur LIKE" or 1=1--

    Ci-dessous le code qui renvoie l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub txt_Utilisateur_LostFocus()
    Dim strUtil As String
    Dim rs As Recordset
    Dim qdReq As QueryDef
    ' Nom du client
    strUtil = Me.txt_Utilisateur
    ' Création de la requete
    Set qdReq = CurrentDb.CreateQueryDef("", "SELECT * FROM tbl_ComptesUtilisateur WHERE tbl_ComptesUtilisateur.Utilisateur LIKE '" & strUtil & "'")
    Set rs = qdReq.OpenRecordset
    ' L'utilisateur existe ?
    If rs.BOF And rs.EOF Then
    MsgBox "Utilisateur inconu", vbCritical, "Erreur"
    Exit Sub

  20. #20
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    OK. Je ne suis pas un spécialiste de MS-Access, mais il semblerait que les caractères standards SQL pour un commentaire "--" ne soient pas valides avec.

    Néanmoins, les injections restent possibles via d'autres méthodes, et le fait de mettre un quote dans la zone de texte va quand-même planter l'appli.

    par exemple :

    ' or 1=1 or utilisateur = '

    comme utilisateur devrait être valide car la requete deviendrait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM tbl_ComptesUtilisateur WHERE tbl_ComptesUtilisateur.Utilisateur LIKE '' or 1=1 or utilisateur = ''
    => Il faut doubler les quotes provenant des zones de saisie pour que la requête initiale reste formatée correctement.

    Je veux simplement par là te sensibiliser aux failles de sécurité habituelles.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/07/2013, 14h08
  2. [MySQL] Récupérer la valeur d'un champ d'une table juste après l'avoir inséré
    Par bodysplash007 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/05/2007, 22h24
  3. Réponses: 1
    Dernier message: 22/02/2005, 23h40
  4. Récupérer la valeur d'un champ disabled
    Par nebule dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/01/2005, 10h45
  5. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo