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

PHP & Base de données Discussion :

Problème : Vérifier un doublon [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut Problème : Vérifier un doublon
    Bonjour après wxpython je me lance dans MySQL, cependant j'ai un peu de mal à débuter, j'essaie de créer un système de login/motdepasse, il fonctionne et enregistre bien les valeurs dans la BDD mais je voudrais que l'on ne puisse pas mettre 2 fois le même login, j'ai bien essayé une méthode mais cela ne fonctionne pas, si quelqu'un peut me venir en aide ça serait gentil

    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
     
    <form action="loginmdp.php" method="get">
    Nom d'utilisateur : <input type="text" name="login" value="" id="0"  /> <p>
    Mot de passe : <input type="password" name="mdp1" value="" id="1"  /> <p>
    Répéter mot de passe : <input type="password" name="mdp2" value="" id="2"  /><p>
    <input type="submit" value="valider" />
     
    <?php
    if (isset($_GET['login']) and isset($_GET['mdp1']) and isset($_GET['mdp2']))
    {
    	$login = $_GET['login'];
    	$mdp1 = $_GET['mdp1'];
    	$mdp2 = $_GET['mdp2'];
    	if (($login != "") and ($mdp1 != "") and ($mdp2 == $mdp1))
    	{
    		try
    		{
    		// On se connecte à MySQL
    		$connect = mysql_connect('localhost','user','mdp');
    		$bd = mysql_select_db('mabdd');
    		}
    		catch(Exception $e)
    		{
    		// En cas d'erreur, on affiche un message et on arrête tout
            die('Erreur : '.$e->getMessage());
    		}
    //Début de la méthode qui ne fonctionne pas
    		$i=0;
    		$tableau = array();
    		$req_tableau = mysql_query("SELECT * FROM `loginmdp`");
    		while (mysql_fetch_array($req_tableau)){
    		echo $tableau[$i];
    		$i++;}
    		if (in_array($login, $tableau)) {
    		echo 'Ce login existe deja';
    		} 
    		else {
    		$enr_loginmdp = mysql_query("INSERT INTO loginmdp (login,mdp) VALUES ('".$login."','".$mdp1."')",$connect);
    		}
    		}
    //Fin de la méthode qui ne fonctionne pas
    		else
    		{
    		echo 'Veuillez entrer les identifiants';
    		}
    	}
    ?>

  2. #2
    Membre éclairé Avatar de jp_rennes
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2006
    Messages : 72
    Par défaut un peu compliqué
    Il me semblerais plus simple de faire une requête du style (en supposant que la colonne contenant le login se nomme "login")
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select  * FROM loginmdp where login=$login
    il te suffit ensuite de compter le nombre de réponses avec la fonction php mysql_num_rows
    Ou autre solution un peu plus "bourine" serait de créer ta table avec la colonne login déclarée comme clé primaire (primary key)
    Ensuite tu fais un insert : si le login existe déjà l'insertion sera rejetée!!

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    Euh je suis vraiment débutant, pourrais tu m'eclairer un peu plus, je comprends l'idée mais pas comment le coder =S

  4. #4
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    mouais. bon puisque tu passes par PHP

    En détail ça donne un index "unique" sur la colonne des logins. Apres tu as deux 2 solutions.
    1. soit tu gères les exceptions
    2. soit tu les anticipes


    Dans la premiere solution tu envoies la commande INSERT INTO ... et si le mysql_query echoue (test du code de retour) tu regardes le code d'erreur mysql , tu lances une exception adapté et tu engueules ton visiteur parce que le login n'est pas libre.
    j'ai pas compris la relation entre l'entier fourni par le driveur Mysql et les codes fournis par la doc, alors je t'offre ceux-la.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                case 1048: // can not be null
                case 1062: // duplicate key
                case 1452: // foreign key constaint
    En fait tu peux tres bien ne pas faire d'exception mais je trouve ça plus propre de gérer les cas ou ça va mal par des exceptions.

    Soit tu fais une selection dans la base avec dans ton WHERE login = :login comme on te l'a déjà suggérer.

    Si tu veux faire serieux faut faire un ptit coup d'ajax pour révenir que le login est déjà pris, mais ne nous embalons pas.


    pour le bout de script présenté

    ton erreur est là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (mysql_fetch_array($req_tableau)){
    		echo $tableau[$i];
    relis la doc, le reste me semble aléatoire. Je te conseille mysql_fetch_assoc(), à la longue on y gagne en temps de débug.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    L'unicité des valeurs dans une colonne est une contrainte propre aux données, indépendamment de toute application.
    Il est évident que dans ces exemple, chaque utilisateur s'identifiant par son login, celui-ci doit être unique.

    Il faut donc poser une contrainte d'unicité sur la colonne login à la création de la table, ou plus tard par un ALTER TABLE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE utilisateur
    ADD UNIQUE (login)
    Si l'utilisateur se coisit un login déjà existant, c'est le SGBD qui retournera une erreur que le programme utilisateur est chargé d'interpréter et de traduire en clair pour l'utilisateur.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    J'ai tenté de faire comme ceci pour voir si ça m'affichait tous les logins enregistrés dans la colonne login de la bdd, mais ça ne marche pas, je ne comprends pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $req_verif = mysql_query("SELECT * FROM loginmdp WHERE login=$login");
    		while ($verif = $req_verif){ 
    		echo $verif;}

  7. #7
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    voir si ça m'affichait tous les logins enregistrés dans la colonne login de la bdd,
    il m'est avis que pour avoir toutes les lignes (d'une colonne login), c'est à dire toutes les lignes sans conditions, il ne faut pas mettre de condition. Il se trouve justement que WHERE login = :valeur est la façon d'écrire une condition en SQL.

    tu enlèves cela est tu extrairas toutes les lignes sans conditions!

    ça fait bisare les requetes sans where, mais tu verras avec le temps que, sous certaines conditions, mysql autorise les requêtes sans FROM.

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Fawn_noOb_wxPython, tu as sérieusement besoin de prendre des cours de SQL !
    Va faire un tour chez SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    J'ai enfin réussi, mon code fonctionne parfaitement, on ne peut pas laisser de champ vide, et l'utilisateur est prévenu si le login est déjà utilisé. Par contre je me demande comment on fait pour crypter le mot de passe ? Car récupérer les mdp non cryptés des utilisateurs dans la bdd ne me semble pas très correct... Si quelqu'un peut m'éclairer ^^

    Voilà le bout de code qui à fait que ça fonctionne :
    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
     
    $sql =mysql_query("SELECT * FROM loginmdp WHERE login='$login'");
    		$nombre = mysql_num_rows($sql);
    		if ($nombre == 0)
    		{ 
    		$enr_loginmdp = mysql_query("INSERT INTO loginmdp (login,mdp) VALUES ('".$login."','".$mdp1."')",$connect);
    		echo '<span style="color:#3BED0E;">Inscription réussie</span>';
    		}
    		else
    		{
    		echo '<span style="color:#FF0000;">Login deja utilisé, essayes encore ! ;)</span>';
    		}
    		}
    	else
    	{
    	echo '<span style="color:#FF0000;">Veuillez remplir tous les champs !</span>';
    	}

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Tu peux crypter le mot de passe avec la fonction MD5 par exemple dans ta requête SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    Merci beaucoup !

    Euh dernier problème lol je dois placer ou la fonction md5 ??? j'arrive pas a la placer ou il faut

    Logiquement sur cette ligne : (ligne d'origine)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $enr_loginmdp = mysql_query("INSERT INTO loginmdp (login,mdp) VALUES ('".$login."','".$mdp1."')",$connect);
    J'ai essayé de differentes façons, ça na marche pas : (dans ce genre là)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $enr_loginmdp = mysql_query("INSERT INTO loginmdp (login,mdp) VALUES ('".$login."',md5('".$mdp1."'))",$connect);

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Pourtant il me semble que ta requête est bonne.

    Quelle est la vraie requête envoyée au serveur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $requete = "INSERT INTO loginmdp (login,mdp) VALUES ('".$login."',md5('".$mdp1."'))";
    echo '<br />requête : '.$requete;
    $enr_loginmdp = mysql_query($requete,$connect);
    Quel est le résultat obtenu ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    ça marche merci bcp ^^

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/10/2008, 06h53
  2. Probléme avec les doublons
    Par albatof dans le forum SQLite
    Réponses: 2
    Dernier message: 16/06/2008, 16h40
  3. [Problème] Suppression de doublons pour grep
    Par maloute80 dans le forum Langage
    Réponses: 12
    Dernier message: 20/12/2007, 09h54
  4. Division relationnelle : problème avec les doublons
    Par ced dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/12/2007, 16h49
  5. Vérifier les doublons dans un fichier texte
    Par Shyboy dans le forum Langage
    Réponses: 2
    Dernier message: 11/07/2007, 09h34

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