Bonjour, j'ai créer un code qui permet de m'indiquer si les inputs de mon form sont vides ou bien complétés. Mon problème est que lorsque je valide le formulaire en ne remplissant aucun input, le php me retourne ceci ( J'ai le retour tout en bas ). Ce qui est logique puisque le bouton de submit est comprit dans le foreach et c'est là mon problème, j'aimerais savoir s'il est possible de ne pas prendre en compte dans le foreach le dernier élément de celui ci... J'espère avoir été clair, n'hésitez pas à me redemandé dans le cas contraire. Bonne nuit à tous ! (:


<form method="post">
    <input name="username">
    <input name="email">
    <input name="password">
    <input type="submit" name="submit">
</form>



if (isset($_POST['submit'])) {
    foreach($_POST as $key => $value) {
        try {
            if(!empty($value))
                $error = 'ok';
            else $error = 'pas ok';
        } catch (Exception $e) {
            $error = $e->getMessage();
        } finally {
            echo $error . '<br/>';
        }
    }
}




pas ok
pas ok
pas ok
ok
Modérateur
Et l'eau,


<?php
    ...
if($key !== "submit"){
    if(!empty($value)){
        ...
    }else{
        ...
    }
}




<?php
    if (isset($_POST['submit'])) {
        $_POST['error'] = [];
        foreach($_POST as $key => $value) {
            if(empty(trim($value))){
                $_POST['error'][$key] = 'Ce champs ne doit pas être vide';
            }
        }
    }
    ;
    //plus loin dans le code

?>
    <form ....>
        <div>
            <label for="...">....</label>
            <input type="text" name="un_champ" ....>
            <?= !empty($_POST['error']['un_champ']))? sprintf('<span class="error">%s</span>', $_POST['error']['un_champ']) : ''; ?> 
        </div>
    </form>


Smiley cligne

Je vois que tu as une mauvaise compréhension des exceptions. Bien que parfois, j'ai vu des abus, une exception est une erreur dans le programme et non une erreur explicite dû à l'utilisateur.
Modifié par niuxe (13 Oct 2020 - 08:47)
Bonjour et merci beaucoup pour ta réponse, j'ai appliqué tes conseils et voilà mon code :


if (isset($_POST['submit'])) {
    foreach($_POST as $key => $value) {
        $_POST['error'] = [];
        if(empty(trim($value)))
            $_POST['error'][$key] = 'pas ok';
        else echo "ok";
    }
}


<form method="post">
    <input name="username">
    <input name="email">
    <input name="password">
    <input type="submit" name="submit">
    <?= !empty($_POST['error']['username']))? sprintf('<span class="error">%s</span>', $_POST['error']['username']) : ''; ?>
</form>



Tout d'abord je ne connaissais pas la fonction trim(), j'ai regardé la documentation et j'ai cru comprendre que la fonction retirait le premier de dernier caractère d'un string et je n'en comprends du coup pas l'utilisation ici. Je ne connaissait pas non plus la fonction sprintf() et j'ai aussi regardé sur la doc, elle apporte quelque chose de plus qu'un simple echo?
php_error.log me retourne ceci pour mon code et je n'ai pas réussi à trouvé l'erreur (:


PHP Parse error:  syntax error, unexpected ')', expecting ';' or ','


( sur cette ligne ci ) :


 <?= !empty($_POST['error']['username']))? sprintf('<span class="error">%s</span>', $_POST['error']['username']) : ''; ?>


Encore merci et passe une bonne journée !
Modérateur
Bonjour,

Trim supprime les espaces en début et/ou en fin de chaine ou tout autre caractère passé en paramètre. (en théorie le navigateur enlève de lui-même les espaces en début et fin de chaîne pour les champs de formulaire mais 2 précautions valent mieux qu'une).

Perso je ne suis pas très fan de sprintf et consort mais il faut avouer qu'elle a de son utilité car elle utilise des "variables temporaires" (par ex %s) et permet une mise en forme homogène mais ce n'est pas indispensable. Si vous êtes plus à l'aise avec echo (qui est beaucoup plus rapide soit dit en passant), why not?


Et pour l'erreur PHP, remplacez
<?= !empty($_POST['error']['username']))? sprintf('<span class="error">%s</span>', $_POST['error']['username']) : ''; ?>
</form>
par
<?= !empty($_POST['error']['username']) ? sprintf('<span class="error">%s</span>', $_POST['error']['username']) : ''; ?>
</form>

Modifié par Greg_Lumiere (13 Oct 2020 - 13:18)
Re ! Merci à vos deux pour vos solutions et précision j'ai réussi à résoudre mon problème et j'ai en plus appris quelques petits trucs en php. Comme quoi certaines erreurs valent le coup (: Je vous souhaite tout le meilleur ! Bonne soirée
Modifié par vzytoi (13 Oct 2020 - 17:49)
Modérateur
Greg_Lumiere a écrit :

Perso je ne suis pas très fan de sprintf et consort mais il faut avouer qu'elle a de son utilité car elle utilise des "variables temporaires" (par ex %s) et permet une mise en forme homogène mais ce n'est pas indispensable. Si vous êtes plus à l'aise avec echo (qui est beaucoup plus rapide soit dit en passant), why not?


ça se joue à quelques millisecondes... L'avantage de sprintf est qu'on se crée un template string et sur les valeurs, il y a un contrôle optimale.


<?php
    $template = "le nombre pi %f après 3 décimales est de %.3f !";
    printf($template, pi(), pi());


C'est nettement plus lisible que :

<?php 
    $template = "le nombre pi ".pi()." après 3 décimales est de ".number_format(pi(), 3)." !";
    printf($template, pi(), pi());


Je suis d'accord que c'est une histoire de goût. Après les égouts et les odeurs, ça ne se discute pas...
Modifié par niuxe (13 Oct 2020 - 23:19)