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

Requêtes MySQL Discussion :

Récupérer l' id de l'utilisateur dès son inscription


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    En formation
    Inscrit en
    Juillet 2020
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Juillet 2020
    Messages : 124
    Points : 78
    Points
    78
    Par défaut Récupérer l' id de l'utilisateur dès son inscription
    Bonjour,

    Je n'arrive pas à récupérer l'id de l'utilisateur lors de l'inscription. En faite lorsque l'utilisateur s'inscrit sur le site j'ai un id qui s'auto incrémente dans la base de données. Si je me déconnecte et me connecte à nouveau je peux récupérer l' id est faire ce que je veux comme supprimer le compte, modifier un message etc... Une fois que je me re-connecte je peux le récupérer et le stocker dans le localStorage. Moi j'aimerais pouvoir le récupérer dès que l'utilisateur à cliquer sur le bouton s'inscrire . Pouvez me dire comment faire ?
    Merci par avance .

    Je met mon code backend fait avec express:
    Code JavaScript : 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
    exports.signUp = async function (req, res){
        const encryptedPassword =   await  bcrypt.hash(req.body.password, 10);
        const password = req.body.password
        const password_regex = /^(?=.*[0-9]+.*)(?=.*[a-zA-Z]+.*)[0-9a-zA-Z]{8,}$/; 
     
        if(password.match(password_regex)){
            res.status(201).json        
        }else{ 
            return res.status(500).json({err: 'le mot de passe n est pas valide'});
        };
        if(req.body.email){
            //req.body.username = req.body.username.trim() // pour etre sur que le champ username n est pas vide
            connection.query('SELECT users.email, users.password, users.id_user, users.token FROM users WHERE  email = ?', [req.body.email], (err, result) =>{  
                if (err){   
                    res.status(401).json({err: err})
                }else {
                    if(result[0] != undefined){
                        res.status(401).json({ error: "email already taken"})
                    }else {
                            connection.query('INSERT INTO users SET username= ?, email= ?, password = ?, lastname = ?, firstname = ?, id_user= ?', [req.body.username, req.body.email, encryptedPassword, req.body.lastname, req.body.firstname, req.params.id_user], (err, result)=>{
                            if (err){
                                res.status(401).json({err:err})                          
                            }else {  
     
                                let comparePassword = bcrypt.hash(req.body.password, 10)
                                if (comparePassword) {
                                    return res.status(200).json({
                                        id_user: result.id_user,
                                        token: jwt.sign({ id_user: result.id_user},
                                            process.env.JWT_TOKEN,
                                            { expiresIn: '24h' })
                                    }) 
                                }else { 
                                    res.status(401).json({error: error,"error": "Email et le mot de passe ne correspondent pas"})
                                }
                                connection.query('SELECT users.email, users.password, users.id_user FROM users WHERE  email = ?', [req.body.email], (err, result) =>{ 
                                    if(result.id_user > undefined){
                                        return true
                                    }else{
                                        return false
                                    }
                                }),
                                res.status(201).json({message:'inscription pris en compte'})
                            }
                        })
                    }
     
                }
            })
        }else{
            res.status(401).json({ err: 'no name value'})//fin
        }
    }

  2. #2
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    j'ai jeté un coup d'oeil à ton code, mais bien que le langage ressemble au PHP, ce n'en est pas exactement.
    Tu mentionnes express et je ne sais pas ce que c'est. C'est quoi ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    bonjour,

    Pour récupérer la dernière valeur de l'identifiant, il faut utiliser la fonction LAST_INSERT_ID().
    Attention : si plusieurs connexions insèrent en parallèle, la valeur récupérée est propre à chaque connexion.

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bien vu escartefigue,

    je connaissais déjà la fonction PDO lastInsertId(), mais pas la même chose en MySQL : SELECT LAST_INSERT_ID();
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Membre régulier
    Homme Profil pro
    En formation
    Inscrit en
    Juillet 2020
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Juillet 2020
    Messages : 124
    Points : 78
    Points
    78
    Par défaut
    Merci pour ta réponse @escartefigue j'ai essayé comme tu m'as dit mais je n'arrive toujours pas a avoir l'id dans le localstorage des que l'inscription est validé.
    @laurentSc express est framework pour construire une API node.
    je l'ai placé comme ça :
    Code JavaScript : 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
    exports.signUp = async function (req, res){
        const encryptedPassword =   await  bcrypt.hash(req.body.password, 10);
        const password = req.body.password
        const password_regex = /^(?=.*[0-9]+.*)(?=.*[a-zA-Z]+.*)[0-9a-zA-Z]{8,}$/; 
     
        if(password.match(password_regex)){
            res.status(201).json        
        }else{ 
            return res.status(500).json({err: 'le mot de passe n est pas valide'});
        };
        if(req.body.email){
            //req.body.username = req.body.username.trim() // pour etre sur que le champ username n est pas vide
            connection.query('SELECT users.email, users.password, users.id_user, users.token FROM users WHERE id_user= LAST_INSERT_ID() AND email = ?', [req.body.email, req.params.id_user], (err, result) =>{  
                console.log(req.body.id_user)
                if (err){   
                    res.status(401).json({err: err})
                }else {
                    if(result[0] != undefined){
                        res.status(401).json({ error: "email already taken"})
                    }else {
                            connection.query('INSERT INTO users SET username= ?, email= ?, password = ?, lastname = ?, firstname = ?, id_user= ?', [req.body.username, req.body.email, encryptedPassword, req.body.lastname, req.body.firstname, req.params.id_user], (err, result)=>{
                            if (err){
                                res.status(401).json({err:err})                          
                            }else {  
     
                                let comparePassword = bcrypt.hash(req.body.password, 10)
                                if (comparePassword) {
                                    return res.status(200).json({
                                        id_user: result.id_user,
                                        token: jwt.sign({ id_user: result.id_user},
                                            process.env.JWT_TOKEN,
                                            { expiresIn: '24h' })
                                    }) 
     
                                }else { 
                                    res.status(401).json({error: error,"error": "Email et le mot de passe ne correspondent pas"})
                                }
     
                                res.status(201).json({message:'inscription pris en compte'})
                            }
                        })
                    }
     
                }
            })
        }else{
            res.status(401).json({ err: 'no name value'})//fin
        }
    }

    Nom : 1.jpg
Affichages : 573
Taille : 29,0 Ko

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par tony060 Voir le message
    Merci pour ta réponse @escartefigue j'ai essayé comme tu m'as dit mais je n'arrive toujours pas a avoir l'id dans le localstorage des que l'inscription est validé.
    Comme indiqué, ça ne fonctionne que pour la connexion en cours :
    Une connexion fait un insert dans une table pourvue d'une colonne auto_incrément et laisse le SGBD calculer la valeur de celui-ci
    Cette même connexion a ensuite besoin de récupérer la valeur attribuée à l'auto_incrément pour pouvoir insérer des lignes liées dans une table fille, LAST_INSERT_ID() permet de le faire

    Mais, si c'est une autre connexion qui a fait l'insertion, il faut récupérer le max(id) par requête sur la table pour récupérer la plus forte valeur d'id, sans garantie qu'elle soit issue de tel ou tel utilisateur (sauf si une colonne technique moucharde l'utilisateur de connexion dans la table concernée).

  7. #7
    Membre régulier
    Homme Profil pro
    En formation
    Inscrit en
    Juillet 2020
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Juillet 2020
    Messages : 124
    Points : 78
    Points
    78
    Par défaut
    Merci pour ton aide @escartefigue . Je vais voir sinon si une autre solution est possible sinon je vais essayé les modifications avec autre chose que l id

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Si fonctionnellement le besoin est d'identifier les nouvelles inscriptions, il suffit d'enregistrer dans un mouchard l'horodatage de la dernière inscription gérée, puis, quand souhaité, extraire toutes les inscriptions faites après celle enregistrée dans ce mouchard.
    Autre possibilité, ajouter un attribut indiquant inscription vérifiée O/N, valorisé à N lors de l'inscription, il vous suffit ensuite de vérifier ces inscriptions "N" et de les basculer à "O" quand c'est OK ou de les supprimer si c'est KO

  9. #9
    Membre régulier
    Homme Profil pro
    En formation
    Inscrit en
    Juillet 2020
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Juillet 2020
    Messages : 124
    Points : 78
    Points
    78
    Par défaut
    Merci @escartefigue pour cette nouvelle piste, je vais cherché des infos sur le "mouchard l'horodatage" car je ne connais pas du tout. En faite j'ai créé toutes mes requêtes mysql en sélectionnant l 'id de l'utilisateur pour le modification, la création de poste etc. Dans les deux captures écran la première c'est après avoir valider mon inscription je ne récupère par l'id de l'utilisateur, du coup je ne peux rien faire comme modifier un post , créé un post etc et du coup je ne peux rien faire car l'id est undefined. Dans la capture n°2 une fois l'inscription validé je me suis déconnecté et je me suis connecté et là j'ai pu récupéré l'id et je peux créé ou modifier le post. Est ce que c'est possible de faire une sous requête ou moment de l'inscription pour récupéré l'id qui s'est créer dans la base de données ?

    Nom : 1.jpg
Affichages : 580
Taille : 44,6 Ko
    Nom : 2.jpg
Affichages : 552
Taille : 32,3 Ko

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    si l'utilisateur qui s'inscrit est le même que celui qui doit récupérer son identifiant
    et surtout que cette récupération se fait lors de la même connexion, alors la requete est
    select LAST_INSERT_ID().

    exemple : après avoir enregistré l'inscription de jacques martin, on lui envoie un mail de bienvenue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    -- la table AB_abonne a un colonne identifiante AB_ident de type AUTO_INCREMENT
    insert into AB_abonne(AB_nom, AB_prenom, AB_courriel)
           values ('martin', 'jacques', 'jacques.martin@toto.fr')
    ;
    select LAST_INSERT_ID() into @AB_ident
    ;
    insert into MS_message(AB_ident_dest, MS_objet, MS_contenu)
           values (@AB_ident, 'bienvenue', 'merci de vous être inscrit sur notre site')

    dans tous les autres cas, il faut récupérer l'identifiant technique PK (l'auto_increment)
    grâce à une autre clef unique non PK telle que l'adresse courriel par exemple

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select AB_ident
    from AB_abonne
    where AB_courriel='jacques.martin@toto.fr'

  11. #11
    Membre régulier
    Homme Profil pro
    En formation
    Inscrit en
    Juillet 2020
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Juillet 2020
    Messages : 124
    Points : 78
    Points
    78
    Par défaut
    Merci @escartefigue, j'ai donc essayé comme tu m as dit , j'ai aussi passé l'email en unique dans la base de données. Je n'arrive pas à récupérer l'id je te montre mon code peut-être que j'ai mal placé la requête.

    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
    connection.query('SELECT users.email, users.password, users.id_user FROM users WHERE  email = ?', [req.body.email, req.params.id_user], (err, result) =>{  
     
                console.log(req.body.email)
                if (err){   
                    res.status(401).json({err: err})
                }else {
     
                    if(result[0] != undefined){
                        res.status(401).json({ error: "email already taken"})
                    }else {
                        // connection.query('INSERT INTO users SET username= ?, email= ?, password = ?, lastname = ?, firstname = ?, id_user= ?', [req.body.username, req.body.email, encryptedPassword, req.body.lastname, req.body.firstname, req.body.id_user], (err, result)=>{
                            connection.query('INSERT INTO users SET username= ?, email= ?, password = ?, lastname = ?, firstname = ?, id_user= ?', [req.body.username, req.body.email, encryptedPassword, req.body.lastname, req.body.firstname, req.params.id_user], async function (err, result){
                            if (err){
                                res.status(401).json({err:err})                          
                            }else {  
                                let password = req.body.password
                                console.log('lapin')
                                console.log(password)
                                let comparePassword = await bcrypt.hash(req.body.password, 10 )
                                //const comparePassword = await bcrypt.hash(req.body.password)
     
                                if (comparePassword){
                                    return res.status(200).json({
                                        email: req.body.email,
                                        id_user: result.id_user,                                  
                                        token: jwt.sign({ id_user: result.id_user},
                                            process.env.JWT_TOKEN,
                                            { expiresIn: '24h' })
                                    }) 
     
                                }else{
                                    res.status(401).json({error: error,"error": "Email et le mot de passe ne correspondent pas"})
                                }  
     
     
     
                                //res.status(201).json({message:'inscription pris en compte'})
                                req.params.id_user
                                console.log(req.params.id_user)
                            }
                        })
                        connection.query('SELECT id_user FROM users WHERE email = email')
     
                    } 
     
                }
            })    
        }else{
            res.status(401).json({ err: 'no name value'})//fin
        }
    }

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Je n'y connais rien en PHP, par contre si la colonne id_user est celle qui est de type auto_increment, alors il ne faut pas la citer dans l'insert pour que le SGBD en calcule la valeur.

    INSERT INTO users SET username= ?, email= ?, password = ?, lastname = ?, firstname = ?, id_user= ?.

    à remplacer par

    INSERT INTO users SET username= ?, email= ?, password = ?, lastname = ?, firstname = ?.

  13. #13
    Membre régulier
    Homme Profil pro
    En formation
    Inscrit en
    Juillet 2020
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Juillet 2020
    Messages : 124
    Points : 78
    Points
    78
    Par défaut
    j'ai modifié ma requête merci @escartefigue, je vais cherché encore c'est dingue que se soit aussi compliquer de récupérer l'id 'auto_icrement de la base de données. En tout cas merci pour ton aide .

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/09/2008, 15h26
  2. Delphi - récupérer les infos d'un utilisateur
    Par jlf dans le forum Débuter
    Réponses: 2
    Dernier message: 26/06/2004, 11h34
  3. Réponses: 3
    Dernier message: 07/05/2004, 10h01
  4. Récupérer le nom de l'utilisateur sous linux
    Par Michaël dans le forum POSIX
    Réponses: 7
    Dernier message: 25/12/2003, 21h38

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