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

Java Discussion :

Récupérer élément de base de données


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Par défaut Récupérer élément de base de données
    Bonjour,

    J ' ai un projet Chat java a concevoir et je bloque sur un petit point.
    Je dois faire en sorte que seul les users qui disposent d ' un login inscrit dans la BD puissent se connecter.
    J ' essaie donc de comparer le login inscrit dans la BD ainsi que de mon TextField, mais je n ' y arrive pas.

    Aidez moi svp


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public String comparerLogin(String LoginRecup)
    	{
     
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    				 System.out.println("pb Driver");
    			}
     
    	//Etape 2 : récupérer état de connexion
    	   try {
    		   cn = (Connection) DriverManager.getConnection(url, login, password);
    			} catch (Exception e) {
    				e.printStackTrace();
    				 System.out.println("pb Connexion");
    			}
    	//Etape 3 : création d'une nouveau canal de communication
    		try {		
    			st = (Statement) cn.createStatement();
    			} catch (Exception e) {
    				e.printStackTrace();
    				System.out.println("pb Statement");
    			}
    			try {
    				ResultSet resultaltLogin=st.executeQuery("Select login from User");
    				while(resultaltLogin.next())
    				{
    					LoginRecup=resultaltLogin.getString("login");
    					System.out.println(LoginRecup);
    				}
     
     
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
     
    			if(saisieLogin.getText().equals(LoginRecup)==true);
    				{
     
    					System.out.println("User connecte" + LoginRecup);
    					labLogin.setText(" identifiant reconnu");
     
     
     
    				}
                                  else
    {
    labLogin.setText(" identifiant non existant dans la BD");
    }

  2. #2
    Membre chevronné
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Par défaut
    Bonjour,

    Comment récupérez-vous le login ?
    En gros, pouvez-vous montrer le code appelant de la méthode "comparerLogin" ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Par défaut
    Bonjour

    Merci de votre réponse rapide.
    C ' est gentil de prendre de votre temps pour m' aider.

    Etant donné que c ' est un chat client-serveur, je dois passer le login dans de nombreuses classes pour des traitements associés.

    Mon evenement sur l action du bouton qui envoi le login est defini ainsi

    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
    public ecouteur(int i,LoginServeur log){
    			code=i;
    			this.log=log;
    		}
    			public void actionPerformed(ActionEvent e){
    				String s;
    				switch(code){
    				case 2:
    					comparerLogin(saisieLogin.getText());
    					System.out.println(" USER ENREGISTRE "+comparerLogin(saisieLogin.getText()));
    				log.setVisible(false);
    				s=log.recuplogin();
    				fene.envoielogin(s);
    				//
    				break;
    				case 3: System.exit(0);
    				break;
     
     
    				}
    la fonction recuplogin() situe dans la meme classe(LoginServeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public String recuplogin(){
    		String s;
    		s=saisieLogin.getText();
    		this.setVisible(false);
    		return s;
     
     
    	}
    la fonction envoilogin de la classe fenetre(instance fene dans mon evenement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void envoielogin(String s){
    		ch.envoielogin(s);//instance de chat
     
    	}
    et enfin la fonction envoilogin de ma classe chat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void envoielogin(String s){ // envoi le pseudo
    		out.println("USER "+s);
    	}
    meri beaucoup de votre aide

  4. #4
    Membre chevronné
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Par défaut
    Lorsque vous mettez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(saisieLogin.getText().equals(LoginRecup)==true);
    LoginRecup est le paramètre de la méthode comparerLogin
    et vous appelez cette dernière ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comparerLogin(saisieLogin.getText());
    Autrement dit vous faîtes ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(saisieLogin.getText().equals(saisieLogin.getText())==true);
    C'est toujours vrai non ?

    Remarques de codage :
    1 - en général, il vaut mieux éviter de mettre une majuscule comme première lettre d'un nom de variable (LoginRecup), ceci est plutôt réservé au nom des classes
    2 - dans le test précédemment cité, la partie "==true" est inutile, il suffit de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(saisieLogin.getText().equals(LoginRecup))

  5. #5
    Membre confirmé Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Par défaut
    Salut, peux t on avoir les traces intermédiaires de log/console générées ? "je n'y arrive pas" cela englobe quelle(s) partie(s) qui fonctionne(nt) et jusqu'où, ainsi que celle(s) qui ne fonctionne(nt) pas et qui le devrai(en)t ? suis je clair

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    La méthode que tu utilises n'est pas top. Si tu imagines un chat avec des millions d'utilisateurs, ta fonction va tous les recuperer (ce qui n'est pas terrible niveau sécurité) et comparer avec ton login. Le plus simple, c'est de faire une requete dans le genre :
    "SELECT COUNT(*) FROM UTILSATEURS WHERE LOGIN = '"+str_login+"'".

    Si ca revoit 0, c'est pas bon. Si ca revoit 1, c'est bon.

    Attention : Pour eviter une insertion SQL, il ne faut pas oublier de verifier les caracteres contenus dans str_login...


    Sinon, si tu continues dans la voie que tu as choisi, ton algo n'est pas bon. Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ResultSet resultaltLogin=st.executeQuery("Select login from User");
    while(resultaltLogin.next())
    {
       LoginRecup=resultaltLogin.getString("login");
       System.out.println(LoginRecup);
    }
    Ce qui va lire tous les login mais pas les garder. A la fin, LoginRecup contiendra le dernier login de la base et toujours celui la. Si c'est un autre utilisateur, enregistré ou non, il ne sera pas reconnu.

    Au passage, une petite lecture de cours java ne serait pas superflue au vu du code parce qu'il y a pas mal de bases qui ne sont pas respectées, en particulier si c'est un devoir scolaire...

    a+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Par défaut
    Bonjour,

    Tout d ' abord un grand merci a vous 3, j ' y vois plus clair ainsi.
    Je vais tacher de répondre du mieux que je peut.

    jcdentons:
    en effet , le ==true est inutile, mais ca ne change pas grand chose.
    Je pensais ma fonctions ainsi:
    -Connexion a la base
    -Requete qui vise a recuperer tout les users et les stocker
    -comparaison entre le nom saisi dans le TextField et ceux trouve dans la base
    - autorise l user a se si il trouve le meme nom
    -refuse tous les autres
    Merci aussi pour vos conseils de conventions de nommage , je tacherai de les respecter a l ' avenir.

    r2d2abc

    En fait , je n ' ai aucune erreur généré car a la base mon chat est prévu pour fonctionner sans base de donnée.
    Cependant , malgré l implantation de celle ci dans mon code , elle prend en compte tous les user voulant se connecter alors que je désire autoriser l ' acces uniquement a ceux present dans la BD.

    hwoarang

    Grand merci pour tes conseils car c ' est exactement ca, je ne récupère que le dernier user de ma BD.
    Mon algo est en effet mal pensé comme tu dis car il récupère bien tous les user, mais je ne sais pas comment faire en sorte qu ' il ne récupère que celui dont on a besoin en le comparant avec le textField.
    Désolé d' etre aussi confus , mais on a etudie il y a seulement 2 jours l ' API SQL , et j ' avoue ne pas tout comprendre .
    On a eu droit directement a un projet Chat client/serveur java qui est de grande envergure...
    Merci pour tes conseils.
    J ' aimerai aussi que tu me dises ou mes bases font défaut car c ' est comme ca que je vais progresser( je ne repère pas tout du premier coup^^)
    Ca me permettra d ' éviter de refaire ces erreurs.

    Merci pour votre aide

  8. #8
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par ulquiorra Voir le message
    Mon algo est en effet mal pensé comme tu dis car il récupère bien tous les user, mais je ne sais pas comment faire en sorte qu ' il ne récupère que celui dont on a besoin en le comparant avec le textField.
    Le plus simple est, comme dit plus haut, de recupérer la valeur de ton champ et de demander à SQL Server de te renvoyer le nombre de login. En gros, ca donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ResultSet resultaltLogin=st.executeQuery("Select login from User where login = " + saisieLogin.getText());
    if(resultaltLogin.next)
    {
    //On a trouve
    }
    else
    {
    //c'est pas bon
    }
    Par contre, il faudra adapter ton textfield pour eviter que l'utilisateur entre des caracteres speciaux qui vont poser probleme (par exemple hacker le programme avec une insertion SQL).

    Citation Envoyé par ulquiorra Voir le message
    J ' aimerai aussi que tu me dises ou mes bases font défaut car c ' est comme ca que je vais progresser( je ne repère pas tout du premier coup^^)
    Ca me permettra d ' éviter de refaire ces erreurs.
    Bah par exemple les objets sont passés à une fonction par copie de pointeur. Un programme vaut mieux qu'un logn discours alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void ff(String str)
    {
       str = "2";
    }
    public void init()
    {
       String str = "1";
       ff(str);
       System.out.println(str);
    }
    Si tu executes ce programme, tu verras affiché : "1"

    Et tu as le meme probleme dans la fonction comparerLogin(String LoginRecup) qui modifie son parametre :
    LoginRecup=resultaltLogin.getString("login");

    C'est pour ca que je te conseillerais de lire un cours (il y en a plein sur le net). Ce n'est pas sur un forum que tu pourras tout comprendre.
    C'est un peu comme si je disais que je ne sais pas conduire mais j'aimerais faire Paris/Marseille en voiture et que je demandais sur un forum comment conduire. On pourrait m'expliquer pas mal de choses mais il manquera toujours des infos...

    a+

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ResultSet resultaltLogin=st.executeQuery("Select login from User where login = " + saisieLogin.getText());
    if(resultaltLogin.next)
    {
    //On a trouve
    }
    ...
    Si saisieLogin est le champ de saisie où l'utilisateur tape son identifiant, penser à bien valider le contenu de ce champ avant de le passer à la base de données! Sinon il y a un risque d'attaque par injection de SQL. Sans réfléchir trop, je pense par exemple que si l'utilisateur tape comme login "xxx OR 1=1 LIMIT 1", il se connecte au système, même sans y avoir de compte...

    - Sylvain

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Par défaut
    Gros merci pour vos aide a tous les 2
    J ' ai pu avancer sur mon projet grâce a vous ^^

    sleroux: ta remarque est plus que pertinente , mais mon chat n ' est destiné que pour un simple projet d ' étudiant qui n ' est pas important ^^
    Donc pour les notions de sécurité , je verrais plus tard car pour l ' instant je ne maitrise pas assez bien ou ait un niveau assez élevé pour maitriser la sécurité ^^.
    Merci de ton aide

    hwoarang: Merci pour ton aide
    Ca marche impeccablement

    J ' ai bien passeé 1 heure tout a l ' heure car il manquait des éléments a l instruction ^^( je dois vraiment progresser sur l ' api SQL)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select login from user where login = \""+ saisieLogin.getText()+"\""
    Il manquait les slashs.
    Tout marche impeccablement maintenant.

    Merci de ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer valeur dans base de donnée SQL
    Par Ullrik dans le forum ASP.NET
    Réponses: 4
    Dernier message: 07/05/2010, 08h23
  2. [ZF 1.8] Récupérer connexion à la base de données dans IndexController
    Par diagonale dans le forum Zend_Db
    Réponses: 4
    Dernier message: 19/08/2009, 22h02
  3. [MySQL] Récupérer image dans base de donnée
    Par semensoise dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/01/2009, 09h51
  4. Réponses: 4
    Dernier message: 05/06/2008, 23h59
  5. [MySQL] Récupérer image dans base de données
    Par lelapinrusse dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 17/03/2008, 13h03

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