[RESOLU] comment envoyer un email de confirmation lors de l'inscription

Mammouth du PHP | 506 Messages

10 mai 2022, 08:41

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

Code : Tout sélectionner

<?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, :password, :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

Code : Tout sélectionner

<?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

Avatar du membre
Mammouth du PHP | 1564 Messages

10 mai 2022, 09:25

Une colonne suffit : confirmer, à l'inscription ty met une chaine aléatoire que tu envoi à l’utilisateur par mail dans une URL = il clic = tu vérifie si la chaine existe quelque part = tu enlève le contenu de "confirmer".

Puis sur la page de connexion si le contenu de "confirmer" n'est pas vide, l'inscription n'est pas validée.

Mammouth du PHP | 506 Messages

10 mai 2022, 09:33

Merci pour l'aide mais concrètement je mets tout cela comment en place
Donc je cree une colonne token_user
puis j'envois le token_user dans un lien

Mais comment vérifier que la chaine existe quelque part et enlever le contenu confirmer

Avatar du membre
Mammouth du PHP | 1564 Messages

10 mai 2022, 10:27

Vérifier avec une requête basique SELECT : https://sql.sh/cours/select

Mettre à jour avec une requête basique UPDATE : https://sql.sh/cours/update

Mammouth du PHP | 506 Messages

10 mai 2022, 21:48

voila j'ai fini par y arriver