mymemorial
Messages postés61Date d'inscriptionlundi 25 février 2008StatutMembreDernière intervention 7 mars 2013
-
22 avril 2011 à 13:50
mymemorial
Messages postés61Date d'inscriptionlundi 25 février 2008StatutMembreDerniè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...)
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention 1 août 201312 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).
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention 1 août 201312 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 ;)
mymemorial
Messages postés61Date d'inscriptionlundi 25 février 2008StatutMembreDerniè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 ^_^