Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je suis en train de créer un espace membre en php, et je veux que quand un email ou mot de passe n'est pas valide, l'utilisateur en soit informé.

<?php
require_once 'inc/functions.php';
session_start();

if(!empty($_POST)) {

    $errors = array();
  require_once 'inc/db.php';

if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
    $errors['username'] = "Votre pseudo n'est pas valide";
    }
} else {
    require_once 'inc/db.php';
    $req = $pdo->prepare('SELECT id FROM users WHERE username = ?');
    if (isset($_POST['username'])) {
    $username = $_POST['username'];
    $req->execute([$_POST['username']]);
    $user = $req->fetch();
    if($user){
      $errors['username'] = 'Ce pseudo est déjà utilisé';
    }
  }
}
if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
    $errors['email'] = "Votre Email n'est pas valide";
} else {
    require_once 'inc/db.php';
    $req = $pdo->prepare('SELECT id FROM users WHERE email = ?');
    $req->execute([$_POST['email']]);
    $user = $req->fetch();
    if($user){
      $errors['email'] = 'Cet Email est déjà utilisé pour un autre compte';
    }
  }

if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) {
    $errors['password'] = "Votre Mot de Passe n'est pas valide";
}
if(empty($errors)){
$req = $pdo->prepare("INSERT INTO users SET username = ?, password = ?, email = ?, token = ?");
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
$token = str_random(60);
$req->execute([$_POST['username'], $password, $_POST['email'], $token]);
$user_id = $pdo->lastInsertId();
mail($_POST['email'], 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien/n/nhttp://localhost/projet/inscription/inc/confirm.php?id=$user_id&token=$token");
$_SESSION['flash']['success'] = 'Un email de confirmation vous à été envoyé';
header('Location: inc/login.php');
exit();
}
  debug($errors);

 ?>

Ce que j'obtiens

Dans mon cas, dès que je rentre sur la page, les erreurs 'Votre Email n'est pas valide' et 'Votre Mot de Passe n'est pas valide' s'affiche alors que je n'ai pas encore cliquez sur S'inscrire(L'erreur "Votre pseudo n'est pas valide" ne s'affiche pas directement donc ça c'est bon).
Je voudrais que les erreurs s'affiche seulement après que l'utilisateur ai cliquez sur S'inscrire si que son mot de passe et email n'est pas valide.

2 réponses


TransientDev
Réponse acceptée

Salut,

pense a vérifier que la requete est bien en POST.

if (isset($_POST)) {
 //...
}

Si la requete est en get, forcément POST est null et du coup empty($_POST['password']) retourne vrai.

Cordialement,
TD

ktm_
Auteur

Merci TD, en effet l'erreur "Votre Email n'est pas valide" à disparu lorsque que j'ai isset mais lorsque que je isset le password j'ai une erreur pdo.
Voici le code modifié;

<?php
require_once 'inc/functions.php';
session_start();
if(!empty($_POST)) {

    $errors = array();
  require_once 'inc/db.php';

if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
    $errors['username'] = "Votre pseudo n'est pas valide";
    }
} else {
    require 'inc/db.php';
    $req = $pdo->prepare('SELECT id FROM users WHERE username = ?');
    if (isset($_POST['username'])) {
    $username = $_POST['username'];
    $req->execute([$_POST['username']]);
    $user = $req->fetch();
    if($user){
      $errors['username'] = 'Ce pseudo est déjà utilisé';
    }
  }
}
if (isset($_POST['email'])) {
if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
    $errors['email'] = "Votre Email n'est pas valide";
} else {
    $req = $pdo->prepare('SELECT id FROM users WHERE email = ?');
    $req->execute([$_POST['email']]);
    $user = $req->fetch();
    if($user){
      $errors['email'] = 'Cet Email est déjà utilisé pour un autre compte';
    }
  }
}
if (isset($_POST['password'])) {
if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) {
    $errors['password'] = "Votre Mot de Passe n'est pas valide";
  }
}
if(empty($errors)){
$req = $pdo->prepare("INSERT INTO users SET username = ?, password = ?, email = ?, token = ?");
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
$token = str_random(60);
$req->execute([$_POST['username'], $password, $_POST['email'], $token]);
$user_id = $pdo->lastInsertId();
mail($_POST['email'], 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien/n/nhttp://localhost/projet/inscription/inc/confirm.php?id=$user_id&token=$token");
$_SESSION['flash']['success'] = 'Un email de confirmation vous à été envoyé';
header('Location: inc/login.php');
exit();
}
  debug($errors);

 ?>

Voici les erreurs:
Undefined index: password in C:\wamp64\www\projet\inscription\register.php on line 44

Undefined index: username in C:\wamp64\www\projet\inscription\register.php on line 46

Undefined index: email in C:\wamp64\www\projet\inscription\register.php on line 46

Fatal error: in C:\wamp64\www\projet\inscription\register.php on line 46
( ! ) PDOException: in C:\wamp64\www\projet\inscription\register.php on line 46