Erreur : Undefined variable - PHP

Résolu/Fermé
Dragonfly03_CCS Messages postés 11 Date d'inscription lundi 28 décembre 2020 Statut Membre Dernière intervention 31 mai 2023 - 24 juil. 2021 à 14:21
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 - 25 juil. 2021 à 11:40
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

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
24 juil. 2021 à 15:00
bonjour,
merci de préciser le langage quand tu utilises les balises de code. explications: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

merci aussi de préciser le nom des fichiers que tu montres.

merci encore de partager du texte, et pas des images.

le message d'erreur indique que tu lis le contenu de $valid avant d'y avoir assigné une valeur.
0
Dragonfly03_CCS Messages postés 11 Date d'inscription lundi 28 décembre 2020 Statut Membre Dernière intervention 31 mai 2023
24 juil. 2021 à 15:27
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
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
24 juil. 2021 à 15:29
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.
0
Dragonfly03_CCS Messages postés 11 Date d'inscription lundi 28 décembre 2020 Statut Membre Dernière intervention 31 mai 2023 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
Modifié le 25 juil. 2021 à 09:06
?
Je suis debutant en PHP.
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > Dragonfly03_CCS Messages postés 11 Date d'inscription lundi 28 décembre 2020 Statut Membre Dernière intervention 31 mai 2023
25 juil. 2021 à 11:40
il est peut-être préférable de commencer par des exercices plus simples, pour comprendre la logique.
0
Dragonfly03_CCS Messages postés 11 Date d'inscription lundi 28 décembre 2020 Statut Membre Dernière intervention 31 mai 2023
24 juil. 2021 à 15:29
- 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 ?
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
25 juil. 2021 à 11:39
examine ton code.
il est nécessaire qu'une instruction
$valid=
soit exécutée avant l'instruction qui provoque le message d'erreur.
0