Bonjour à tous,
J'ai dans un espace membre un formulaire d'inscription, coté serveur je contrôle si une adresse mail existe déjà dans la table membres afin d'éviter tout problème. J'utilise le contôle de recaptcha V3 de Google pour protéger le formulaire. L'insertion fonction correctement, ainsi que l'envoi du mail pour valider l'inscription.
Ce qu'il ne marche pas c'est que l'on peut s'incrire avce la même adresse mail.

"
<?php
require_once 'inc/functions.php';
 require_once 'inc/db.php';
session_start();
// traitement du formulaire
if(isset($_POST['valider'])) {
  $errors = array(); // init variable pour les messages d'erreurs
 // si le g-token est vide
    if(empty($_POST['g-token'])){
        header('location:index.php'); // on renvoie à la page d'acceuil du site
    }
    //Si g-token n'est pas vide alors
    else {
           // Echange avec API de Google
        $secret   = '*********************************************';
        $response = $_POST['g-token'];
        $remoteip = $_SERVER['REMOTE_ADDR'];
        $url      = 'https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$response.'&remoteip='.$remoteip;
        $req     = file_get_contents($url);
        $reponse = json_decode($req);
        // si la réponse est un succès

        if($reponse->success){
            $username =strip_tags($_POST['username']);
            $email = strip_tags($_POST['email']);
            $password = strip_tags($_POST['password']);
            $password_confirm = strip_tags($_POST['password_confirm']);
            $nom_entreprise = strip_tags($_POST['nom_entreprise']);

        }

  if (empty($username) || !preg_match('/^[a-zA-Z]/', $username)) {
    $errors['username'] = "Votre Nom et Prénom ne sont pas valide (Alpha)";
  } else {
    // ici on test si un pseudo existe déja avec le même nom
    $req = $pdo->prepare('SELECT id FROM membres WHERE username = ?');
    $req->execute($username);
    $user = $req->fetch();
    if ($user) {
      $errors['username'] = 'Ce Nom et Prénom existe déjà';
    }
  }
  if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors['email'] = "Votre Email n'est pas valide";
  } else {
    // ici on test si un email existe déja
    $req = $pdo->prepare('SELECT id FROM membres WHERE email = ?');
    $req->execute($email);
    $user = $req->fetch();
    if ($user) {
      $errors['email'] = "Cet Email est déjà utilisé pour un autre compte";
    }
  }
  if (empty($password) || $password != $password_confirm) {
    $errors['password'] = "Votre Mot de passe n'est pas valide";
  }

  // on insert si le tableau error est vide
  if (empty($errors)) {

    $req = $pdo->prepare("INSERT INTO membres SET username =?, password =?, email =? , ref_profil=?,nom_entreprise=?, confirmation_token =?");
    $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
    $token = str_random(60);
    $req->execute([$_POST['username'], $password, $_POST['email'], $_POST['ref_profil'], $_POST['nom_entreprise'], $token]);
    $user_id = $pdo->lastInsertId();

    // ici le code pour le mail en html via smtp
    .....
"

Ce que je veux

Je souhaiterai éviter les doublons d'adresse mails, et que la variable $errors affiche bien : Cet Email est déjà utilisé pour un autre compte

Ce que j'obtiens
Je n'ai pas d'erreur de code quand la page est excécuté, mais la possibilité d'avoir deux membres différents avec la même adresss mail, et çà ce n'est pas cool.
Merci de votre aide, car je ne sais pas où ça pêche.
Bonne Journée

5 réponses


Carouge10
Réponse acceptée

pour mettre ton sujet en résolu.
tu as un bouton pour cela. il apparaît quand tu passes sur les messages qui ton aidé

Bonjour,
Pour ton select sur l'email, il manque le "array" dans ton execute. $email n'est pas un tableau (idem username)
pas de strip_tags sur les données entrée en bdd (si ton user veut entrer "<br>toto" comme mdp, il ne sera forcément modifier)
username est différent de nom + prénom (comment fais-tu en cas d'homonyme ?)

Bonjour Carouge 10,
Merci de te pencher sur mon problème, pour le email il faut faudrait faire : $req->execute( $_POST['email'] ); , idem pour le username ?
Pour le strip_tags, je ne souhaite pas de balises html , alors faudrait faire comment pour éviter les injections, utiliser : htmlspecialchars ?
Pour les nom + prénom , c'est pas le plus important, mais les inscriptiosn, sont souvant un pseudo, mais si tu as une solution ou une piste, je suis preneur.

  • regarder comment tu as pour le execute de l'insertion...
  • ne pas confondre injection et faille XSS. strip_tags et/ou htmlspecialchars s'utilisent à l'affichage
  • l'email lui est unique, d'où le fait de le vérifier mais aussi de mettre le champs email de la bdd en "unique"

Merci Carouge10,
C'est tout bon, j'ai modifié mon ligne comme ceci : $req->execute([$_POST['username']]); et idem pour l'adresse mail. $req->execute([$_POST['email']]);
J'ai testé le message d'erreur indique bien ce que je souhaitais.
Problème résolu