Général
- Présentation
- Les Symboles
- Les Métacaractères
- Les Ancres et Classes
- Les options
- Constantes prédéfinies
- Equivalences
- Créer un motif
- Les POSIX
- Les PCRE
- Les Plus des PCRE
- Les Assertions Part I
- Les Assertions Part II
- Motif conditionnel
- Mysql et les regex
- Url Rewriting
- Optimisation
- Aide mémoire
Les PCRE
Les POSIX
Pratique
Linux
Spécial php
- Conseils et Astuces
- Délimiteur PCRE
- Créer une bdd
- Utiliser du BBcode
- Le binaire
- Faire un panier
- Cases à cocher
- Citations imbriquées
- Colorateur syntaxique
- Les list-box ou combo-box
- Faire un diaporama
- Isset ou empty ?
- Une légende au survol
- Site en plusieurs langues
- Requêtes dynamiques
- Gestion des smiley
- Faire un moteur de template
- Timestamp php/mysql
- Timestamp mysql
- Matcher une adresse email
- Controler des données
Les billets de fred
- Les POSIX... mise en pratique !
- Limiter l'accès à un répertoire
- Alternance de couleurs
- Magic_quotes
- Désactiver les short_tags
- Require ou include : Bench
- Cohérence dans les chaines de caractères
- "echo" : lapin ou tortue ?
- Gérer un formulaire avec plusieurs boutons
- Le formulaire a t'il été soumis ?
- J'ai décidé de grossir
- La guerre des étoiles
- La guerre des boutons
- Headers already sent
- IP, IP, IP, houra !
- Créer un itérateur avec PHP5
- On vous conduit vers la lumière
- Comment utiliser MySQL avec PHP
- Non aux booléens !
- Php.ini : dist /recommended
- Include : gouffre ou fêlure ?
- Simple comme les sessions !
- Simplifier le traitement des erreurs
- Structurez vos applications
- Franchement, t'es trop for !
- Notice: Undefined variable (ou index)
- Proscrire les variables auto déclarées
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" />
<input type="submit" name="bouton2" value="Le bouton 2" />
<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" />
<input type="submit" name="bouton2" value="Le bouton 2" />
<input type="submit" name="bouton3" value="Le bouton 3" /></p>
</form>
