Comment vérifier si une adresse email modifie est existante [Résolu]

Signaler
Messages postés
15
Date d'inscription
lundi 5 juillet 2021
Statut
Membre
Dernière intervention
6 juillet 2021
-
Messages postés
15
Date d'inscription
lundi 5 juillet 2021
Statut
Membre
Dernière intervention
6 juillet 2021
-
Bonsoir
Je viens de modifier un code existant en mysqli pour le rendre propre en php
Ce code permet de modifier une adresse mail dans la base de donnée
Cela fonctionne parfaitement
Mais j'aurais souhaiter savoir comment vérifier si elle existe déjà dans la table des utilisateurs

Voici mon code fonctionnel

<?php
session_start();
if (!isset($_SESSION['pseudo']))
{
    header("Refresh: 5; url=connexion.php"); //redirection vers le formulaire de connexion dans 5 secondes
    echo "Vous devez vous connecter pour accéder à l'espace membre.<br><br><i>Redirection en cours, vers la page de connexion...</i>";
    exit(0); //on arrête l'éxécution du reste de la page avec exit, si le membre n'est pas connecté
    
}
$Pseudo = $_SESSION['pseudo']; 
require_once 'base.php';
if (!$bdd)
{
    echo "Erreur connexion BDD";
   
    exit(0);
}

?><!DOCTYPE HTML>
<html>
    <head>
        <title>Script espace membre</title>
    </head>
    <body>
        <h1>Espace membre</h1>
        Pour modifier vos informations, <a href="modifier-email.php?modifier">cliquez ici</a>
       
       
        <br>
        Pour vous déconnecter, <a href="deconnexion.php">cliquez ici</a>
        <hr/>
        <?php
if (isset($_GET['modifier']))
{
?>
            <h1>Modification du compte</h1>
            Choisissez une option: 
            <p>
                <a href="modifier-email.php?modifier=email">Modifier l'adresse email</a>
                <br>
               
            </p>
            <hr/>
            <?php
    if ($_GET['modifier'] == "email")
    {
        echo "<p>Renseignez le formulaire ci-dessous pour modifier vos informations:</p>";
        if (isset($_POST['valider']))
        {
            if (!isset($_POST['email']))
            {
                echo "Le champ email n'est pas reconnu.";
            }
            else
            {
                if (!preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i", $_POST['email']))
                {
                    //cette preg_match est un petit peu complexe, je vous invite à regarder l'explication détaillée sur mon site c2script.com
                    echo "L'adresse email est incorrecte.";
                    //normalement l'input type="email" vérifie que l'adresse email soit correcte avant d'envoyer le formulaire mais il faut toujours être prudent et vérifier côté serveur (ici) avant de valider définitivement
                    
                }
                else
                {
                    //tout est OK, on met à jours son compte dans la base de données:
                    // if(mysqli_query($mysqli,"UPDATE membres SET email='".htmlentities($_POST['email'],ENT_QUOTES,"UTF-8")."' WHERE pseudo='$Pseudo'"))
					//on prepare la requete 	
                    $sql = "UPDATE utilisateurs SET email='" . htmlentities($_POST['email'], ENT_QUOTES, "UTF-8") . "' WHERE pseudo='?'";

                    $datas = [$Pseudo];

                    //Execution de la requete
                    try
                    {
                        $requete = $bdd->prepare($sql);
                        $res = $requete->execute($datas);
                    }
                    catch(Exception $e)
                    {
                        // en cas d'erreur :
                        echo " Erreur ! " . $e->getMessage();
                        echo " Les datas : ";
                        print_r($datas);
                    }

                    if ($res)
                    {

                        echo "Adresse email {$_POST['email']} modifiée avec succès!";
                        $TraitementFini = true; //pour cacher le formulaire
                        
                    }
                    else
                    {
                        echo "Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste.";
                        //echo "<br>Erreur retournée: ".mysqli_error($mysqli);
                        
                    }
                }
            }
        }
        if (!isset($TraitementFini))
        {
?>
                    <br>
                    <form method="post" action="modifier-email.php?modifier=email">
                        <input type="email" name="email" value="<?php echo $info['email']; ?>" required><!-- required permet d'empêcher l'envoi du formulaire si le champ est vide -->
                        <input type="submit" name="valider" value="Valider la modification">
                    </form>
                    <?php
        }
    }
}
?>
    </body>
</html>


Je suppose que je dois ajouter une fonction dans cette partie de code avec un elseif

 if ($res)
                    {

                        echo "Adresse email {$_POST['email']} modifiée avec succès!";
                        $TraitementFini = true; //pour cacher le formulaire
                        
                    }
                    else
                    {
                        echo "Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste.";
                        //echo "<br>Erreur retournée: ".mysqli_error($mysqli);
                        
                    }


Que pensez vous de ce code que je pourrais ajouter avec une requête préparée

$email = "contact@waytolearnx.com";
$stmt = $pdo->prepare("SELECT * FROM users WHERE email=?");
$stmt->execute([$email]); 
$user = $stmt->fetch();
if ($user) {
    // email existe
} else {
    // email n'existe pas
} 

5 réponses

Messages postés
15
Date d'inscription
lundi 5 juillet 2021
Statut
Membre
Dernière intervention
6 juillet 2021

Ah mais non je dois vérifier avant la mise a jour de la base de donnée


Mais je suis complètement perdu dans les if et les else
trop d'imbrication

Merci de m'aider
Salut,
vu que la question tourne autour du SQL faites tout en SQL directement sur la base(le test si un email est déjà enregistré et l'inscription ou non ).
Cela me paraît plus simple.
Sinon décomposez pour supprimer les imbrications de IF/ELSE qui en effet me semblent pas pertinentes et reviennent à mélanger des choses qui n'ont rien à voir entre elles:
_le traitement des données d'un formulaire
_la vérification d'un doublon sur la base.

L'inconvénient de cette dernière solution par rapport à la première (tout en SQL) c'est qu'elle oblige à faire 2 requêtes:
donc traitement plus long(X2) et risques d'erreurs accrus(X2)
L'avantage c'est que c'est plus souple et simple pour un message d'erreur genre "cet email est déjà enregistré et ne peut pas être utilisé, la modification n'a pas été effectuée" vers le HTML.

Encore mieux donc c'est d'utiliser AJAX pour cette partie et retenir: "le changement d'email est effectué" ou le message d'erreur.

Dans tout- les cas vous avez intérêt à séparer les messages d'erreurs qui viennent du formulaire de ceux de la base de données, s'il il y a une erreur dans le formulaire il n'est pas nécessaire de passer à la suite et donc de faire une requête.
Une étape première serait même d'utiliser des vérifications en HTML et JavaScript pour valider ou pas le formulaire et ainsi se passer de PHP dans le cas ou le formulaire ne donnera pas de traitement des valeurs envoyées(donc = ne pas envoyer de formulaire à un script PHP ).

La vérification du doublon dans la BDD intervient avant l'enregistrement donc au moment où toutes les autres instructions sont remplies et si ce n'est pas le cas elle n'a simplement aucune utilité(ni même d'arriver jusqu'au script PHP puisque au final aucune requête à la base ne sera envoyée).

ps: vous avez tout intérêt à séparer le PHP du HTML (faire donc une page qui ne contient que le formulaire et une qui ne contient que le script PHP du traitement des données envoyées, l'extension du nom de fichier ne compte pas) pour de nombreuses raisons. Outre la clarté, facilité et séparation claire du code(donc sa compréhension/maintenance/réutilisation pour d'autres pages HTML...) c'est une simple question de sécurité(voir différence entre GET et POST, en GET il n'y aucune sécurité puisque les valeurs du formulaire sont dans l'URL et que n'importe qui peut les changer ou les voir directement ou lors du transfert HTTP).
Messages postés
15
Date d'inscription
lundi 5 juillet 2021
Statut
Membre
Dernière intervention
6 juillet 2021

Salut
Merci pour cette réponse
Oui en effet lorsqu' il y a trop d'imbrications on s'y perd très facilement
Après relecture du code
De toute façon je n'ai pas le choix je dois interroger deux fois la base de données
Une première fois pour vérifier que l'adresse mail n'est pas un doublon et une deuxième fois pour la mettre à jour
Avec ajax je peux oublier car je n'y connais absolument rien
Tu me dis que je pourrais tester cela en html ...
Je ne vois pas comment vérifier quelque chose sans passer par la base de données
Quoi qu'il en soit je dois d'abord vérifier si l'adresse mail existe ou pas
Dans une première condition
Si elle existe je sors
Sinon je continue
Le reste du processus qui fonctionne déjà
Messages postés
15
Date d'inscription
lundi 5 juillet 2021
Statut
Membre
Dernière intervention
6 juillet 2021

Je pense avoir trouvé
Je dois juste encore faire une requête préparée

<?php
/*************************
 *  Page: espace-membre.php
 *  Page encodée en UTF-8
 **************************/
session_start();
if (!isset($_SESSION['pseudo']))
{
    header("Refresh: 5; url=connexion.php"); //redirection vers le formulaire de connexion dans 5 secondes
    echo "Vous devez vous connecter pour accéder à l'espace membre.<br><br><i>Redirection en cours, vers la page de connexion...</i>";
    exit(0); //on arrête l'éxécution du reste de la page avec exit, si le membre n'est pas connecté
    
}
$Pseudo = $_SESSION['pseudo']; //on défini la variable $Pseudo (Plus simple à écrire que $_SESSION['pseudo']) pour pouvoir l'utiliser plus bas dans la page
//on se connecte une fois pour toutes les actions possible de cette page:
require_once 'base.php';
if (!$bdd)
{
    echo "Erreur connexion BDD";
    //Dans ce script, je pars du principe que les erreurs ne sont pas affichées sur le site, vous pouvez donc voir qu'elle erreur est survenue avec mysqli_error(), pour cela décommentez la ligne suivante:
    //echo "<br>Erreur retournée: ".mysqli_error($mysqli);
    exit(0);
}

?><!DOCTYPE HTML>
<html>
    <head>
        <title>Script espace membre</title>
    </head>
    <body>
        <h1>Espace membre</h1>
        Pour modifier vos informations, <a href="modifier-email.php?modifier">cliquez ici</a>
       
       
        <br>
        Pour vous déconnecter, <a href="deconnexion.php">cliquez ici</a>
        <hr/>
        <?php
//si "?modifier" est dans l'URL:
//si "?modifier" est dans l'URL:
if (isset($_GET['modifier']))
{
?>
            <h1>Modification du compte</h1>
            Choisissez une option: 
            <p>
                <a href="modifier-email.php?modifier=email">Modifier l'adresse email</a>
                <br>
                <a href="modifier-email.php?modifier=mdp">Modifier le mot de passe</a>
            </p>
            <hr/>
            <?php
    if ($_GET['modifier'] == "email")
    {
        echo "<p>Renseignez le formulaire ci-dessous pour modifier vos informations:</p>";
        if (isset($_POST['valider']))
        {
            if (!isset($_POST['email']))
            {
                echo "Le champ email n'est pas reconnu.";
            }
            else
            {
                //d abord je verifie que l adresse mail n est pas prise
                $req = $bdd->prepare('SELECT email FROM utilisateurs WHERE email = :email');
                $req->execute(array(
                    ':email' => $_POST['email']
                ));
                $donnees = $req->fetch();
                if ($donnees) // Si une valeur est retournée c'est qu'un membre possède déjà le pseudo.
                
                {
                    echo 'mail déjà pris';
                }
                else
                {
                    //si pas prise je continue le processus
                    

                    if (!preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i", $_POST['email']))
                    {
                        //cette preg_match est un petit peu complexe, je vous invite à regarder l'explication détaillée sur mon site c2script.com
                        echo "L'adresse email est incorrecte.";
                        //normalement l'input type="email" vérifie que l'adresse email soit correcte avant d'envoyer le formulaire mais il faut toujours être prudent et vérifier côté serveur (ici) avant de valider définitivement
                        
                    }
                    else
                    {
                        //tout est OK, on met à jours son compte dans la base de données:
                        // if(mysqli_query($mysqli,"UPDATE membres SET email='".htmlentities($_POST['email'],ENT_QUOTES,"UTF-8")."' WHERE pseudo='$Pseudo'"))
                        $sql = "UPDATE utilisateurs SET email='" . htmlentities($_POST['email'], ENT_QUOTES, "UTF-8") . "' WHERE pseudo='$Pseudo'";

                        $datas = [$Pseudo];

                        //Execution de la requete
                        try
                        {
                            $requete = $bdd->prepare($sql);
                            $res = $requete->execute($datas);
                        }
                        catch(Exception $e)
                        {
                            // en cas d'erreur :
                            echo " Erreur ! " . $e->getMessage();
                            echo " Les datas : ";
                            print_r($datas);
                        }

                        if ($res)
                        {

                            echo "Adresse email {$_POST['email']} modifiée avec succès!";
                            $TraitementFini = true; //pour cacher le formulaire
                            
                        }
                        else
                        {
                            echo "Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste.";
                            //echo "<br>Erreur retournée: ".mysqli_error($mysqli);
                            
                        }
                    }
                }
            }
        }
        if (!isset($TraitementFini))
        {
?>
                    <br>
                    <form method="post" action="modifier-email.php?modifier=email">
                        <input type="email" name="email" value="<?php echo $info['email']; ?>" required><!-- required permet d'empêcher l'envoi du formulaire si le champ est vide -->
                        <input type="submit" name="valider" value="Valider la modification">
                    </form>
                    <?php
        }
    }
}
?>
    </body>
</html>
Messages postés
15
Date d'inscription
lundi 5 juillet 2021
Statut
Membre
Dernière intervention
6 juillet 2021

Mais je me retrouve avec un soucis pour la requête préparée a cause du :
Voici la requête normale
			$req = $bdd->prepare('SELECT email FROM utilisateurs WHERE email = :email');
						
$requete->execute(array(':email'=>$_POST['email']));
$donnees = $requete->fetch();
if ($donnees) // Si une valeur est retournée c'est qu'un membre possède déjà le pseudo.
{
	echo 'mail déjà pris';
}else {
   //si pas prise je continue le processus 


J'ai essaye comme ceci en remplaçant donc :email par ?


			 $sql = "SELECT email FROM utilisateurs WHERE email = ?";

 $datas = [ $email ];

//Execution de la requete
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute($datas) ;
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($datas);
}


Messages postés
15
Date d'inscription
lundi 5 juillet 2021
Statut
Membre
Dernière intervention
6 juillet 2021

Voila je pense que cela est bon

 $sql = "SELECT email FROM utilisateurs WHERE email = :email";

 $datas = array(':email'=>$_POST['email']);

//Execution de la requete
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute($datas) ;
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($datas);
}