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 :

Problème vérification existance d'un identifiant


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème vérification existance d'un identifiant
    Bonjour à tou(te)s,

    Je développe une petite appli' sur une création de visiteurs. Je génère un identifiant en récupérant la première lettre de son nom suivi de deux chiffres aléatoires compris entre 0 et 9. Jusque là, rien de difficile. Vient ensuite le test de l'identifiant pour vérifier qu'il n'existe pas déjà.

    Pour ce test, j'ai une méthode "existeVisiteur" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private boolean existeVisiteur(String id){
    boolean trouve = false;
    int i = 0;
    //listeV récupère tous les visiteurs existants dans la BDD
    listeV = AccesBDD.getLesVisiteurs();
    while(i<listeV.size() || trouve == false){
    	if(id.equals(listeV.get(i).getId()))
    		trouve = true;
    i++;
    }
    return trouve;
    }
    Je l'appel de cette façon là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {	
    	//affectation des données à des variables
    	String id = textFieldId.getText();
    	if (existeVisiteur(id) == false)
    		afficheMessage("Cet identifiant est disponible");
    	else
    		afficheMessage("Cet identifiant n'est pas disponible")
    }
    catch (Exception e)
    {
    	afficheMessage("Problème de saisie.");
    }
    Lorsque l'identifiant est déjà utilisé, il me retourne bien "Cet identifiant n'est pas disponible", en revanche lorsque celui-ci n'existe pas, je passe dans le catch.

    La connexion entre mon appli Java et la base MySQL est fait en hibernate. (Je n'ai pas le choix)

    Je ne vois pas d'où ça peut venir, si quelqu'un pouvait m'aider

    Merci d'avance

  2. #2
    Membre averti Avatar de toutgrego
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 217
    Points : 350
    Points
    350
    Par défaut
    Salut,

    dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(i<listeV.size() || trouve == false){
    	if(id.equals(listeV.get(i).getId()))
    		trouve = true;
    i++;
    }
    Il faut que tu mettes && au lieu de || parce que sinon ta boucle va continuer à boucler et tenter d'accéder à un élément en dehors de ta liste et tu te retrouves avec un IndexOutofBoundException ou un truc similaire.


    Tchao!

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    pour tester l'existence de ton id, tu devrais plutôt mettre l'id à tester en paramètre de ta requête, ca éviterait que si il y a des milliers de visiteurs (voire des millions), ton prog boucle sur des milliers de tests, de transporter une réponse gigantesque (ça va prendre beaucoup de mémoire pour rien et pour peu que ta base soit distante et ça va prendre des plombes)

    si l'id existe tu as une réponse, sinon tu n'en a pas

    et si en plus tu fait un count dans ta requête, tu récupères 0 ou 1 selon que ça existe ou pas.

    reste le problème de l'accès concurrent ! je ne sais pas s'il est prévu que plusieurs utilisateurs puissent se connecter simultanément à ta base pour créer des utilisateurs. statistiquement il est peu probable qu'il y ait le même id créé en même temps, mais ce n'est pas impossible.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    @toutgrego Un gros merci pour ta réponse, ça fonctionne ... Aucune idée pourquoi j'y ai jamais pensé !

    @joel.drigo J'ai fais cette requête en m'inspirant de celle qui récupère tous les visiteurs. Elle me parait bonne mais lorsque j'exécute, je passe directement dans le catch.

    Ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static List<Visiteur> getLeVisiteurs(String id)
    {
    	return s.createQuery("select count(*) from Visiteur where id= '" + id).list();
     
    }
    Comment je l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try{
    	String id = textFieldId.getText();
            List<Visiteur> leVisiteur= AccesBDD.getLeVisiteurs(id);
    	if (leVisiteur.size()==0)
    		afficheMessage("Cet identifiant est disponible");
    	else
    		afficheMessage("Cet identifiant n'est pas disponible");
    }
    catch (Exception e)
    {
    	afficheMessage("Problème de saisie.");
    }

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Un select count(*) retourne un entier mais pas de liste de visiteur.
    N'insère pas directement des valeurs dans une requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static Integer getNbVisiteur(String id)
    {
    	return (Integer) s.createQuery("select count(id) from Visiteur where id= ?").setString (0, id).uniqueResult();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try{
    	String id = textFieldId.getText();
    	if (AccesBDD.getNbVisiteur(String id) ==0 )
    		afficheMessage("Cet identifiant est disponible");
    	else
    		afficheMessage("Cet identifiant n'est pas disponible");
    }
    catch (Exception e)
    {
    	e.printStackTrace(); // il nous raconte des histoires intéressants 
    }
    A+.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Que fait cette partie de requête exactement ? Je me doute que "id" dans les parenthèses du setString correspond à la variable qui "remplacera" le ?, mais le reste je ne comprends pas le reste ^^"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where id= ?").setString (0, id).uniqueResult();
    J'ai mis tout le code que tu m'as donné (peut-être une erreur de ma part?) dans mon code et j'ai ce message qui apparait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    	at com.utilitaire.AccesBDD.getNbVisiteur(AccesBDD.java:33)
    	at com.vue.AjoutVisiteur$5.actionPerformed(AjoutVisiteur.java:269)

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    C'est que la requête retourne un type Long et on a tenté de le caster en Integer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return ((Long) s.createQuery("select count(id) from Visiteur where id= ?").setString (0, id).uniqueResult()).intValue;
    A+.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Nickel ! Ça fonctionne ! =)

    Un énorme merci à vous tous

  9. #9
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par ShowLess Voir le message
    Que fait cette partie de requête exactement ? Je me doute que "id" dans les parenthèses du setString correspond à la variable qui "remplacera" le ?, mais le reste je ne comprends pas le reste ^^"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where id= ?").setString (0, id).uniqueResult();
    Oui, tout est expliqué sur le javadoc.

    A+.

Discussions similaires

  1. [MySQL] problème vérification identifiants
    Par bromlecornu dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/04/2007, 09h28
  2. problème avec EXISTS
    Par projetM dans le forum SQL
    Réponses: 48
    Dernier message: 27/12/2006, 12h38
  3. [MySQL] upload : problème fichiers existants dans la bdd ?
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/02/2006, 11h29
  4. Réponses: 4
    Dernier message: 23/11/2005, 13h04

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