Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/10/2011, 15h46   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 15h52   #2
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Code :
select MdP from LaTable where Utilisateur = 'blablabla'
ou
Code :
select MdP from LaTable where Id_Util = ..
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 16h11   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
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 :
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 16h16   #4
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Dans ce cas, faites simplement une recherche sur les 2 valeurs pour voir si le couple user-pwd existe
Code :
select count(*) from LaTable where Utilisateur = 'blabla' and MdP = 'xxxx'
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 20h10   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
Bon sang !! je n'y arrive pas !

ci-dessous mon code de test :
Code :
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 20h40   #6
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 620
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 620
Points : 30 943
Points : 30 943
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
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
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 20h56   #7
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
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 :
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 21h49   #8
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Il manque encore des quotes !

Code :
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 :
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.
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 21h58   #9
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
Bonsoir SLE et merci de ton aide
Premierement : étant une débutant "connaissant", peux tu m'expliquer
Citation:
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 :
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 22h21   #10
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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 :
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.
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 22h40   #11
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
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.
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 22h48   #12
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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 !
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 22h49   #13
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
bon, j'avance!
l'erreur change de ligne
Pourriez vous de dire ce que revoie la requête suivante
Code :
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...
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 23h59   #14
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Va voir ici (vers la fin, dans Using a SQL string to open a Recordset)
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 09h13   #15
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
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 :
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 09h20   #16
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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.
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 11h23   #17
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
Ouf, ça marche

Merci SLE pour ton aide
Ci-fessous pour partage le code :
Code :
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 11h28   #18
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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...
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 11h49   #19
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 43

Informations forums :
Inscription : juin 2007
Messages : 70
Points : 12
Points : 12
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 :
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
stefane26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 13h19   #20
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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 :
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.
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h10.


 
 
 
 
Partenaires

Hébergement Web