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 :

Récuperer en java le résultat d'une requete SQL


Sujet :

JDBC Java

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut Récuperer en java le résultat d'une requete SQL
    Bonjour,

    Je possede une table formée de 2 colonnes: "Login" et "mot de passe". Alors dans mon programme java je vais exécuter la requête SQL suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String req="SELECT * FROM user WHERE ("login ="+log+"and password ="+pw+");";
    rs = stmt.executeQuery(req);
    Comment je peux déterminer qu'il y a une valeur ou pas dans ma table (c'est a dire est ce qu'il y a une fonction en java qui permet de retourner un entier par exemple pour indiquer si cette "login et password" existe ou pas dans ma table?

    J'espère que c'est claire et j'espère que vous pouvez m'aider.
    Merci d'avance.

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    boolean exist = false;
    while(rs.next){
        exist = true;
    }
    Mais il y a plus simple que ça je pense

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Mais il y a plus simple que ça je pense
    Oui c'est ce que je cherche car j'ai pensé en ce que vous avez me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    boolean exist = false;
    while(rs.next){
        exist = true;
    }
    Merci.

  4. #4
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    boolean exist = true;
    if(rs.isAfterLast()){
        exist = false;
    }
    Mais ça revient un peu près au même au niveau du nombre de lignes

  5. #5
    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
    Billets dans le blog
    1
    Par défaut
    La solution la plus simple est (si tu n'as pas besoin des données)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PreparedStatement pstmt = connection.prepareStatement("select login from user where login=? and password=?");
    pstmt.setString(1, unLogin);
    pstmt.setString(2, unPassword);
    ResultSet rs = pstmt.executeQuery();
    boolean exist = rs.next();
    J'ai mis la solution complète avec un PreparedStatement parce qu'il faut éviter au maximum les requêtes du type de celle que tu montres (surtout pour une authentification !), il y a un gros risque d'injection .

    Je ne vois pas l'intérêt de faire une boucle while dans ce cas puisqu'il serait très surprenant d'avoir plusieurs utilisateurs avec le même login (bug fonctionnel)

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Voila j'ai essayer d'utiliser votre code, mais j'ai pas obtenu de résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String req="SELECT * FROM user WHERE ( login ="+log+"and password ="+pw+");";
    PreparedStatement pstmt = connection.prepareStatement(req);
    pstmt.setString(1, log);
    pstmt.setString(2, pw);
    ResultSet rs = pstmt.executeQuery();
    boolean exist = rs.next();return exist;
    S'il vous plait expliquez mieux le code que vous avez mis.

    Merci.

  7. #7
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Quand tu utilise un ResulSet :
    imaginons qu'il y ai 3 éléments dedans

    |1|2|3| ça faira comme un tableau, et tu as un pointeur qui bouge dans ce tableau

    Quand tu fait .next(); tu vas à la case suivante...
    Au départ tu te situe dans la case "0", celle juste avant la premiere. (beforeFirst). quand tu fais rs.next() il te renvoie un boolean true si il y a un suivant. L'élément qui suis le beforeFirst est le First (le premier). En bon français, rs.next()= Y a t il un premier élément??

  8. #8
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Citation Envoyé par ysahel Voir le message
    S'il vous plait expliquez mieux le code que vous avez mis.
    Je pense qu'avec ça tu devrais avoir les explications nécessaires :
    Les instructions paramétrées - PreparedStatement

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Par défaut
    Il y a un autre point qui ne va pas dans ton code, c'est le passage des paramètres au PreparedStatment. Tu écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1    String req="SELECT * FROM user WHERE ( login ="+log+"and password ="+pw+");";
    2    PreparedStatement pstmt = connection.prepareStatement(req);
    3    pstmt.setString(1, log);
    4    pstmt.setString(2, pw);
    Lors des instructions 3 et 4, tu essayes de donner à des variables de ton PreparedStament les valeurs des données log et pw respectivement. Or ces variables n'existent pas puisque ta requête ne les défini pas. En fait, ta requête devrait être formée de la manière suivante:

    "SELECT * FROM user WHERE login = :1 AND password = :2"

    (je ne suis plus 100% certain de la syntaxe de déclaration des variables, c'est peut être des ? au lieu des :index mais la Javadoc te permettra de vérifier ça sans problème). Sans ça, l'utilisation du PreparedStatment est quasiment inutile et risque même de pas mal surcharger le serveur base de données car celui-ci va conserver des requêtes précompilées pour chaque combinaison de (login, password) qui lui est envoyée.

    Ensuite, il y a de manière latente un problème dans ce que tu envois car, comme toutes les ressources, celles qui permettent de manipuler une base de données doivent être libérées.

    Si tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String req="SELECT * FROM user WHERE ( login ="+log+"and password ="+pw+");";
    PreparedStatement pstmt = connection.prepareStatement(req);
    pstmt.setString(1, log);
    pstmt.setString(2, pw);
    ResultSet rs = pstmt.executeQuery();
    boolean exist = rs.next();
    return exist;
    Ton ResultSet et ton PreparedStatment ne sont pas fermés. Pour le ResultSet, c'est simple, il suffit d'ajouter un rs.close() avant de quitter la méthode de validation de la connexion. Pour le Statment, c'est autre chose parce que tout l'intérêt est justement de le conserver temps qu'il peut être utilisé. Il faut peut être alors le créer ailleurs que dans la méthode de validation et il faut ensuite déterminer le bon moment pour le libérer.

Discussions similaires

  1. Recharger une JTable avec le résultat d'une requete sql
    Par Premium dans le forum Composants
    Réponses: 2
    Dernier message: 06/06/2007, 15h19
  2. [SQL] Résultat d'une requete SQL en 2 colonnes
    Par apt dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/02/2007, 02h24
  3. Réponses: 2
    Dernier message: 03/09/2006, 11h02
  4. Résultat d'une requete SQL vers Excel
    Par climz dans le forum Access
    Réponses: 6
    Dernier message: 09/05/2006, 15h44
  5. résultat d'une requete SQL dans un tableau en JSP
    Par Paradoxys dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 06/04/2005, 16h17

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