[JS/PHP] Vérifier plusieurs radios d'un form

Résolu
mymemorial Messages postés 61 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 7 mars 2013 - 22 avril 2011 à 13:50
mymemorial Messages postés 61 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 7 mars 2013 - 22 avril 2011 à 17:40
Bonjour,

J'ai un formulaire en PHP que je remplis à l'aide d'une base de donnée mySQL. J'ai donc plusieurs questions et plusieurs choix qui sont affectées à chaque question.
Jusque là, l'affichage du formulaire est bon, pas de problème.

Maintenant, je voudrais vérifier si au moins un choix a été fait pour chaque question.
Si j'oublie de cocher un des radios d'une question, le formulaire ne doit pas s'envoyer.

J'essaye donc de faire une fonction Javascript qui me permet de vérifier que l'utilisateur a répondu à toutes les questions. Voici mon code JS :

<script language="javascript">
 function verif()
 {
 var res = false;
 var result = false;
 var l= 0;
 var j;
 var radios = document.getElementsByTagName('input');
 for(j=1;j<3;j++) 

// le 3 c'est juste pour tester les 2 premières questions d'abord, après je me débrouillerais pour prendre l'ID de la dernière question depuis la requete SQL du form pour savoir le nombre de questions total du form

 {
l = radios.length;
result = false; 
    for (var k=0;k<l;k++)
{
      if((radios[j].name == j)&&(radios[k].checked))

// Et c'est la ou j'ai eu des problemes : oui, le name des radios est un int, c'est en fait l'ID des questions ('1' et '2' dans ce cas).
// Ici, je veux que si pour chaque question, il ne trouve pas de choix checked, il me renvoie la valeur result qui sera false (vu que je lui donne la valeur false pour chaque question)

      {
   result = true;
      }
    }
if(result!=true)
{
alert("Attention! Un champ n'a pas ete saisi!");
return result;
}
 }

// si pour chaque question la valeur de la variable result est true, alors arrivé ici je donne a la variable res la valeur true pour la retourner a mon form.

 res = true;
 return res;
 }
</script>


En testant ce code, ca m'affiche toujours l'alerte "Attention", meme si je coche les choix des 2 premières questions.

Et voici une partie de mon script PHP. J'ai enlevé les boucles, les connexions à la base de données, etc, mais je sais qu'il n'y a aucun problème à ce niveau la :

<form name="form" action="Test4.php" method="post" onSubmit="return verif();"/>
<!--On va d'abord afficher ici les questions-->
<?php echo $data[1]; ?>
<!--On va afficher ici les differents choix de chaque question sous forme de radio-->
" name="<?php echo $data1[3]; ?>" value="<?php echo $data1[2]; ?>"/><?php echo $data1[1]; ?>
 
</form>


J'ai connu des problèmes au niveau du "name" des radios qui sont des int (les ID des questions, soit 1, 2, 3...)

5 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
22 avril 2011 à 15:03
Salut,

Alors déjà je te déconseille d'identifier tes tag par des entiers purs, concatène plutôt avec une lettre, du genre "Q1.1", "Q1.2" ...

Ensuite tu récupères la liste de tous les input, ce qui comporte les radio mais aussi les boutons, les textbox, les check ... Ce qui pourrait être la source de ton erreur : en effet, buttonInput.checked renvoie false. Tu devrais donc vérifier, lors de ton parcours, que tu es bien sur un radio.

Enfin, les index en JS commence à 0 (zéro). Or ta boucle sur j commence à 1 (un).
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
22 avril 2011 à 16:13
Re,

J'étais en train de voir comment j'aurais codé le truc ^^
Et en fait j'aurai pas fait comme toi ><

Voilà comment je verrais les chose :
- Le HTML que je tenterai de générer avec PHP (ou XXX correspond à un UID pour retrouver la réponse dans la BDD) :
	<label>Ma première question ?</label>

Oui

Non

Ptèt


<label>Ma deuxième question est-elle à la framboise ?</label>

Non, au citron

42

Hardy


[..]


- Le script JS de vérification :
	var nbQ = <?php echo mon_nombre_de_questions; ?>
for (i=1;i<=nbQ;i++) {
// on récup' un groupe de réponses
var reps = document.getElementsByName("Q"+i);
// on parcours les réponses
var gchecked = false;
for (j=1;j<=reps.length;j++) {
if (reps[j].checked) && (!gchecked))
gckecked = true;
}
if (!gchecked) return false;
}
return true;


Alors je sais pas bien si ça va t'aider alors que je fais pas vraiment comme toi. Sinon, oui, il semblerait que tu te sois trompé d'itérateur et qu'il faille utiliser k, d'ailleurs on peut voir que depuis le début tu testes radio[k].checked ;)
3
mymemorial Messages postés 61 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 7 mars 2013
22 avril 2011 à 15:20
Coucou jopop, merci beaucoup pour ta réponse.

Tu as raison pour les input, même si je n'ai que des radios dans mon formulaire en ce moment. J'ai remplacé la ligne :
if((radios[j].name == j)&&(radios[k].checked))

Par :
if((radios[j].type == 'radio')&&(radios[j].name == j)&&(radios[k].checked))

En espérant que ça fasse l'affaire ^^

Sinon pour le j, je l'ai commencé par 1 car l'ID de ma première question est 1 (désolé, j'ai oublié de le préciser).

Par contre j'aime bien ton idée de concaténation, pourrais-tu me donner un coup d'pouce ?
Si je remplace dans mon code HTML :
" name="<?php echo $data1[3]; ?>" value="<?php echo $data1[2]; ?>"/><?php echo $data1[1]; ?>

Par ce qui suit en ajoutant "q" au nom :
" name="q<?php echo $data1[3]; ?>" value="<?php echo $data1[2]; ?>"/><?php echo $data1[1]; ?>


Est-ce que ce qui suit est juste ?
if((radios[j].type == 'radio')&&(radios[j].name == 'q'+j)&&(radios[k].checked))


J'ai toujours le "Attention" qui pop, j'ai du rater la concaténation dans le script...

Je suis persuadé que le problème reste dans le "name", si tu peux m'aider encore sur ce point, ce serait sympa!
0
mymemorial Messages postés 61 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 7 mars 2013
22 avril 2011 à 15:25
Euh en fait je crois que c'est bon là! =)

Ce n'était pas :
if((radios[j].type == 'radio')&&(radios[j].name == 'q'+j)&&(radios[k].checked))

Mais :
if((radios[k].type == 'radio')&&(radios[k].name == 'q'+j)&&(radios[k].checked))


Peux-tu me confirmer que c'est bon ? =)
Je viens de tester et apparemment ça marche... ^_^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mymemorial Messages postés 61 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 7 mars 2013
22 avril 2011 à 17:40
Oh, j'aime bien comment tu vois les choses! ^^

J'avais aussi pensé à getElementsByName au début, avant que j'ajoute le "q" au name, et comme getElementsByName(int) ne me donnait rien, j'ai du changer de plan!

En tout cas, merci beaucoup pour ton aide, tu es génial!
Très bonne soirée ^_^

(Et hop, réponse acceptée!)
0