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 :

Problème avec ResultSet et la communication avec la base


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2021
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Problème avec ResultSet et la communication avec la base
    Bonsoir,
    Je développe une application de gestion pour mon PFE.
    Au niveau de l'interface de connexion et après la requête, j'ai un problème ou niveau de la boucle if qui gère l'authentification en décidant qu'il s'agit d'un Admin, Ingénieur ou autres. La base de donnée fonctionne correctement, je l'ai testé avec les autres interfaces de l'application.
    Pouvez-vous m'aider SVP? Merci.
    Voici 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
    22
    23
    24
    25
     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                String url = "jdbc:odbc:gmi";
                Connection con = DriverManager.getConnection(url, "", "");
                Statement creerconnec = con.createStatement();
                String sql = "select * from compte_utilisateur where login = '" + jTextField1.getText() + "' and password ='" + jTextField2.getText() + "';";
                ResultSet RS = creerconnec.executeQuery(sql);
     
                while (RS.next()) {
                    if (RS.getString("login").equals(jTextField1.getText()) && RS.getString("password").equals(jTextField2.getText())) 
                    {
                            if (RS.getString("fonction").equals("Administrateur")) {
                                interface_menu i_m = new interface_menu();
                                i_m.setVisible(true);
                            } else if (RS.getString("fonction").equals("Ingenieur")) {
                                interface_menu_Ingénieur i_m = new interface_menu_Ingénieur();
                                i_m.setVisible(true);
                            } else {
                                interface_menu_technicien i_m = new interface_menu_technicien();
                                i_m.setVisible(true);
                            }
                    }
                }
     
                con.close();

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Aider. A quoi ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Il n'y a rien qui va dans ce code!

    Pour commencer, en Java, il y a des conventions de nommage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    interface_menu i_m = new interface_menu();
    Doit être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     InterfaceMenu im = new InterfaceMenu();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    interface_menu_Ingénieur i_m = new interface_menu_Ingénieur();
    Doit être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InterfaceMenuIngénieur im = new InterfaceMenuIngénieur();
    En java, les classes (et interface...) commencent par des majuscules et les variables par des minuscule. Par ailleurs, quand on change de mot, on met une majuscule (et non une minuscule). De plus, on évite les accents comme "é"'.

    Toujours pour ce code, il serait bien d'utiliser le polymorphisme, on aurait le Design Pattern Factory ( https://fr.wikipedia.org/wiki/Fabriq...de_conception) ).

    Comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface MenuInterface{
      //Des trucs
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class MenuBase implements MenuInterface{
      //Des trucs
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class MenuIngenieur implements MenuInterface{
      //Des trucs
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class MenuTechnicien implements MenuInterface{
      //Des trucs
    }
    La fin code deviendrait:
    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
     
    Optional<MenuInterface> oMenu = Optional.empty()
    while (rs.next()) {
                    if (rs.getString("login").equals(jTextField1.getText()) && rs.getString("password").equals(jTextField2.getText())) 
                    {
                            if (rs.getString("fonction").equals("Administrateur")) {
                                oMenu = Optional.of(new MenuBase());
                            } else if (rs.getString("fonction").equals("Ingenieur")) {
                                oMenu = Optional.of(new MenuIngenieur());
                            } else {
                                interface_menu_technicien i_m = new interface_menu_technicien();
                                oMenu = Optional.of(new MenuTechnicien());
                            }
                    }
                }
                if(oMenu.isPresent()){
                   oMenu.get().setVisible(true);
                }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultSet RS = creerconnec.executeQuery(sql);
    Non, non et non.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultSet rs = creerconnec.executeQuery(sql);
    Convention Java. Les majuscules, c'est pour les classe.

    Bon, on va maintenant aborder ce qui est vraiment problématique et choquant!

    La requête SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String sql = "select * from compte_utilisateur where login = '" + jTextField1.getText() + "' and password ='" + jTextField2.getText() + "';";
    Ça, c'est vraiment non.
    Si on a comme texte de login:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Delete FROM COMMANDE;
    C'est la cata, on a une injection SQL. C'est pour ça qu'il faut utiliser des PreparedStatement ( https://java.developpez.com/faq/jdbc...paredStatement ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String sql = "select * from compte_utilisateur where login =? and password ?;";
    PreparedStatement creerconnec = con.prepareStatement()
    creerconnec.setString(1,jTextField1.getText());
    creerconnec.setString(2,jTextField2.getText());
    ResultSet rs = creerconnec.executeQuery(sql);
    A noter qu'il faudrait refaire la requête SQL pour ne remonter que ce qui est intéressant (ici la fonction):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select fonction from compte_utilisateur where login =? and password ?;
    si aucun utilisateur ne correspond au couple login/password, le resultset sera vide.

    Séparation des rôle (SOLID)
    La fin correspond à SOLID ( https://fr.wikipedia.org/wiki/SOLID_(informatique) )
    Ton code fait trop de chose, car il mélange des composants interfaces (JText...) et de BDD.
    Or, il faut séparer.

    Ton code doit être une méthode de login, qui donnerait le rôle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Optional<String> getRole(String login,String password){
     //Ton code
    }
    Ou mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Optional<User> getUser(String login, String password){
     //Ton code
    }
    Et une fois qu'on a l'utilisateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MenuInterface getMenu(User user){
      //Ton code
    }

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    J'ai aussi oublié de préciser que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (rs.getString("login").equals(jTextField1.getText()) && rs.getString("password").equals(jTextField2.getText()))
    Ne sert à rien, vu que par la requête SQL, ce qui est ramené sera toujours vrai.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Il y a aussi l'usage d'un pont odbc jdbc qui est douteux.
    Quelle est la base de données cible ? Il n'existe pas de driver JDBC pour elle ? Si oui, mieux vaut l'utiliser.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème avec My Base XML
    Par Georges P dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/01/2007, 10h39
  2. Réponses: 8
    Dernier message: 11/10/2006, 17h28
  3. [VB]Problème avec les bases de données
    Par boudincweole10 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 22/04/2006, 20h24
  4. problème avec ma base de donnée
    Par polace dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 22/10/2005, 22h26
  5. problème avec ma base de données
    Par pmboutteau dans le forum ASP
    Réponses: 6
    Dernier message: 25/02/2005, 12h59

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