Php traitement checkbox

Fermé
margaux74 Messages postés 2 Date d'inscription vendredi 28 décembre 2007 Statut Membre Dernière intervention 28 décembre 2007 - 28 déc. 2007 à 16:20
 le père - 29 déc. 2007 à 09:36
Bonjour,
je dois réaliser un QCM grâge à php, avec les boutons radio tout se passe bien, en revanche je n'arrive pas à traiter mes checkbox, j'ai essayé avec l'instruction switch mais il ne traite pas les cas particuliers relatifs aux cases cochées, il traite comme si l'utilisateur avait coché tous les choix possibles, je débute et je pense que mon erreur est toute bête mais ca fait des jours que je suis dessus, que je parcours le web en vain ...

Mon code html :
<LI><FONT color="purple">Parmi ces 4 parties du sabot, laquelle/lesquelles ne se trouvent pas SOUS le sabot ?</FONT>
  <br></br>
  
     <input type="checkbox" name="choice8[]" value="0"> La mamelle<br>
     <input type="checkbox" name="choice8[]" value="1"> La pince<br>
     <input type="checkbox" name="choice8[]" value="2"> La sole<br>
     <input type="checkbox" name="choice8[]" value="3"> La fourchette<br> 
  <br></br>


Et mon code php pour traiter les réponses :
avec switch :


if (isset($_POST['choice8']))
	echo ("<p><font color='purple'>Vous avez répondu à la 8ème question :</font><br>"); 
	for ($i=0; $i<sizeof($choice8);$i++)
	
switch ($i) {
case "0":
	echo "La mamelle : c'est une des bonnes réponses, elle vous apporte des points<br>";
	$score +=1.5;
case "1":
	echo "La pince : c'est une des bonnes réponses, elle vous apporte des points<br>";
	$score +=1.5;
case "2":
	echo "La sole : c'est une mauvaise réponse, elle se situe sous le sabot, vous perdez 1 point<br>";
	$score -=1;
case "3":
	echo "La fourchette : c'est une mauvaise réponse, elle se situe sous le sabot, vous perdez 1 point<br>";
	$score -=1;
	break;
default:
    echo "vous n'avez rien répondu, vous ne perdez ni ne gagniez de points<br>";
}

J'ai aussi tenté avec une instruction IF : dans ce cas là il n'affiche carrément plus aucune réponse !

	echo ("<p><font color='purple'>Vous avez répondu à la 8ème question :</font><br>"); 
	
if ($choice8 == "La mamelle")
{ 
	$score +=1.5;
	echo "<font color='green'>La mamelle : c'est une bonne réponse, elle vous apporte des points<br>";
} 
elseif ($choice8 == "La pince")
{ 
	$score +=1.5;
	echo "<font color='green'>La pince : c'est une bonne réponse, elle vous apporte des points<br>";
}
elseif ($choice8 == "La sole")
{ 
	$score -=0.5;
	echo "<font color='green'>La sole : c'est une mauvaise réponse, elle vous fait perdre des points<br>";
}
elseif ($choice8 == "La fourchette")
{ 
	$score -=0.5;
	echo "<font color='green'>La fourchette : c'est une mauvaise réponse, elle vous fait perdre des points<br>";
} 
  
A voir également:

3 réponses

Linblow Messages postés 11 Date d'inscription samedi 29 décembre 2007 Statut Membre Dernière intervention 3 novembre 2009 25
29 déc. 2007 à 08:55
Il faut utiliser une boucle spéciale pour ça, voila :

if (isset($_POST['choice8']))
{

$score = 0; // Score obtenu jusqu'à présent

foreach ($_REQUEST['choice8'] as $valeur)
{
switch ($valeur)
{

case '0':
echo 'La mamelle : bonne réponse.<br />';
$score = $score + 1.5;
break;

case 1:
echo 'La pince : bonne réponse.<br />';
$score = $score + 1.5;
break;

case 2:
echo 'La sole : mauvaise réponse.<br />';
$score = $score - 1;
break;

case 3:
echo 'La fourchette : mauvais réponse.<br />';
$score = $score - 1;
break;

default: NULL;
}
}

echo 'Score total : '.$score;

}


A tous les coups, ça marche ; )
3
margaux74 Messages postés 2 Date d'inscription vendredi 28 décembre 2007 Statut Membre Dernière intervention 28 décembre 2007
28 déc. 2007 à 16:45
Vous remarquerez que j'ai omis les "break" après chaque case de mon switch je l'avais fait exprès pour qu'il traite bien chaque case et non pas qu'il s'arrête dès qu'un est satisfait, je viens de voir dans un autre endroit du forum que cela peut être une erreur, j'ai donc retester en remettant les break : petite amélioration : si on répond juste tout va bien, tout ce que je veux s'affiche correctement. MAIS si on répond faux, l'affichage indique quand même que l'utilisateur à tout bon !

Si quelqun peut m'aider s'il vous plait ...
0
Bonjour


ça peut très bien marcher avec switch , moyennant quelques petites corrections.

Mais d'abord, je te vois utiliser $_POST['choice8'] indifféremment avec $choice8. Ce n'est pas la même variable. De deux choses l'une
. ou tu as register_globals à true dans ta configuration et là ça marche : des variables globales sont automatiquement crées pour chaque élement de $_POST, $_GET etc et c'est un énorme trou de sécurité. Dépêche toi de la mettre à false. Tu as sans doute trouvé des exemples de scripts qui marchent comme ça, il s'agit d'anciens scripts et aujourd'hui plus personne ne devrait faire ça.
. ou tu n' as pas register_globals à true et ta variable $choice8 n'a tout simplement aucun rapport avec $_POST['choice8']. Commence par corriger ce point, dans la suite je suppose que tu as fait toi même $choice8 = $_POST['choice8'].

J'en viens au fonctionnement du switch :
switch ($choice8 [$i]) et non pas switch ($i) et remet les break. si tu ne fais ton test que sur $i, et que ton visiteur a coché une seule check-box, n'importe laquelle, tu ne traiteras que la Mamelle

Avec le if ça ne peut pas marcher : tu compares un tableau $choice8 avec une valeur 'La Mamelle', etc... Un tableau ne peut pas être égal à une valeur seule. De plus, les valeurs renvoyées dans ton formulaire sont 0,1,2,3, et en aucun cas "la mamelle", "La pince" etc...
0