Contrôle de la valeur de la balise select et radio
Bonjour,
Je suis en train de préparer un formulaire assez classique dans sa forme :
input text, bouton radio, select
et textarea.
J'ai fait une boucle pour contrôler mes champs vides lors de l'envoi par POST dans le même formulaire avant l'enregistrement dans la base.
//Définition des champs à tester
$ChampsTestes = array ( "date"=>"date",
"heure"=>"heure",
"observation"=>"observation");
//Contrôle de tous les champs sauf "observation"
foreach ($_POST as $cle => $valeur)
{
if ($valeur == "")
{
($ChampVide[$cle] = "");
}
} //fin de la boucle foreach pour $_POST
Si il y a 1 ou plus de champs vides j'affiche un message avec le nom des champs à renseigner et je met les valeurs déjà saisies dans les champs correspondants. Mais ceci fonctionne uniquement pour les champs texte, comment y inclure aussi le champ select et radio ?.
//Si l'un des champs est vide, affichage du message "un ou des champs obligatoires est sont vide"
if (@sizeof($ChampVide) > 0) //en cas de champ vide
{
echo "<b>un ou des champs obligatoires est sont vide :</b><br />";
//affichage du champ vide
foreach ($ChampVide as $cle =>$valeur)
{
echo " {$ChampsTestes[$cle]}<br />";
}
} //fin de la boucle pour les champs vide
J'extrais bien la valeur du tableau pour "reschecker" le bouton et "reselected" le champ select mais comment faire pour le signaler vide dans ma boucle de contrôle ?
<?php if (isset($tab_source) && in_array('0', $tab_source)) echo "selected";?>mon bouton radio
Merci pour vos suggestions
Réponses apportées à cette discussion
Salut Jeremail,
Ta manière de procéder est pas mal mais loin d'être propre et suffisamment efficace pour contrôler tous les champs et s'assurer que les valeurs qui ont été renseignées sont correctes. Le seul moyen efficace d'y arriver est de tester unitairement chaque champ en appliquant des règles de validation pour chaque d'eux. Par exemple, si j'ai un champ NOM obligatoire alors je devrais m'attendre à ce qu'il soit rempli d'une part mais qu'il ne contienne que des caractères alphabétiques + apostrophe et tiret.
D'un autre côté, si j'ai une selectbox COULEUR qui contient un nombre fini de valeurs (par exemple BLEU, BLANC, ROUGE) alors je m'attends à ce que la valeur envoyée soit bien l'une des valeurs de la selectbox. Si ce n'est pas le cas, c'est que le visiteur a modifié la valeur et a essayé de tromper le système de validation
Donc au final, tu es obligé de tester chaque champ un à un. Ce qui donne par exemple pour mes deux exemples :
<?php
$colors = array('bleu', 'blanc', 'rouge');
$errors = array();
if (empty($_POST['nom'])) {
$errors['nom'] = 'Le nom est obligatoire';
} else {
if (!preg_match('/^([a-zA-Z\-\']){2,30}/', $_POST['nom'])) {
$errors['nom'] = 'Votre nom contient des caractères interdits';
}
}
if (empty($_POST['color'])) {
$errors['color'] = 'La couleur est obligatoire';
} else {
if (!in_array($_POST['color'], $colors)) {
$errors['color'] = 'La couleur choisie n\'existe pas';
}
}
if (0 === sizeof($errors)) {
// Aucune erreur, traitement du formulaire
}
// Là le formulaire n'est pas correct donc on le réaffiche avec les erreurs
Tu vois le principe ?
Merci pour ton exemple, je vais le suivre pour voir si j'ai bien compris, mais je croyais qu'avec un select on ne pouvais justement pas modifier la valeur puisque en principe elle est 'gravée dans le marbre de l'écran !'
Sinon j'ai l'intention effectivement de faire une vérification de la forme de la saisie, car j'ai un champ date et un champ heure.
Le temps de m'y remettre....
Non aucun champ de ton formulaire n'est protégé puisque toute la saisie se passe côté client. Rien ne m'empêche dans Firefox et l'extension WebDevelopper de transformer des champs SELECT ou HIDDEN en champ TEXTE pour venir y saisir ce que je veux dedans. PHP recevra bien les valeurs que j'ai saisies, donc si tu ne les vérifies pas à nouveau, tu peux potentiellement t'exposer à de serieux problème de sécurité.
J'ai une question bête, avec ton exemple comment j'affiche le contenu de $error si erreur ?
Quand j'ouvre mon formulaire pour la première fois j'ai : "array" qui apparait avec l'instruction echo $error;
Je pense que cela dois venir de l'instruction empty, j'ai testé avec isset mais c'est pareil et j'ai également tester if (empty($_POST['incident']) && (isset($_POST['envoi']))) qui correspond au bouton submit. Par contre quand je rempli le champ et que je valide cela disparait.
$errors est un tableau d'erreurs. Tu peux le parcourir avec foreach() pour afficher chaque erreur.
Bonjour,
Ben oui, suis-je bête !!!
Je te souhaite de joyeuses fêtes de fin d'année, et aussi à tous les membres du site
Jérémail