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

JDBC Java Discussion :

Erreur de requête


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut Erreur de requête
    Bonjour tousss
    J'avais un probleme dans ma fonction aurhentif, qui prends 2 parametres (login, password), je connecte à la base de données chateurs, et vérifie si ces parametres passés sont vrais ou pas. La requete ne s'exécute pas
    Sachant que si je change ma requete, (select * from chateurs) et je faits l'affichage dans Main, ça se connecte et fonctionne, dans le probleme au niveau de la requte
    Voici mon 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    import java.sql.*;
     
    public class Authentif {
    	public static int Authentif(String login1, String passwd1) {
    		Connection c = null;
    		int a = 10;
    		PreparedStatement ps = null;
    		ResultSet res = null;
    		try {
     
    	String query = ("select * from chateurs where login="+login1+" and password="+passwd1+";");						Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    	c = DriverManager.getConnection("jdbc:Odbc:EtudiantDB");
     
    			ps = c.prepareStatement(query);
    			res = ps.executeQuery();
     
     
    		}  catch (ClassNotFoundException e) {
    			e.getStackTrace();
    		}
    		catch (SQLException e) {
    			e.getStackTrace();
    		}
     
    		if (res == null)
    			a = 1;
    		else
    			a = 0;
    		return a;
    	}
     
    	public static void main(String[] args) {
    		String login = "user1";
    		String password = "user1";
    		System.out.println(Authentif(login, password));
     
    	}
     
    }

  2. #2
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Il faut donner plus de détails pour que quelqu'un puisse t'aider .

    Comment tu as su que ta requête ne s'éxécute pas : il ya une exception ou un comportement qui ne correspond pas à ton besoin ??

  3. #3
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Merci frere Nizar
    Bon,comme je vais ai dits, quands je change la requete en: String query= ("select * from chateurs"); ça fonctionne.
    Mais quand je la rends:String query = ("select * from chateurs where login="+login1+" and password="+passwd1+";"); ça fonctionne pas.
    Aussi j'ai ajoutés des println, devant quaque ligne. le println qui est juste aprés: res = ps.executeQuery(); ne s'affiche pas
    j'espere que c clair.

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Ta requête finale ne contient-elle pas une erreur de syntaxe ? Les ';' multiples dans la requêtes me paraissent suspects (bien que je ne sois pas un spécialiste du SQL). De plus, j'aurais rajouté des "quotes" autour de tes champs login et password :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM chateurs WHERE login='"+login1+"' and password='"+passwd1+"';")
    Mieux encore, avec la classe PreparedStatement, utilise les requêtes paramétrées : c'est plus propre, et java gérera pour toi les problèmes de quotes (et de caractères spéciaux) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM chateurs WHERE login= ? and password= ?"

  5. #5
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Merci Ferere Modérateur
    Je vais essayer avec les PreparedStatement, et si vous permetter svp de me donner la squelette généralle en bref.

  6. #6
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    voila, je l'ai faits comme vous avez dits, avec les PreparedStatement
    et c la meme chose:
    Il me rends tjrs 0 comme retour !!!
    package Authentif;
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    import java.sql.*;
     
    public class Authentif2 {
        public static int Authentif(String login1, String passwd1) {
            Connection c = null;
            int a = 10;
            PreparedStatement ps = null;
            ResultSet res = null;
            String query = "select * from chateurs where login=? and password=?";
            try {
     
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                c = DriverManager.getConnection("jdbc:Odbc:EtudiantDB");
                PreparedStatement pr = c.prepareStatement(query);
     
     
                ps = c.prepareStatement(query);
                ps.setString(1, login1);
                ps.setString(2, passwd1);
                res = ps.executeQuery();
     
     
            } catch (ClassNotFoundException e) {
                e.getStackTrace();
            } catch (SQLException e) {
                e.getStackTrace();
            }
     
            if (res == null)
                a = 1;
            else
                a = 0;
            return a;
        }
     
        public static void main(String[] args) {
            String login = "user1";
            String password = "user1";
            System.out.println(Authentif(login, password));
     
        }
     
    }

  7. #7
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Voilà ce que tu as mis dans ton dernier post
    if (res == null)
    a = 1;
    else
    a = 0;
    return a;
    }
    C'est normal qu'il te retourne 0 puisque res n'est pas null .

    En plus, si ce que tu veux faire c'est qu'il te retourne 0 si le resultset est vide et 1 sinon , je crois que ce qu'il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(res.next()) return 1
    else return 0;

  8. #8
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    oui, je suis d'accords avec toi
    Mais ou mettre cet instruction la?
    - Si je la met dans le try{}, la fonction ne voit pas le "a" ,le compilateur me dit qu'il faut un retour pour cette fonction,
    et si je la mets hors try{}, res.next() va générer une exception, donc je suis obligé de la mettre dans le try{}.
    ........... je suis vrmt bloqué

  9. #9
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    il suffit de mettre des return 0 dans chaque bloc catch{} après les e.printstacktrace()...

  10. #10
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Merci ami pour ta suivie
    mais je pense que m'avais pas compris
    Je veux pas retourner 0 en fin de compte, je veux retourner ou bien 0( si la requete à du retour) ou bien1 (si ya pas de retour).
    Car cette fonction je vais l'appeler dans le main, avec deux parametres
    et tester son retour.
    j'espere que tu m'a compris.
    Ou bien c moi qui t'a pas compris?
    Si c le cas ecrit moi sur le code stpp

  11. #11
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    tu as dit :
    Si je la met dans le try{}, la fonction ne voit pas le "a" ,le compilateur me dit qu'il faut un retour pour cette fonction,
    je t'ai dit mets le dans le try{} et pour résoudre le problème

    le compilateur me dit qu'il faut un retour pour cette fonction
    il faut mettre des return 0 ou return -1 par exemple dans tous les catch comme ça le compilateur ne te sortira plus cette erreur. ET dans ce cas s'il ya une exception il te retournera 0 (ou -1 si tu veux )

    Donc pour résumer , le comportement de ta classe sera comme ceci :

    Si pas d'exception et le resultset est vide il te retourne 0

    si pas d'exception et le resultset n'est pas vide , il retourne 1.

    JE crois que tu dois te documenter plus sur le langage java et tout ce qui concerne les connexions aux bases de données comme ça tu seras plus à l'aise pour faire tes programmes

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NizarK Voir le message
    JE crois que tu dois te documenter plus sur le langage java et tout ce qui concerne les connexions aux bases de données comme ça tu seras plus à l'aise pour faire tes programmes
    Pareil pour moi... et si tu pouvais utiliser la balise [ code ] (bouton # dans l'éditeur) pour mettre tes portions de code, ce serait bien également...

    A+

  13. #13
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    re salutttt
    je vous remerciiiii
    c bien résoluuuuu
    Aussi j'avais une petite erreur sur ce code au niveau de la requete et je l'ai corrigé comme suit:
    String query = "select * from chateurs where login='"+login1+"' and password='"+passwd1+"'";

  14. #14
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Oui ça me rapelle quelque chose :

    Regarde ICI : Plus haut dans cette discussion

    Enfin, l'important est que tu aies résolu ton problème

    N'oublies pas d'appuyer sur le bouton

  15. #15
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonjour

    d'abord il faut que tu verifes si "login" et "password" sont ecrites ainsi sur ta base de données
    puis enleve les parentheses tu met String query ="directemnt ta requete";

    si ca ne marche pas tu verifie l'emplacement de tes cotes

    essayes ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String query="select * from chateurs where login="+login1+" and password="+passwd1;
    bonne chance

  16. #16
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    ah d'accord
    felicitation aors

  17. #17
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Points : 4 792
    Points
    4 792
    Par défaut à vérifier aussi ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "select * from chateurs where login='"+login1+"' and password='"+passwd1+"'";
    Cette syntaxe ne fonctionne que si login1 et passwd1 ne comporte pas d'apostrophe.

    Exemples :

    1) login1 = "Arthur", passwd1 = "secret" ....... ça marche

    2) login1 = "Hubert d'Aubagne", passwd1 = "m'enfin" ....... ça plante

    Solutions :
    - soit interdire la création d'utilisateur avec apostrophe
    - soit doubler les apostrophes avec une instruction du type : login1 = login1.replaceAll("'","''") avant d'exécuter la requête (à vérifier en fonction du type de base de données).

  18. #18
    Membre du Club
    Inscrit en
    Février 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Merci mesbzineb
    (biensur que les 2 champs login et password se trouvet dans ma base de donnée)
    Merci Népomucene pour ce truc d'appostrophe

    Merci à toussssssssss
    Que dieu vous bénisse

  19. #19
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Solutions :
    - soit interdire la création d'utilisateur avec apostrophe
    - soit doubler les apostrophes avec une instruction du type : login1 = login1.replaceAll("'","''") avant d'exécuter la requête (à vérifier en fonction du type de base de données).
    Ou encore (ce que je conseillais dans un précédent post), utiliser les requêtes paramétrées de la classe PreparedStatement. Elles ont le bon goût de gérer les apostrophes et autres caractères spéciaux dans les chaînes de caractère, et ce indépendemment de la base de données !

Discussions similaires

  1. [MySQL] Erreur de requête
    Par Sebe dans le forum PHP & Base de données
    Réponses: 45
    Dernier message: 08/02/2006, 14h09
  2. [PHP MySQL] Erreur execution requête de type INSERT
    Par Pfeffer dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/01/2006, 17h38
  3. [Debutant]Erreur Récurent - Requête
    Par ghan77 dans le forum Bases de données
    Réponses: 19
    Dernier message: 10/01/2006, 13h09
  4. erreur exécution requête
    Par MANU_2 dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/10/2005, 07h27
  5. Erreur de requête :-(
    Par pekka77 dans le forum ASP
    Réponses: 2
    Dernier message: 28/06/2005, 13h53

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