[RESOLU] Traitement des checkbox en PHP

Eléphanteau du PHP | 41 Messages

27 juil. 2013, 20:01

Bonjour :)

Je suis en train de réaliser un QCM pour un site de service hospitalier : le script de validation analyse le type de champ, s'il s'agit d'un bouton radio il détecte s'il s'agit de la bonne réponse, par contre je coince pour les checkbox !

J'arrive à ne pas donner de points si une des cases cochées est fausse, mais je n'arrive pas à détecter si toutes les cases justes ont été cochées (en gros, case juste pas cochée = pas de point).

Merci pour votre aide :wink:

Un morceau du formulaire :
<label for="q15">Q9 - Parmi les propositions suivantes, lesquelles sont couvertes par le secret m&eacute;dical ?</label><br />
                                <input type="checkbox" name="9-q[]" value="checkbox-vrai" />Les donn&eacute;es de l'examen clinique<br />
                                <input type="checkbox" name="9-q[]" value="checkbox-vrai" />Les causes d'un d&eacute;c&egrave;s<br />
                                <input type="checkbox" name="9-q[]" value="checkbox-vrai" />Les faits extra-m&eacute;dicaux venant &agrave; la connaissance du m&eacute;decin<br />
                                <input type="checkbox" name="9-q[]" value="checkbox-vrai" />Les r&eacute;sultats d'examens compl&eacute;mentaires<br />
(ouais, le coup du type de champ qui se retrouve dans le name pour pouvoir être récupéré ensuite, c'est pas très joli j'imagine !)

Le script de validation en l'état actuel :
<?
$total = 0;
 
for ($i=1;$i<21;$i++)
{
    $radio = $_GET[$i."-q"];
 
    if (strpos($radio, 'checkbox') === false)
    {
        if (strpos($radio, 'vrai') !== false)
        {
            $total = $total+1;
        }
    }
    else
    {
        // je coince ici :p
    }
}
 
echo $total;
?>

Eléphant du PHP | 96 Messages

27 juil. 2013, 23:08

Il y a une erreur de conception dans le nom des champs de checkbox

Les checkbox sont gérés via des tableaux, il faut ensuite vérifier les valeurs postées

Code : Tout sélectionner

<label for="q15">Q9 - Parmi les propositions suivantes, lesquelles sont couvertes par le secret m&eacute;dical ?</label><br /> <input type="checkbox" name="9-q[]" value="reponse1 />Les donn&eacute;es de l'examen clinique<br /> <input type="checkbox" name="9-q[]" value="reponse2" />Les causes d'un d&eacute;c&egrave;s<br /> <input type="checkbox" name="9-q[]" value="reponse3" />Les faits extra-m&eacute;dicaux venant &agrave; la connaissance du m&eacute;decin<br /> <input type="checkbox" name="9-q[]" value="reponse4" />Les r&eacute;sultats d'examens compl&eacute;mentaires<br />
Et ainsi coté php, vous vérifiez ainsi
$tQ9=$_POST['9-q'];
if( 
  in_array('reponse1',$tQ9) 
   and 
   in_array('reponse3',$tQ9) 
){
 //c'est ok
}
Dans cet exemple on accepte les reponses 1 et 3
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 41 Messages

28 juil. 2013, 10:37

Je vois l'idée, et j'avance un peu...

Mais après avoir récupérer les réponses justes dans la base de données, comment faire en sorte que le script teste uniquement celles-ci ?
Et du coup, avec cette méthode, si une réponse fausse est cochée, ça ne risque pas de ne pas la considérer comme fausse ?

Désolé si je ne suis pas très clair, j'ai les idées un peu brumeuses à force de bloquer là-dessus...
		$req = mysql_query("SELECT * from qcm_propositions where id_qcm='$_POST[$id_qcm]' and valeur='vrai'") or die ("Erreur requête");
		$res = mysql_num_rows($req);
		{
			$id_prop = mysql_result($req,0,"id_prop");
			$valeur = mysql_result($req,0,"valeur");
		 
		 	$reponse = $_POST[$i."-q"];
			if(
				in_array('1',$reponse)
				and
				in_array('2',$reponse)
				and
				in_array('3',$reponse)
				and
				in_array('4',$reponse)
			){
				echo "C'est juste";
			} 
			else{ 
				echo "C'est faux"; 
			} 
		}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 juil. 2013, 13:00

salut,

tu mélange un peu tous la.

dans le formulaire tu met en value des checkbox les id des réponses.

pour la validation tu compte le nombre de ligne qui correspondent aux réponsent cochée (dans le tableau correspondant à la checkbox tu n'aura que les id des réponses sélectionnées).

tu peux le faire avec la clause in SQL
<?php
$sql = 'SELECT * from qcm_propositions where id_qcm=$_POST[$id_qcm] and valeur=\'vrai\' and idquestion in ('.implode(',',$_POST[$i."-q"]).')';
par exemple

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 41 Messages

28 juil. 2013, 22:57

Merci, j'ai pu résoudre le problème !