PHP

Confirmation par mail

Résolu

Bonjour j'ai suivi le tuto et j'ai un retour d'erreur qui me dit : Notice: Undefined variable: valid in blabla on line 23 accompagner du lien "Accueil"


je recois bien un mail qui me dit cliquez validez puis une fois validez sa me dit veuillez confirmer


voici mon conf.php


<?php
  session_start();


  include('bd/connexionDB.php');


  if (isset($_SESSION['id'])){
    header('Location: index.php');
    exit;
  }


  $id = (int) $_GET['id'];
  $token = (String) htmlentities($_GET['token']); 


  if($id < 1){
    $valid = false;
    $err_mess = "Le lien est erroné";
 
  }elseif(!isset($token)){
    $valid = false;
    $err_mess = "Le lien est erroné";
  }
 
  if($valid){
    $req = $DB->query("SELECT id 
      FROM utilisateur 
      WHERE id = ? AND token = ?", 
      array($id, $token));


    $req = $req->fetch();


    if(!isset($req['id'])){
      $valid = false;
      $err_mess = "Le lien n'est plus valide";
    }else{
      $DB->insert("UPDATE utilisateur SET token = NULL, confirmation_token = ? WHERE id = ?", 
        array(date('Y-m-d H:i:s'), $req['id']));


      $info_mess = "Votre compte a bien été validé";
    }  
  }
?>
<!DOCTYPE html>
<html>
  <head>
    <title>Validation mail</title>
  </head>
  <body>
     <?php
      if(isset($info_mess)){
        echo $info_mess;
      }
      if(isset($err_mess)){
        echo $err_mess;
      }
    ?>
    <a href="index.php">Accueil</a>
  </body>
</html>
536 vues
08 septembre 2020 à 21:41 (Édité)
Cette pub permet au site de vivre ...

9 commentaires

Re @Jerem971


j'ai trouvé ma bêtise j'ai copiez collez dans la base de donné du coup j'ai fait en manuel pour incorporé id, nom, prénom le vachar et autre heidisql qui a beugué j'ai pas compris pourquoi bref ces résolu mais j'ai quand meme une question pourquoi avoir mis des (htmlentities) dans inscription connexion et autre les espace sont impossible



Re @Jerem971


j'ai tous retesté et probleme dans le script conf.php les variable


if($id < 1){
    $valid = false;
    $err_mess = "Le lien est erroné";
  
  }elseif(!isset($token)){
    $valid = false;
    $err_mess = "Le lien est erroné";
  }


ne reponde pas donc la variable $valid n'est effectivement à aucun moment créée celle ci


 if($valid){


Re:


Peux-tu me donner le lien des articles de formations que tu as lu ?

Je vais essayer de voir quels étapes tu as sautés...

Re


Oui je travaille bien en local et je me ser bien de sendmail dans xampp et il et bien configurer comme dans l'article que vous m'avez join

Re:


On est bien d'accord que tu travailles en local avec XAMPP et non sur un hébergeur en ligne ? Cet article permet de le configurer pour l'envoie de mail...

Re


Alors j'ai téléchargé avec attente 30 secondes l'article ou les articles pas copier coller et la connexion à la bd s'effectue avec succès quand je teste l'inscription la bd enregistre avec succès je fais avec xampp j'ai beau chercher je comprends pas de ou viens le problème

Re:


Alors j'ai quelques questions :


  • As-tu copier/coller le code de l'article en question ou l'as-tu télécharger ?
  • La connexion à ta base de données s'effectue-t-elle avec succès ?

Bonjour @Jerem971,


Je comprends bien que j'ai une erreur de variables mais la variable pour valider existe bien puisque dans le mail que je reçois il me dit de cliquer valider et me renvoie bien sûr l'URL suggère dans cette même variable j'ai fait un essai en mettant manuellement une date pour valider et la non plus sa ne marche pas sa me dit veuillez confirmer votre compte


pour moi l'erreur vien d'ailleur voici l'autre erreur qui me fait dire sa :


Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\xampp\htdocs\bd\connexionDB.php on line 29


Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in C:\xampp\htdocs\bd\connexionDB.php on line 29


voici la bd


<?php
// Déclaration d'une nouvelle classe
class connexionDB {
  private $host    = 'localhost';    // nom de l'host
  private $name    = 'monsite';     // nom de la base de donnée
  private $user    = 'root';         // utilisateur
  private $pass    = '';         // mot de passe
  //private $pass    = '';           // Ne rien mettre si on est sous windows
  private $connexion;


  function __construct($host = null, $name = null, $user = null, $pass = null){
      if($host != null){
          $this->host = $host;           
          $this->name = $name;           
          $this->user = $user;          
          $this->pass = $pass;
      }
  try{
      $this->connexion = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name,
          $this->user, $this->pass, array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8', 
          PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
  }catch (PDOException $e){
      echo 'Erreur : Impossible de se connecter  à la BDD !';
  die();
 }
}
  public function query($sql, $data = array()){
      $req = $this->connexion->prepare($sql);
      $req->execute($data);


      return $req;
  }
  public function insert($sql, $data = array()){
      $req = $this->connexion->prepare($sql);
      $req->execute($data);
  }
}


// Faire une connexion à votre fonction
$DB = new connexionDB();
?>


j'ai aussi controlé dans l'URL id correspond bien a la bd et le token aussi


erreur 2


Notice: Undefined variable: valid in C:\xampp\htdocs\conf.php on line 23


conf.php


<?php
  session_start();


  include('bd/connexionDB.php');


  if (isset($_SESSION['id'])){
    header('Location: index.php');
    exit;
  }


  $id = (int) $_GET['id'];
  $token = (String) htmlentities($_GET['token']);


  if($id < 1){
    $valid = false;
    $err_mess = "Le lien est erroné";
 
  }elseif(!isset($token)){
    $valid = false;
    $err_mess = "Le lien est erroné";
  }
 
  if($valid){
    $req = $DB->query("SELECT id 
      FROM utilisateur 
      WHERE id = ? AND token = ?");
      array($id, $token);


    $req = $req->fetch();


    if(!isset($req['id'])){
      $valid = false;
      $err_mess = "Le lien n'est plus valide";
    }else{
      $DB->insert("UPDATE utilisateur SET token = NULL, confirmation_token = ? WHERE id = ?",
        array(date('Y-m-d H:i:s'), $req['id']));


      $info_mess = "Votre compte a bien été validé";
    }
  }
?>
<!DOCTYPE html>
<html>
  <head>
    <title>Validation mail</title>
  </head>
  <body>
   <?php
    if(isset($info_mess)){
      echo $info_mess;
    }
    if(isset($err_mess)){
      echo $err_mess;
    }
  ?>
    <a href="index.php">Accueil</a>
  </body>
</html>


inscription


<?php
    session_start();


    include('bd/connexionDB.php'); // Fichier PHP contenant la connexion à votre BDD


    // S'il y a une session alors on ne retourne plus sur cette page
    if (isset($_SESSION['id'])){
        header('Location: index.php'); 
        exit;
    }


    // Si la variable "$_Post" contient des informations alors on les traitres
    if(!empty($_POST)){
        extract($_POST);
        $valid = true;


        // On se place sur le bon formulaire grâce au "name" de la balise "input"
        if (isset($_POST['inscription'])){


            $nom  = htmlentities(trim($nom)); // On récupère le nom
            $prenom = htmlentities(trim($prenom)); // on récupère le prénom
            $mail = htmlentities(strtolower(trim($mail))); // On récupère le mail
            $mdp = trim($mdp); // On récupère le mot de passe 
            $confmdp = trim($confmdp); //  On récupère la confirmation du mot de passe


            //  Vérification du nom
            if(empty($nom)){
                $valid = false;
                $er_nom = ("Le nom d' utilisateur ne peut pas être vide");
            }       


            //  Vérification du prénom
            if(empty($prenom)){
                $valid = false;
                $er_prenom = ("Le prenom d' utilisateur ne peut pas être vide");
            }       


            // Vérification du mail
            if(empty($mail)){
                $valid = false;
                $er_mail = "Le mail ne peut pas être vide";


                // On vérifit que le mail est dans le bon format
            }elseif(!preg_match("/^[a-z0-9\-_.]+@[a-z]+\.[a-z]{2,3}$/i", $mail)){
                $valid = false;
                $er_mail = "Le mail n'est pas valide";


            }else{
                // On vérifit que le mail est disponible
                $req_mail = $DB->query("SELECT mail FROM utilisateur WHERE mail = ?",
                    array($mail));


                $req_mail = $req_mail->fetch();


                if ($req_mail['mail'] <> ""){
                    $valid = false;
                    $er_mail = "Ce mail existe déjà";
                }
            }


            // Vérification du mot de passe
            if(empty($mdp)) {
                $valid = false;
                $er_mdp = "Le mot de passe ne peut pas être vide";


            }elseif($mdp != $confmdp){
                $valid = false;
                $er_mdp = "La confirmation du mot de passe ne correspond pas";
            }


            // Si toutes les conditions sont remplies alors on fait le traitement
            if($valid){
                $mdp = crypt($mdp, '$6$rounds=5000$$2a$07$J2ihDv8vVf7QZ9BsaRrKyqs2tkn55Yq$');


                $date_creation_compte = date('Y-m-d H:i:s');


                $token = bin2hex(random_bytes(12));



                // On insert nos données dans la table utilisateur
                $DB->insert("INSERT INTO utilisateur (nom, prenom, mail, mdp, date_creation_compte, token) 
                    VALUES 
                    (?, ?, ?, ?, ?, ?)", 
                    array($nom, $prenom, $mail, $mdp, $date_creation_compte, $token));


                $req = $DB->query("SELECT *
                 FROM utilisateur
                  WHERE mail = ?",
                  array($mail));
                  
                $req = $req->fetch();
                 
                $mail_to = $req['mail']; 
                 
                //=====Création du header de l'e-mail.
                $header = "From: no-reply <no-reply@gmail.com>\n";
                $header .= "MIME-version: 1.0\n";
                $header .= "Content-type: text/html; charset=utf-8\n";
                $header .= "Content-Transfer-ncoding: 8bit";
                //=======
                 
                //=====Ajout du message au format HTML          
                $contenu = '<p>Bonjour ' . $req['nom'] . ',</p><br>
                <p>Veuillez confirmer votre compte <a href="http://51.91.174.227/conf.php?id=' . $req['id'] . '&token=' . $token . '">Valider</a><p>';
                          
                mail($mail_to, 'Confirmation de votre compte', $contenu, $header);



                header('Location: index.php');
                exit;
            }
        }
    }
?>
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Inscription</title>
    </head>


    <body>      
        <div>Inscription</div>
        <form method="post">


            <?php
                // S'il y a une erreur sur le nom alors on affiche
                if (isset($er_nom)){
                ?>
                    <div><?= $er_nom ?></div>
                <?php   
                }
            ?>
            <input type="text" placeholder="Votre nom" name="nom" value="<?php if(isset($nom)){ echo $nom; }?>" required>   


            <?php
                if (isset($er_prenom)){
                ?>
                    <div><?= $er_prenom ?></div>
                <?php   
                }
            ?>
            <input type="text" placeholder="Votre prénom" name="prenom" value="<?php if(isset($prenom)){ echo $prenom; }?>" required>   


            <?php
                if (isset($er_mail)){
                ?>
                    <div><?= $er_mail ?></div>
                <?php   
                }
            ?>
            <input type="email" placeholder="Adresse mail" name="mail" value="<?php if(isset($mail)){ echo $mail; }?>" required>


            <?php
                if (isset($er_mdp)){
                ?>
                    <div><?= $er_mdp ?></div>
                <?php   
                }
            ?>
            <input type="password" placeholder="Mot de passe" name="mdp" value="<?php if(isset($mdp)){ echo $mdp; }?>" required>
            <input type="password" placeholder="Confirmer le mot de passe" name="confmdp" required>


                <button type="submit" name="inscription">Envoyer</button>


        </form>
    </body>
</html>

Hello @fredoloulou,


Quand tu reçois le mail, tu dois cliquer sur un bouton ou obtenir le lien qui doit valider le compte... C'est ça et seulement ça, rien de plus...

Le message d'erreur que tu reçois est le fait que tu n'as pas défini ta variable "valid"...

Cette pub permet au site de vivre ...