Erreur : Undefined variable - PHP

Résolu
Bonjour,
Je voudrais créer un site internet avec une page d'inscription. J'ai donc suivi les tutoriels du "Site du dev" : https://www.sitedudev.com/cours/creer-son-site . Mais j'ai un problème au niveau de la vérification par email car l'erreur suivante s'affiche :
https://www.zupimages.net/up/21/29/giq1.png

Voici le code de la page d'inscription :

<?php
session_start();

include('bd/connexionDB.php');

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

if(!empty($_POST)){
extract($_POST);
$valid = true;

if (isset($_POST['inscription'])){

$nom = htmlentities(trim($nom));
$prenom = htmlentities(trim($prenom));
$mail = htmlentities(strtolower(trim($mail)));
$mdp = trim($mdp);
$confmdp = trim($confmdp);

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

if(empty($prenom)){
$valid = false;
$er_prenom = ("Le prenom d' utilisateur ne peut pas être vide");
}

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

}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{
$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à";
}
}

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";
}

if($valid){

$mdp = crypt($mdp, '$6$rounds=5000$Mon crypt$');

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

$token = bin2hex(random_bytes(12));

$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@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://lesite.fr/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 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>


De ma page de confirmation :

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);

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

if(!isset($id)){
$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 est erroné";
}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é";
}
}
?>


Et voici ma DB :

https://www.zupimages.net/up/21/29/5e0m.png

3 réponses

  1. - le message d'erreur indique que tu lis le contenu de $valid avant d'y avoir assigné une valeur.

    Comment je peux régler le problème du coup ?
    1. Contributeur
      examine ton code.
      il est nécessaire qu'une instruction
      $valid=
      soit exécutée avant l'instruction qui provoque le message d'erreur.
  2. Salut,
    Voilà pour le code avec le langage :

    PAGE INSCRIPTION (inscription.php) :

    <?php
        session_start();
    
        include('bd/connexionDB.php');
    
    
        if (isset($_SESSION['id'])){
            header('Location: index.php');    
            exit;
        }
     
        if(!empty($_POST)){
            extract($_POST);
            $valid = true;
    
            if (isset($_POST['inscription'])){
    
                $nom     = htmlentities(trim($nom));
                $prenom = htmlentities(trim($prenom));
                $mail = htmlentities(strtolower(trim($mail)));
                $mdp = trim($mdp); 
                $confmdp = trim($confmdp);
    
                if(empty($nom)){
                    $valid = false;
                    $er_nom = ("Le nom d' utilisateur ne peut pas être vide");
                }
     
                if(empty($prenom)){
                    $valid = false;
                    $er_prenom = ("Le prenom d' utilisateur ne peut pas être vide");
                }                   
     
                if(empty($mail)){
                    $valid = false;
                    $er_mail = "Le mail ne peut pas être vide";
     
    
                }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{
                    $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à";
                    }
                }
     
                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";
                }
     
    
                if($valid){
     
                    $mdp = crypt($mdp, '$6$rounds=5000$Mon crypt$');
                    
                    $date_creation_compte = date('Y-m-d H:i:s');
     
                    $token = bin2hex(random_bytes(12));
    
                    $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@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://lesite.fr/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 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>


    PAGE CONFIRMATION (conf.php) :

    <?php
    	error_reporting(E_ALL);
    	ini_set("display_errors", 1);
    
    	$id = (int) $_GET['id'];
    	$token = (String) htmlentities($_GET['token']); 
    
    	if(!isset($id)){
    		$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 est erroné";
    		}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é";
    		}
    	}
    ?>


    Et voilà l'erreur : Notice: Undefined variable: valid in /var/www/vhosts/groupe-anti-pollution.org/dev.groupe-anti-pollution.org/conf.php on line 18
    1. Contributeur
      le message d'erreur indique que tu lis le contenu de $valid avant d'y avoir assigné une valeur.
      la solution me semble assez évidente.
    2. @yg_be?
      Je suis debutant en PHP.
    3. Contributeur
      @Dragonfly03_CCSil est peut-être préférable de commencer par des exercices plus simples, pour comprendre la logique.