[RESOLU] ALERT DISSMISSIBLE fonctionne avant action

Eléphant du PHP | 88 Messages

26 févr. 2021, 20:52

Hello tout le monde !

Pourtant j'en ai solutionné des soucis avec mes alertes mais : pas assez :)

j'ai sur mes vues donc: dans du php
<?php if (empty($errors)) : ?>
<div class="alert alert-info alert-dismissible text-center" style="width:380px" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button>
    <p> Vous etes connectés  </p>  
</div>
Pourquoi s'ouvre t'elle avant l'action?
sur mon formulaire se connecter :
elle s'inscrit à l'ouverture de la page : donc avant de pouvoir remplir les input!!!

j'ai bien mes scripts !

je sais pas !

si quelqu'un connait la solution , je veux bien la connaitres !

merci d'avance et passez un bon WE

à tres vite j'espere :)

Eléphant du PHP | 176 Messages

26 févr. 2021, 21:34

Bonsoir,

Il n'y a pas beaucoup de code donc difficile à dire, mais a priori je dirais que à l'ouverture de ta page $errors est toujours vide donc il affiche ton alerte

Il faudrait donc vérifier que ton formulaire a été submit et qu'il n'y a pas d'erreurs
Cordialement
Naroth

Eléphant du PHP | 88 Messages

26 févr. 2021, 23:01

Bonsoir !

voici mon formulaire
<div class="container">
    <div class="d-flex justify-content-center">
        <div class="row" id="form_insc">
            <div class="col-12 text-left">
                <form  action ="<?= $router->url('login_register') ?>" method="POST" name="login_register">
                    <h3 class="box-title text-center"> INSCRIVEZ - VOUS</h3><br>
                    <label for=""> Pseudo</label>
                    <input type="text"  name="username" class="form-control "  />
                    <label for="">Mot de Passe</label>
                    <input type="password" name="password" class="form-control" />
                    <label for="">Confirmez votre MP</label>
                    <input type="password" name="password_confirm" class="form-control"  /><br>
                        <div class="d-flex justify-content-center">
                        <button type="submit" name="envoyer" class="btn btn-danger mb-2">S'INSCRIRE</button>
                        </div>
                </form>
            </div>
        </div>
    </div>
</div>
il fonctionne ! je peux autant connecter que inscrire avec l'autre qui est quazi identique si ce n'est les libelles
un dd de $errors donne
^ array:2 [▼
"password" => "Votre mot de passe ne correspond pas ou n'est pas rempli correctement!"
"username" => " votre pseudo n'est pas correct "
]
donc je dirai qu'il est plutot rempli alors que mon formulaire non, puisque ces messages arrivent avant justement de pouvoir le remplir !! bizarre

Avatar du membre
Mammouth du PHP | 1564 Messages

27 févr. 2021, 16:31

schéma:
//déclarer $errors
$errors=[contenu du tableau];

//traitement du form:
si aucune erreur: vidage du tableau $errors


?>
- code alert avec le if empty

- code formulaire...



Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 mars 2021, 11:10

Salutations !

Ta réponse est là : "si aucune erreur: vidage du tableau $errors". Quand tu arrives sur ton formulaires pour la première fois, tu n'as pas (encore) d'erreur. Ta variable $errors est nulle ou vide et ton test if (empty($errors)) est donc vrai, ce qui affiche le message d'alerte.

Il te manque une condition pour n'afficher ce message que si le formulaire a été envoyé ET qu'il ne contient effectivement pas d'erreur :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 88 Messages

01 mars 2021, 18:39

hello ! je deprime :(

donc il faut que je mette avant un truc comme :
<?php
if (isset($_POST['envoyer'])) {
pour qu'il comprenne que j'ai pas encore rempli le formulaire???
#-o #-o #-o :shock: :oops:

ba oui mais c'est bien sur!!!! il est con ce PHP :)

et moi super C.....

Mais si j'ai le meme genre de souci avec un message qui s'ouvre avant et que j'ai pas de formulaire?????

j' ai fait :
<?php if (isset($_POST['envoyer'])) {
}
if (!empty($errors)): ?>{
<div class="alert alert-info alert-dismissible" style="width: 700px;" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button>
    <p> les champs ne sont pas conforment</p>
    <ul>
}
        <?php foreach ($errors as $error): ?>
        <li><?= $error; ?> </li>
        <?php endforeach; ?>
    </ul>
</div>

<?php  endif;?>
}

JE CROIS QUE Ca marche pas ! :shock:

Merci pour votre patience !

et je fais pareil meme si j'ai pas de formulaire?

Eléphant du PHP | 176 Messages

01 mars 2021, 19:39

Bonsoir,

Si je reprend depuis le début, tu as un formulaire qui peut être dans 3 états différents :
1. Le formulaire n'a jamais été soumis
2. Le formulaire a été soumis et il n'y a pas d'erreur
3. Le formulaire a été soumis et il y a des erreurs

Ton code doit gérer les 3 cas

Un petit exemple a adapter pour ton besoin
if( empty($_POST)) {
    echo "1. Le formulaire n'a jamais été soumis"
}
else if( !empty($_POST) && empty($errors)) {
    echo "2. Le formulaire a été soumis et il n'y a pas d'erreur"
}
else {
    echo "3. Le formulaire a été soumis et il y a des erreurs"
}
Cordialement
Naroth

Eléphant du PHP | 88 Messages

01 mars 2021, 20:00

Merci bcp
je vais appliquer les 3 cas pour voir
merci

sauf que j'ai un autre cas un peu similaire :
et ca ne marche pas !
lorsque je remplis mon formulaire de connection membre :
<div class="container">
    <div class="d-flex justify-content-center mb-5">
        <div class="row" id="login">
            <div class="col-12 text-left">
                <form  action ="<?= $router->url('login_member') ?>" method="POST" name="login_member" >
                    <h3 class="box-title text-center mt-3"> MEMBRES : Connectez-vous ici</h3><br>
                    <label for="Pseudo"> Pseudo</label>
                    <input type="text"  name="username" class="form-control my-3"  />
                    <label for="mot de passe">Mot de Passe</label>
                    <input type="password" name="password" class="form-control my-3" />
                        <div class="d-flex justify-content-center"><br>
                        <button type="submit" name="envoyer" class="btn btn-danger mt-5 ">LOGIN ->
                    <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" fill="currentColor"
                        class="bi bi-emoji-smile" viewBox="0 0 16 16">
                        <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" />
                        <path d="M4.285 9.567a.5.5 0 0 1 .683.183A3.498 3.498 0 0 0 8 11.5a3.498 3.498 0 0 0 3.032-1.75.5.5 0 1 1
                                                .866.5A4.498 4.498 0 0 1 8 12.5a4.498 4.498 0 0 1-3.898-2.25.5.5 0 0 1 .183-.683zM7 6.5C7 7.328 6.552 8 6 8s-1-.672-1-1.5S5.448 5 6 5s1 .672 1 1.5zm4 0c0
                                                .828-.448 1.5-1 1.5s-1-.672-1-1.5S9.448 5 10 5s1 .672 1 1.5z" />
                        </svg>
                        </div>
                </form>
            </div>
        </div>
mon controller membre :
<?php
session_start();

use App\Model\User;
use App\Connection;
use App\Model\UserManager;

$pdo = Connection:: getPDO();
$user = new User();
$userManager = new UserManager($pdo);
$errors = array();

if (!empty($_POST)) {
    $user = $userManager->findByUsernameAndPassword($_POST['username'], $_POST['password'] );
    if (!empty($user)) {
        $success = true;
        $_SESSION['auth'] = $user;
        header('Location: ' . $router->url('blog'));
        exit();
    } else {
        $errors ['username'] =  'Merci de rentrer un mot de passe correct!';
    }
}
require_once('../views/auth/login_member.php');
et j'ai mis un message alert sur ma page blog puisque c'est mon header('location.... blog)! :
j'ai fait pareil :
<?php if(!empty($_POST ['envoyer'])) {
}
if (!empty($success)) : ?> 
<div class="alert alert-info alert-dismissible text-center" style="width:380px" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button>
    <p> Bienvenue - Vous etes connectés  </p>  
</div>

<?php endif ?>
j'ai bien ( dommage qu'ici on ne puissa pas mettre des capture d ecran ) j'ai bien mon message "vous etes connectes" mais il reste apres tout le temps quand je reviens sur ma page blog !!!!
Modifié en dernier par Beebeepc le 01 mars 2021, 20:09, modifié 1 fois.

Mammouth du PHP | 2703 Messages

01 mars 2021, 20:05

si $errors est vide au début de la page, il y a juste à tester :
if (!empty($errors)):
avant de vouloir afficher les erreurs.

Eléphant du PHP | 88 Messages

02 mars 2021, 10:37

hello or1
ok mais si je test ce que tu m'as dit !! la connection oui sefait mais je n'aiplus de message !!

Eléphant du PHP | 88 Messages

02 mars 2021, 13:06

En fait je comprends pas parce que moi ce que j'en traduis :
c'est si mon utilisateur n'est pas vide : donc c'est $success : true puisqu il a trouvé les infos findbyusernameandpassword!

donc pourquoi si sur la page ou doit apparaitre l'alerte ne correspondrait pas à ce qui est mis sur index.php !!!!!
$pdo = Connection:: getPDO();
$user = new User();
$userManager = new UserManager($pdo);
$errors = array();


if (!empty($_POST)) {
    $user = $userManager->findByUsernameAndPassword($_POST['username'], $_POST['password'] );
    if (!empty($user)) {
        $success = true;
    dd($success);
        $_SESSION['auth'] = $user;
        header('Location: ' . $router->url('blog'));
        exit();

    } else {
        $errors ['username'] =  'Merci de rentrer un mot de passe correct!';
    }
}
require_once('../views/auth/login_member.php');
dans index.php j'ai l'alerte : donc ussi si $success n'est pas vide donc true : j'ecris sur ma page :
vous etes connectés !! et c'est pas en lui mettant un if (isset($_POST['envoyer'] qui change quoi que ce soit !!!
<?php  if (!empty($uccess)) :?> 
<div class="alert alert-info alert-dismissible text-center" style="width:380px" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button>
    <p> Bienvenue - Vous etes connectés  </p>  
</div>

<?php endif ?>
franchement je suis peut etre pas douée !!! meme sure !!! et bien je comprends pas sauf si ce n'est que ce soit un probleme de php en lui meme qui ne veut pas qu'une alerte intervienne sur une autre page que celle du require mais dans ce cas là il apparaitrait meme pas !

Mammouth du PHP | 2703 Messages

02 mars 2021, 13:54

header('Location: ' . $router->url('blog'));
exit();

en cas de login réussi, il y a redirection de page, donc php oublie tout ce qui a été fait dans la page de vérification de login. un moyen est de passer par une session pour savoir, sur une autre page, qu'il faut dire bienvenue. une autre solution est de faire la vérification de login sur toutes les pages, d'afficher l'éventuel message sur toutes les pages, sans charger une autre page, donc plus besoin de session pour dire bienvenue.

Eléphant du PHP | 88 Messages

02 mars 2021, 18:36

php est comme moi alors !!! il oubli !!! :) c'est nul !
donc cela veut dire que je devrais remplacer mes <?php if (!empty($errors)): ?> par des $_SESSION?

et changer mes if par session!

Eléphant du PHP | 88 Messages

03 mars 2021, 16:23

j'ai supprimé mes isset et j'ai mis des S_SESSION comme tu m'as dit :
<?php if (!empty($_SESSION['auth']) && $_SESSION['premier_affichage']==true) :
$_SESSION['premier_affichage']=false;?>

c'est good il comprend donc que du coup : il faut que ce soit pas vide mais qu'apres le 1er affichage ca sera false !

merci pour vos conseils
j'avance doucement mais surement !!
à bientot pour d'autres questions :)