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

Messages postés
61
Date d'inscription
lundi 25 février 2008
Dernière intervention
7 mars 2013
- - Dernière réponse : mymemorial
Messages postés
61
Date d'inscription
lundi 25 février 2008
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...)
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
3
Merci
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).

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_jopop
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
3
Merci
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 ;)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_jopop
Messages postés
61
Date d'inscription
lundi 25 février 2008
Dernière intervention
7 mars 2013
0
Merci
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!
Commenter la réponse de mymemorial
Messages postés
61
Date d'inscription
lundi 25 février 2008
Dernière intervention
7 mars 2013
0
Merci
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... ^_^
Commenter la réponse de mymemorial
Messages postés
61
Date d'inscription
lundi 25 février 2008
Dernière intervention
7 mars 2013
0
Merci
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!)
Commenter la réponse de mymemorial

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.