Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Savoir gérer un formulaire avec plusieurs boutons

Je viens de lire un joli petit article sur le traitement d'un formulaire avec plusieurs boutons, mais celui-ci présente une erreur importante, et il me semble indispensable de faire des rectifications !

L'article en question est consultable sur ZDNet : "gérer plusieurs soumissions avec un unique formulaire"

Quel est le problème exactement ?

Pour bien comprendre, utilisez le script suivant :
<html>
<head>
<title>Formualire</title>
</head>
<body>
<?php

if (! empty($_POST)) {
    echo '<pre>$_POST = ';
    print_r($_POST);
    echo '</pre>';
}

?><form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<p><input type="text" name="champ" /></p>
<p><input type="submit" name="bouton1" value="Le bouton 1" />&nbsp;
<input type="submit" name="bouton2" value="Le bouton 2" />&nbsp;
<input type="submit" name="bouton3" value="Le bouton 3" /></p>
</form>
</body>
</html>

Lorsque l'on entre un texte et que l'on clique sur l'un des boutons "submit", on constate que seul le bouton cliqué apparaît dans les données envoyées.

Il est donc simple d'effectuer une traitement en testant si tel ou tel bouton existe dans les données postées.

Maintenant, entrez un texte et presser la touche "Entrée" de votre clavier. Si vous êtes sur un navigateur autre qu'Internet Explorer, vous constatez que le bouton envoyé par défaut est le premier de la liste. Par contre, si vous êtes sur Internet Explorer, celui-ci n'envoie .. rien, juste le champ texte !

Remarque : Nicolas Martin m'a fait remarquer que s'il existe plus d'un champ texte, le bouton est bien envoyé avec Internet Explorer. Comme quoi, ça manque de cohérence tout ça !

Donc, si on regarde de plus près l'article sur ZDNet, on peut constater que le premier script ne fonctionne pas dans le cas où l'on presse la touche "Entrée" sur Internet Explorer.

Pire, cet article n'utilise pas un "if( isset( $_POST['submit'] ) )", mais directement un "if( $_POST['submit'] )"
ce qui a pour conséquence de générer une erreur de type notice lorsque l'on ne clique pas sur le bouton ou lorsque l'on arrive directement sur cette page sans envoyer de données !
Cela veut donc dire que leur "error_reporting" n'est pas à E_ALL ?

Il est bien beau d'écrire des articles de ce type, et je regrette moi-même de ne pas l'avoir écrit, mais il serait bon d'être plus rigoureux.

Pour ceux qui veulent la solution, vous avez pu remarquer que j'utilise dans mon script un "! empty( $_POST )" afin d'être sûr que des données soient soumises.

Ainsi, le bon script serait :
<html>
<head>
<title>Formualire</title>
</head>
<body>
<?php

if (!empty($_POST)) {
    echo '<p>Le bouton enfoncé est le bouton ';
    if (isset($_POST['bouton2'])) {
        echo '2';
    } elseif (isset($_POST['bouton3'])) {
        echo '3';
    } else {
        // par défaut, c'est le bouton 1, même si on ne clique pas/
        echo '1';
    }
    echo '</p>';
    echo '<p>Le champ texte contient : ', $_POST['champ'], '</p>';
}

?><form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<p><input type="text" name="champ" /></p>
<p><input type="submit" name="bouton1" value="Le bouton 1" />&nbsp;
<input type="submit" name="bouton2" value="Le bouton 2" />&nbsp;
<input type="submit" name="bouton3" value="Le bouton 3" /></p>
</form>
ADAM Benjamin 2008 | Admin