bonjour a tous

pour l'instant mon site fonctionne super bien et depuis un petit moment j'ai des utilisateurs qui s'enregistre avec des adresses email bidon

je souhaiterais donc pouvoir un email de confirmation a leur adresse email
Mais comment m' y prendre

Apparemment je devrais créer deux nouveaux champs un token_user et un pour la confirmation "confirmer "

voici mon code existant que j'ai commencer a modifier

<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('display_startup_errors', true);
?>
<?php
// je me connecte a la base de donnee
require_once 'base.php';
//si tous est ok alors on passe a l inscription
if (!empty($_POST['pseudo']) && !empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['password_retype']))
{
$password = ($_POST['password']);
$password_retype = ($_POST['password_retype']);
//preparation des variables propres
$pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
$email = !empty($_POST['email']) ? $_POST['email'] : NULL;
//préparation de la requête et des variables afin de vérifier si l email est présent dans la table
$sql = "SELECT pseudo, email, password 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);
}
$data = $requete->fetch();
$row = $requete->rowCount();
if ($row == 0)
{
//préparation de la requête et des variables afin de verifier si le pseudo est present dans la table
$sql = "SELECT pseudo, email, password FROM utilisateurs WHERE pseudo = ?";
$datas = [$pseudo];
//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);
}
$data = $requete->fetch();
$row = $requete->rowCount();
//on verifie que le pseudo n est pas present
if ($row == 0)
{ //on verifie que le pseudo fais moins de 40 caractere
if (strlen($pseudo) <= 30)
{ //on verifie que le email fais moins de 40 caractere
if (strlen($email) <= 35)
{
if(preg_match('/^[a-z_\-0-9]+$/i', $pseudo))//on verifie les caracteres
{
if (filter_var($email, FILTER_VALIDATE_EMAIL)) //on verifie que c est bien une email
{
if ($password == $password_retype)
{ //on verifie que le pasword retape correpond bien au passord
$cost = ['cost' => 12];
$password = password_hash($password, PASSWORD_BCRYPT, $cost);
$ip = $_SERVER['REMOTE_ADDR'];
$insert = $bdd->prepare('INSERT INTO utilisateurs(pseudo, email, password, ip, token) VALUES(:pseudo, :email, [langue]assword, :ip, :token)');
$insert->execute(array('pseudo' => $pseudo,'email' => $email,'password' => $password,'ip' => $ip,'token' => bin2hex(openssl_random_pseudo_bytes(24)),'token_user' => bin2hex(openssl_random_pseudo_bytes(24)),'confirmer' => $confirmer);
//traitement de l envois par mail a l'utilisateur
setlocale (LC_TIME, 'fr_FR.utf8','fra');
date_default_timezone_set('Europe/Brussels');
$date1 = date('d-m-Y H:i:s'); // Date du jour
// on entre l'adresse email du membre
$to = '$email'; // notez la virgule
// Sujet
$subject= "Votre lien de confirmation ";
// message
$message =
'
<html>
<head>
<title>voici votre lien de confirmation </title>
</head>
<body>
<table>
<tr>
<td>le lien est </td><td><a href="https://phil.pecheperle.be/validation.php?'.id=$id&token_user=$token_user.'">Votre lien de confirmation</a></td></br>
</tr>
</table>
</body>
</html>	';
// Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'content-type: text/html; charset=utf-8';
// En-têtes additionnels
//$headers[] = "From: " . $name . "<". $_POST["email"] .">\r\n";
$headers[] = 'From: '.$email."\r\n".
'Reply-To: '.$name."\r\n" .
'X-Mailer: PHP/' . phpversion();
// Envoi
//var_dump($headers);
if(mail($to, $subject, $message, implode("\r\n", $headers))){
// success message
//echo "Success!<br />";
}else{
// error message
//echo "Fail<br />";
header('Location:redirection-inscription.php?reg_err=success');
 die();
}
else
{
header('Location: inscription.php?reg_err=password');
die();
}
}
else
{
header('Location: inscription.php?reg_err=email');
die();
}
}
else
{
header('Location: inscription.php?reg_err=pseudo_caractere');
die();
}
}
else
{
header('Location: inscription.php?reg_err=email_length');
die();
}
}
else
{
header('Location: inscription.php?reg_err=pseudo_length');
die();
}
}
else
{
header('Location: inscription.php?reg_err=already');
die();
}
}
else
{
header('Location: inscription.php?reg_err=already');
die();
}
}


ensuite je dois donc créer le fichier de validation que je vais envoyer

<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('display_startup_errors', true);
require 'includes/db.php';
//on cree une variable pour la comparer
$tokenUser= !empty($_POST['tokenUser']) ? $_POST['tokenUser'] : NULL;
$id= !empty($_POST['id']) ? $_POST['id'] : NULL;
$req = $bdd->prepare('SELECT id, token_user ,confirmer FROM membre WHERE id = ?*:id');
if($req->execute(array(':id' => $id)) && $resultat = $req->fetch()){
$tokenUser = $resultat['token_user'];
$activation = $resultat['confirmer'];
if($activation != NULL) {
echo("votre compte est déjà activé");
} else {
if($tokenUser == $token_user) {
echo("Votre compte est activé");
} else {
echo("Cette clé ne correspond pas");
}
}
}
?>

ensuite je dois mettre a jour le confirmer et c'est la ou je bloque
comment utiliser la requête update
Salut,

a priori ça devrait être un truc du genre :


UPDATE membre
set Activated="True" 
WHERE  id=:id AND token_user=:tokenUser


On doit pouvoir éventuellement stocker une date d'activation ou autre si nécessaire.

Après pour ton code je trouve un peu bizarre d'avoir toute cette imbrication de if else Smiley ohwell

Genre :
if ($row == 0)
{  ....... } else{ header('Location: inscription.php?reg_err=already');
die(); }

Tu devrais pouvoir le remplacer simplement par :

if ($row != 0){
  header('Location: inscription.php?reg_err=already');
  die();
}


Cela t'évite d'avoir un si gros niveau d'imbrication Smiley sweatdrop
Modifié par Mathieuu (10 May 2022 - 12:03)
Salut Mathieu
Merci de ta réponse
Donc première étape je dois bien ajouter deux colonnes dans ma base de donnée
token_user et confirme ?

puis je dois inscrire un token_user aléatoire et mettre confirme sur 0
de cette façon

$insert = $bdd->prepare('INSERT INTO utilisateurs(pseudo, email, password, ip, token,token_user,confirme) VALUES(:pseudo, :email, password, :ip, :token, :token_user,:confirme)');
$confirmer=0
$insert->execute(array('pseudo' => $pseudo,'email' => $email,'password' => $password,'ip' => $ip,'token' => bin2hex(openssl_random_pseudo_bytes(24)),'token_user' => bin2hex(openssl_random_pseudo_bytes(24)),'confirmer' => $confirmer);


envoyer un email a l'utilisateur

<a href="https://phil.pecheperle.be/validation.php?'.id=$id&token_user=$token_user.'">Votre lien de confirmation</a>


puis créer le fichier validation.php
avec ceci

UPDATE membre
set Activated="True" 
WHERE  id=:id AND token_user=:tokenUser
Meilleure solution
Ah moi j'ai proposé ça comme ça rapidement juste pour illustrer un update, dans mon cas la colonne s'appelle "Activated" mais il n'y a pas de règle je pense, il faudrait que ça reste cohérent avec le reste de tes champs (à la limite en anglais je dirais 'confirmed' plutôt que 'confirme' pour restait sur la logique de 'token_user')

Après une autre solution pourrait être d'avoir une colonne de 'statut' qui contiendrait le token au départ puis que tu ferais évoluer ensuite (activer/suspendu/supprimé) mais j'aime pas trop avoir des colonnes à usage multiple Smiley ohwell
Modifié par Mathieuu (10 May 2022 - 14:41)
ah d 'accord donc je remplace activated par confirmed

Mais je dois aussi faire un contrôle dans le fichier validation.php que j'ai en face de moi le bon id et le bon token_user