Bonsoir,

Voici une petite fonction que j'essai de mettre en place.

En testant avec mon formulaire je reçois bien les erreurs que je sort dans ma boucle

function errors($messages = []){

    $return = "<div class='notify notify-rouge'><div class='notify-box-content'>";

    foreach($messages as $k => $v){ 

        $return .= '<li>'.$v.'</li>'; 
        var_dump('<li>'.$v.'</li>'); 

    }

    $return .="</div></div>";

    return $return;
}

voici ce que je teste

if((strlen($pass) < 6) || (strlen($pass) > 100)){

            $error = errors(["Le mots de pass est trop court 6 mini ou trop long - 100 caractères"]);

        }if(!empty($pass != $password_confirm)){

            $error = errors(["Vos mots de pass sont diférent"]);

        }

j'affiche mes erreurs comme ceci <?= !empty($error) ? $error : '' ;?> hors dans mon var_dump je retourne bien les deux erreurs mais pas dans le return.

En gros je cherche a retourner toutes les erreurs de mes formulaire avec une fonction c'est plus pratique que de faire un foreach sur chaque page.

J'avoue ne pas trop connaitre les fonction :)

12 réponses


Kenor
Réponse acceptée

Initialise ton $error avant ($error = '';)
Puis à chaque erreur, tu fais un $error .= //appel à ta fonction
(en ajoutant le "point" avant le égal).

Kenor
Réponse acceptée

Retire
$return = "<div class='notify notify-rouge'><div class='notify-box-content'>";
et
$return .="</div></div>";
de ta fonction

Et ajoute-le à la mano après.

PS : div > li , ça n'existe pas

Tu as essayé de faire un var_dump() de ta variable $error ?

Bonjour,

Pourquoi

!empty($pass != $password_confirm)

Et pas juste

$pass != $password_confirm

Et tu peux nous montrer ta fonction errors ?

Car là, ta variable $error contient le retour du premier errors puis est écrasé avec le deuxième.

Après, ru peux essayer un truc du genre

$error =[];

if((strlen($pass) < 6) || (strlen($pass) > 100)){

            $error[] = "Le mots de pass est trop court 6 mini ou trop long - 100 caractères";

        }if(!empty($pass != $password_confirm)){

            $error[] = "Vos mots de pass sont diférent";

        }

 Return $error;

Et la tu as un array avec toutes tes erreurs en lignes.

neecride
Auteur

Bonsoir / jour

Alors pour répondre a exothermique oui j'ai fais un var_dump de ma variable error elle me sort une seul ligne !!

le var dump de $error string '<div class='notify notify-rouge'><div class='notify-box-content'><li>Vos mots de pass sont diférent</li></div></div>'

et le var dump dans ma fonction ou j'ai bien mes deux lignes

string '<li>Le mots de pass est trop court 6 mini ou trop long - 100 caractères</li>' (length=77)
string '<li>Vos mots de pass sont diférent</li>' (length=40)

et pour répondre a eltharin pourquoi !empty($pass != $password_confirm) par ce que je vérifie aussi si c'est vide m'enfin ça sert a rien c'est juste un tique.

Et pour ma fonction error elle est dans mon premier méssage

function errors($messages = []){

    $return = "<div class='notify notify-rouge'><div class='notify-box-content'>";

    foreach($messages as $k => $v){ 

        $return .= '<li>'.$v.'</li>'; // m'en retourne qu'une seul
        var_dump('<li>'.$v.'</li>'); //me retourne deux ligne 

    }

    $return .="</div></div>";

    return $return;
}

le but est que ça m'affiche toute les erreurs qu'il y a dans le même formulaire, je presume que j'ai pas besoin de désigner une var error[ ] puisse que ma fonction le fait avec $messages .

Bonjour,

Le empty est lancé sur ta condition, en gros ca revoens à faire empty(false) si les valeurs sont differentes.

Donc pour moi non ca ne sert à rien, si tu veux dans le même temps tester les deux c'est

If (!empty($pass) && $pass != $password_confirm)

Concernant ta variable message, elle est locale à la fonction, elle ne va pas stocker les deux erreurs.

Ta fonction va prendre cette variable faire un foreach et generer du HTML (en li) pour ce tableau et le retourner.

Ce code HTML généré va alors dans la variable $error de ta fonction principale.

A la deuxième erreur, il recommence la fonction, avec un nouveau $message et génère à nouveau du code et le stocke dans la variable $error en ecrasant toute donnée précédente.

D'ailleurs si tu fais un var_dump après chaque $error =... Tu auras bien deux lignes.

Regarde le code que je t'ai donné au dessus et ajoute à la fin (a la place du return)

Var_dump (errors($error));

Tu devrais avoir deux lignes.

neecride
Auteur

Bizarrement quand je fais un var_dump j'ai deux lignes, je retourne donc ce que je veut, mais quand je fais seleument le echo je n'en ai qu'une.

neecride
Auteur

Merci kenor j'y suis presque, mes erreur ce chevauche.

Alors qu'elle devrait être dans la même div

<div class='notify notify-rouge'>
        <div class='notify-box-content'>
            <li>error 1 </li>
            <li>error 2 </li>
        </div>
</div>

c'est la même fonction sauf que dans mon traitement de formulaire j'ai fais ça

        if((strlen($pass) < 6) || (strlen($pass) > 100)){

            $error = errors(["Le mots de pass est trop court 6 mini ou trop long - 100 caractères"]);

        }if($pass != $password_confirm){

            $error .= errors(["Vos mots de pass sont diférent"]);

        }

et comme c'est une div fixe

.notify {
    width: auto;
    height: auto;
    position: fixed;
    z-index: 5000;
    margin-top: 5px;
    margin-right: 5px;
    right: 0;
    top: 0;
}

je ne vois pas trop comment réglé ça.

neecride
Auteur

Cool ça fonctionne je n'y avais pas pensée merci

neecride
Auteur

ça marche bien mais le soucis c'est que dans certain cas si on ne retourne pas d'erreur comme ici :

if(empty($email)){

        $error = errors(["L'email n'est pas valide ne doit pas être vide"]);

    }
    if($email != $email_confirm){

        $error .= errors(["L'email est diférent"]);

    }
    if(empty($userurl) || !preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$userurl)){

        $error .= errors(["Votre URL n'est pas une URL valide"]);

    }if((strlen($description) > 500)){

        $error .= errors(["La description ne doit pas contenir plus de 500 caractères"]);

    }

si la première erreur ne retourne rien alors j'ai undefined variable sur le email confirm tant que je ne retire pas le point.

C'est pour ça que j'avais dis
"Initialise ton $error avant ($error = '';)"
Soit, dans ton cas :

$error = '';
if(empty($email)){
$error .= errors(["L'email n'est pas valide ne doit pas être vide"]);
etc.
neecride
Auteur

Merci cette fois c'est bon j'avais oublier de l'initialiser en effet !!