Erreur : Undefined variable - PHP

Résolu
Dragonfly03_CCS Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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 10 Date d'inscription   Statut Membre Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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 10 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
?
Je suis debutant en PHP.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Dragonfly03_CCS Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
il est peut-être préférable de commencer par des exercices plus simples, pour comprendre la logique.
0
Dragonfly03_CCS Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
- 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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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