8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je coince depuis un moment sur la mise place d'un contrôle de validité regex d'un mot de passe dans un code de réinitialisation de ce mot de passe.
//$mdp = $_POST['password'];
//(preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{6,12}$/', $mdp))

Comment coder ce contrôle de façon à afficher un message d'erreur comme celui_ci :
$_SESSION['flash']['error'] = "Ce token n'est pas valide";


Le code de réinitialisation :
<?php

if(isset($_GET['id']) && isset($_GET['token'])){
    require 'inc/db.php';
    require 'inc/functions.php';
    $req = $pdo->prepare('SELECT * FROM users WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)');
    $req->execute([$_GET['id'], $_GET['token']]);
    $user = $req->fetch();

//$mdp = $_POST['password'];
//(preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{6,12}$/', $mdp))

    if($user){
        if(!empty($_POST)){
            if(!empty($_POST['password']) && $_POST['password'] == $_POST['password_confirm']){
                $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
                $pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $_GET['id']]);		
				session_start();				
                $_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié';
                $_SESSION['auth'] = $user;
                header('Location: account.php');
                exit();
            }
        }
    }else{
        session_start();
        $_SESSION['flash']['error'] = "Ce token n'est pas valide";
        header('Location: login.php');
        exit();
    }
}else{
    header('Location: login.php');
    exit();
}
?>


Merci par avance pour votre aide
Cordialement
Patrick Mara
Bonjour Patrick,

Dans la documentation PHP, preg_match() retourne 1 si le pattern fourni correspond, 0 s'il ne correspond pas, ou false si une erreur survient.

Vous pourriez vous baser sur ce résultat au sein d'une condition pour vous assurer que le mot de passe saisi corresponde bien ?

Un simple if comme ceci pourrait suffire :
if( (preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{6,12}$/', $mdp)) )
{
  // Le mot de passe est validé
}
else 
{
  // Le mot de passe n'est pas validé
}
Bonjour,

Merci d'avoir prêté attention à mon sujet.
Ce n'est pas le test qui me pose problème, c'est son intégration dans le code de réinitialisation.

Il faudrait que le message s'affiche dans la page.
Si j'intègre le test dans le code, le message de réponse s'affiche seul en haut de l'écran, la page ne s'affiche plus.

Cordialement
Patrick Mara
Bonjour Patrick,

Désolé pour ma réponse tardive, je suis en plein déménagement ici ^^
Je ne suis pas sûr d'avoir bien compris le problème, mais je tente quand même Smiley smile

pmara a écrit :
Il faudrait que le message s'affiche dans la page.

Vous utilisez déjà $_SESSION pour gérer vos messages d'erreur, pourquoi ne pas suivre la même logique ? Vous pouvez tout à fait faire, dans votre HTML, un simple echo du $_SESSION du message d'erreur... peu importe là où vous vous trouvez.

Ou sinon, utiliser une variable $error et l'afficher dans le HTML uniquement si elle existe ?
<?php
if( (preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{6,12}$/', $mdp)) )
{
  // Le mot de passe est validé, le script continue
}
else 
{
  // Le mot de passe n'est pas validé :
  $error = "Votre mot de passe doit contenir entre 6 et 12 caractères etc...";
}
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
  </head>
  <body>
    <?php 
    if (isset($error)) { 
      echo $error; 
    } ?>
  </body>
</html>


Je ne vois pas trop où se situe votre problème, si je suis à côté de la plaque n'hésitez pas à me le dire Smiley lol

Bonne fin de journée Smiley smile
Bonjour Loraga,

Ne soyez pas désolé, prenez le temps de déménager.

J'ai bien essayé la variable $error et bien sûr le message s'affiche mais il n'y a plus que le message, plus de page.
J'ai aussi essayé le mimétisme sur $_session mais sans résultat.
Je vais donc me plonger dans les manuels PHP afin d'en savoir plus sur l'instruction :
$_SESSION['flash']['success']

Je publierai la solution si j'en trouve une !

Merci
Cordialement
Patrick Mara
Bonjour Loraga,

Je viens de poster un nouveau le sujet suivant dans l'espoir d'une meilleure audience :
Affichage de la forme $_SESSION['flash']
dans développement.

Je met fin à ce sujet.

Cordialement
Patrick Mara