Pages :
bonjour a tous,

j'aimerai faire un calcule sur dix bonne réponses ou mauvaises réponses avec un affichage sur une autre page.

quand on clic sur correction, les bonnes ou mauvaises réponses s'affiche sur une autre page, est ce qu il faut que je fasse une variable x avec une boucle for.....

voici les pages a faire:

page ou on clic sur les réponses...

upload/60524-g.png

page ou on envoie la correction...

upload/60524-g2.png

voici mon code html..


   <form class="form_exercices_ou_1" action="inc/inc_correction.php" method="get" />
					 
						<article class="art_option">
							<p><select name="chx">
                                <option value="0"></option>
							<option value="un">un</option>
							<option value="une">une</option>
                                </select></p>
							<p style="margin:20px;">ba<b>gue</b></p>
							<p><select name="chx_1">

                                <option value="0"></option>
							<option value="un">un</option>
							<option value="une">une</option>
                                </select></p>
							<p style="margin:20px;"><b>gi</b>let</p>
							<p><select name="chx_2">
                                <option value="0"></option>
							<option value="un">un</option>
							<option value="une">une</option>
                             </select></p>
							 <p style="margin:20px;"><b>go</b>belet</p>
							<p><select name="chx_3">
                                <option value="0"></option>
							<option value="un">un</option>
							<option value="une">une</option>
						</select></p>
							<p style="margin:20px;">gara<b>ge</b></p>
						</article>
						<article class="art_option">
							<p><select name="chx_4">
                                <option value="0"></option>
							<option value="un">un</option>
							<option value="une">une</option>
						</select></p>
							<p style="margin:20px;"><b>gâ</b>teau</p>
							<p><select name="chx_5">
                                <option value="0"></option>
								<option value="un">un</option>
								<option value="une">une</option>
						</select></p>
						<p style="margin:20px;">man<b>gue</b></p>
						<p><select name="chx_6">
                                <option value="0"></option>
								<option value="un">un</option>
								<option value="une">une</option>
							</select></p>
							<p style="margin:20px;">fi<b>gue</p></p>
			
							<p><select name="chx_7">
                                <option value="0"></option>
								<option value="un">un</option>
								<option value="une">une</option>
							</select></p>
							<p style="margin:20px;"><b>guidon</b></p>
						</article>
						<article class="art_option">
							<p><select name="chx_8">
                                <option value="0"></option>
								<option value="un">un</option>
								<option value="une">une</option>
							</select></p>
							<p style="margin:20px;">bou<b>gi</b>e</p>
							<p><select name="chx_9">
								<option value="0"></option>
                                <option value="un">un</option>
								<option value="une">une</option>
							</select></p>
							<p style="margin:20px;"><b>gui</b>tare</p>
						</article>
                     
                <input class="correction_center" type="submit" name="correction" value="correction"/>
                         </form>


voici le debut de mon code php.....


	<?php 
						
					
								$un = 'un';
								$une = 'une';
						
						if (isset($_GET['correction']) 
							
							OR isset($_GET['chx']) 
							OR isset($_GET['chx_1'])
							OR isset($_GET['chx_2']) 
							OR isset($_GET['chx_3'])
							OR isset($_GET['chx_4'])
							OR isset($_GET['chx_5'])
							OR isset($_GET['chx_6'])
							OR isset($_GET['chx_7'])
							OR isset($_GET['chx-8'])
							OR isset($_GET['chx_9']) 
							) 
						
						{
							
						if(empty($_GET['chx']) 
							
							OR empty($_GET['chx_1'])
							OR empty($_GET['chx_2']) 
							OR empty($_GET['chx_3']) 
							OR empty($_GET['chx_4']) 
							OR empty($_GET['chx_5']) 
							OR empty($_GET['chx_6']) 
							OR empty($_GET['chx_7']) 
							OR empty($_GET['chx_8']) 
							OR empty($_GET['chx_9'])
							)
						
						{
								
							$msg = '<p>Veuillez cochez toutes les cases !</p>';
							
								$chx =  $_GET['chx'];
								$chx_1 = $_GET['chx_1'];
								$chx_2 =  $_GET['chx_2'];
								$chx_3 = $_GET['chx_3'];
								$chx_4 =  $_GET['chx_4'];
								$chx_5 = $_GET['chx_5'];
								$chx_6 =  $_GET['chx_6'];
								$chx_7 = $_GET['chx_7'];
								$chx_8 =  $_GET['chx_8'];
								$chx_8 =  $_GET['chx_8'];
								
								}else if($chx != $une 
									OR $chx_1 != $un
									OR $chx_2 != $un 
									OR $chx_3 != $un 
									OR $chx_4 != $un 
									OR $chx_5 != $une 
									OR $chx_6 != $une 
									OR $chx_7 != $une 
									OR $chx_8 != $une 
									OR $chx_9 != $une)
								{
									echo $_GET['chx'];
						echo '<br />';
						echo $_GET['chx_1'];
						echo '<br />';
						echo $_GET['chx_2'];
						echo '<br />';
						echo $_GET['chx_3'];
						echo '<br />';
						echo $_GET['chx_4'];
						echo '<br />';
						echo $_GET['chx_5'];
						echo '<br />';
						echo $_GET['chx_6'];
						echo '<br />';
						echo $_GET['chx_7'];
						echo '<br />';
						echo $_GET['chx_8'];
						echo '<br />';
						echo $_GET['chx_9'];
								}else{
									
									echo'recommencer';
								
								}
						}
					?>





message erreur: Undefined variable: chx (resultat qui s'affiche en dessous!!!)

merci pour votre aide
Salut,

Je vois ton code depuis quelques jours et le premier truc qui m'alerte c'est la répétition abusive des conditions dans ton PHP.

En premier lieu il faudrait faire des boucles pour éviter ces répétitions.
Ensuite, le principe, est que tu stockes tes réponses dans un tableau ou en base de données.

Puis lors de l'envoi de ton formulaire tu vérifies si tes conditions de validité du formulaire sont remplis puis tu vérifies les réponses.

Pour finir tu affiches tes résultats ou tes messages d'erreurs.

Par ailleurs tu as un manque de consistance dans tes appels de $_GET : $_GET['chx-8'] ou parfois $_GET['chx_8'].

Je te fais un petit script plus propre.
Bonjour,

En plus d'être d'accord avec MatthieuR, une chose me dérange dans ton code Boni75.

Sais-tu ce que signifie textuellement la partie suivante :
if (isset($_GET['correction']) 
 OR isset($_GET['chx']) 
 OR isset($_GET['chx_1'])
 OR isset($_GET['chx_2']) 
 OR isset($_GET['chx_3'])
 OR isset($_GET['chx_4'])
 OR isset($_GET['chx_5'])
 OR isset($_GET['chx_6'])
 OR isset($_GET['chx_7'])
 OR isset($_GET['chx-8'])
 OR isset($_GET['chx_9']) 
 ) {...}
???

" S'il est défini la variable $_GET['correction'] ou $_GET['choix_1'] ou....

Ce qui me dérange là dedans est que si une seule réponse est transmise, alors la condition est validée.
Et comme le dit MatthieuR, une boucle peut drastiquement réduire ton code.

D'autre part, tu vérifie que la variable existe mais pas qu'elle est remplie. A mon avis tu reçois toutes les variables en php même les vides. A moins que tous tes champs soient ornés de l'attribut Required.
d'accord, mais pour faire la boucle, est ce qu il faut que je change le name des select et d'avoir le meme name pour tous les select.
Attention au mauvais copier coller également, tu as un doublon :


$chx =  $_GET['chx'];
								$chx_1 = $_GET['chx_1'];
								$chx_2 =  $_GET['chx_2'];
								$chx_3 = $_GET['chx_3'];
								$chx_4 =  $_GET['chx_4'];
								$chx_5 = $_GET['chx_5'];
								$chx_6 =  $_GET['chx_6'];
								$chx_7 = $_GET['chx_7'];
[b]								$chx_8 =  $_GET['chx_8'];
								$chx_8 =  $_GET['chx_8'];[/b]


concernant ta boucle pour parcourir il suffit de concaténer genre comme ça :


for ($i = 0; $i < 9; $i++)
{
   array.push($UnArrayContenantChx , $_GET['chx_' . $i+1]); // i + 1 car chx 1 jusqua chx 9, ne prend pas en compte chx 0 car chx 0 n'existe pas. rajouter une condition pour chx seul.
}


après j'ai pas tester, mais c'est une idée
Modifié par JENCAL (22 Mar 2016 - 11:56)
merci jenckal,

donc cela veut dire que dans mes balises option il faut que je change la valeur par 0 ou 1 et est ce que je doit changer le name des select?
boni75 a écrit :
merci jenckal,

donc cela veut dire que dans mes balises option il faut que je change la valeur par 0 ou 1 et est ce que je doit changer le name des select?


Tu touche pas aux HTML, il est possible de gérer cela en PHP avec les réponses précédentes.

Par contre chx seul il faudrait lui mettre un 0, tel que chx -> chx_0, en gardant le même nomenclature que les autres (chx_1, chx_1, etc...), et dans ce cas il faudrait boucler sur 10 éléments et non 9, et enlever le $i + 1 pour $i seul.
Voilà comment je ferais :

<!DOCTYPE html>
<html>
<head>
  <meta charset='utf-8'>
  <title>TEST</title>
  <style type="text/css">
    .ok .reponse, .resultat{
      color: green;
    }
    .error .reponse{
      color: red;
      text-decoration: line-through;
    }
  </style>
</head>
<body>
<?php

/**
 * cette fonction sert à insérer ton select devant ton mot
 * @param  string $nom_du_champ le nom de ton champ(name)
 * @return string retourne ton balisage HTML
 */
function displaySelectReponse( $nom_du_champ ){

  //déclaration des différente options du select
  $options = array(
    '0' => '',
    'un' => 'un',
    'une' => 'une',
  );
  
  //construction du html du select
  $select = '<select name="' . $nom_du_champ . '">';

  foreach ($options as $key => $option) {

    //re-population des champs avec les valeurs postées
    $selected = '';
    if(isset($_POST[$nom_du_champ]) && $_POST[$nom_du_champ] === $key){
      $selected = 'selected=selected';
    }
    $select .= '<option ' . $selected . ' value="' . $key . '">' . $option . '</option>';
  }

  $select .= '</select>';

  return $select;
}

/**
 * cette fonction sert à afficher les résultats
 * @param  string $nom_du_champ le nom de ton champ(name)
 * @return string retourne ton balisage HTML
 */
function displayReponse( $nom_du_champ){

  global $errors, $reponses;

  $mot = $reponses[$nom_du_champ]['mot'];

  $reponse_class = 'ok';
  $resultat = '';

  //si le nom du champ n'est pas dans le tableau d'erreurs
  if( array_key_exists( $nom_du_champ, $errors) ){
    $reponse_class = 'error';
    $resultat = ' (' . $reponses[$nom_du_champ]['reponse'] . ' ' . $mot . ')';
  }

  $reponse = '<p class="' . $reponse_class . '">';

  $reponse .= '<span class="reponse">' . htmlspecialchars($_POST[$nom_du_champ]) . '</span> ' . $mot;
  $reponse .= ' <span class="resultat">'. $resultat . '</span> ';

  $reponse .= '<p>';

  return $reponse;
}

//déclaration de variables d'init
$un = 'un';
$une = 'une';
$form_ok = false; //on initialise cette variable pour savoir si le formulaire est posté et ne contient plus d'erreur (si tous les champs sont remplis)

//tes réponses, en plus tu listes tous les champs que tu attends [cligne]
$reponses = array(
  'chx'   => array('reponse' => $une, 'mot' => 'bague'),
  'chx_1' => array('reponse' => $un, 'mot' => 'gilet'),
  'chx_2' => array('reponse' => $un, 'mot' => 'gobelet'), 
  'chx_3' => array('reponse' => $un, 'mot' => 'garage'), 
  'chx_4' => array('reponse' => $un, 'mot' => 'gâteau'), 
  'chx_5' => array('reponse' => $une, 'mot' => 'mangue'),
  'chx_6' => array('reponse' => $une, 'mot' => 'figue'),
  'chx_7' => array('reponse' => $un, 'mot' => 'guidon'), 
  'chx_8' => array('reponse' => $une, 'mot' => 'bougie'),
  'chx_9' => array('reponse' => $une, 'mot' => 'guitare'),
);

//après il faut que tu raisonnes en boucles et factoriser tes conditions

//si le formulaire est posté (j'opterai plus pour une méthode POST)
//pas besoin de vérifier si tous tes champs sont postés pour le moment, juste la valeur de ton submit
if ( isset($_POST['correction']) && $_POST['correction'] === 'correction')  
{
  //traitement du formulaire affichage des réponses ou des erreurs
  
  //vérification si tous les champs sont remplis
  $empty = false;
  foreach ($reponses as $key => $value) {
    //itération des champs du formulaire
    if( empty($_POST[$key])){
      //si il y a au moins un champ vide, il y a erreur
      $empty = true;
    }
  }

  if( $empty ){ //si on a une erreur : tous les champs ne sont pas remplis
    $msg = '<p>Veuillez cochez toutes les cases !</p>';
    echo $msg;
  }else{
    $form_ok = true; //le formulaire est valide
    
    //on vérifie les réponses
    
    //initialisation du tableau qui contiendra les fautes
    $errors = array();
    foreach ($reponses as $key => $value) {
      if( $_POST[$key] != $value['reponse'] ){
        //si la réponse est fausse, on enregistre la mauvaise réposne dans le tableau
        $errors[$key] = htmlspecialchars($_POST[$key]);
      }
    }
  }
}
if( ! $form_ok )
{ //on affiche le formulaire ?>

    <form class="form_exercices_ou_1" action="" method="POST" />
               
      <article class="art_option">
        <p><?php echo displaySelectReponse( 'chx' ); ?> ba<b>gue</b></p>
        <p><?php echo displaySelectReponse( 'chx_1' ); ?> <b>gi</b>let</p>
        <p><?php echo displaySelectReponse( 'chx_2' ); ?> <b>go</b>belet</p>
        <p><?php echo displaySelectReponse( 'chx_3' ); ?> gara<b>ge</b></p>
      </article>
      <article class="art_option">
        <p><?php echo displaySelectReponse( 'chx_4' ); ?> <b>gâ</b>teau</p>
        <p><?php echo displaySelectReponse( 'chx_5' ); ?> man<b>gue</b></p>
        <p><?php echo displaySelectReponse( 'chx_6' ); ?> fi<b>gue</p>
        <p><?php echo displaySelectReponse( 'chx_7' ); ?> <b>guidon</b></p>
      </article>
      <article class="art_option">
        <p><?php echo displaySelectReponse( 'chx_8' ); ?> bou<b>gi</b>e</p>
        <p><?php echo displaySelectReponse( 'chx_9' ); ?> <b>gui</b>tare</p>
      </article>
      <input class="correction_center" type="submit" name="correction" value="correction"/>
    </form>

<?php }else{ ?>
  <h2>Bonnes réponses : <?php echo count($reponses) - count($errors); ?> / <?php echo count($reponses); ?></h2>
  <div class="reponses">
    <?php foreach ($reponses as $nom_du_champ => $value) {
      echo displayReponse( $nom_du_champ );
    }?>
  </div>
  <p><a href="index.php">Recommencer</a></p>
<?php } ?>
  </body>
</html>

Je te laisse poser des questions si tu ne comprends pas tout...
Attention, c'est une façon de faire et il y a sûrement mieux, c'est juste un principe.
Tout tient sur une seule et même page, le formulaire et les réponses sont affichés dans des conditions différentes c'est tout, on peut bien sûr séparer ça sur 2 pages.
Modifié par MatthieuR (22 Mar 2016 - 16:35)
On aurait pu factoriser un peu plus :
On renseigne directement ton balisage dans ton tableau
$reponses = array(
  'chx'   => array('reponse' => $une, 'mot' => 'ba<b>gue</b>'),
  'chx_1' => array('reponse' => $un, 'mot' => '<b>gi</b>let'),
  'chx_2' => array('reponse' => $un, 'mot' => '<b>go</b>belet'), 
  'chx_3' => array('reponse' => $un, 'mot' => 'gara<b>ge</b>'), 
  'chx_4' => array('reponse' => $un, 'mot' => '<b>gâ</b>teau'), 
  'chx_5' => array('reponse' => $une, 'mot' => 'man<b>gue</b>'),
  'chx_6' => array('reponse' => $une, 'mot' => 'fi<b>gue</b>'),
  'chx_7' => array('reponse' => $un, 'mot' => '<b>guidon</b>'), 
  'chx_8' => array('reponse' => $une, 'mot' => 'bou<b>gi</b>e'),
  'chx_9' => array('reponse' => $une, 'mot' => '<b>gui</b>tare'),
);

Puis on modifie un peu la fonction d'affichage des selects :
function displaySelectReponse( $nom_du_champ ){

  global $reponses;

  $mot = $reponses[$nom_du_champ]['mot'];

  //déclaration des différente options du select
  $options = array(
    '0' => '',
    'un' => 'un',
    'une' => 'une',
  );
  
  //construction du html du select
  $select = '<p><select name="' . $nom_du_champ . '">';

  foreach ($options as $key => $option) {

    //re-population des champs avec les valeurs postées
    $selected = '';
    if(isset($_POST[$nom_du_champ]) && $_POST[$nom_du_champ] === $key){
      $selected = 'selected=selected';
    }
    $select .= '<option ' . $selected . ' value="' . $key . '">' . $option . '</option>';
  }

  $select .= '</select>';
  $select .= ' ' . $mot . '</p>';

  return $select;
}

Ne pas oublier de supprimer les tags HTML dans la fonction displayReponse() :
$mot = strip_tags($reponses[$nom_du_champ]['mot']);

Et pour finir on fait une boucle sur l'affichage du formulaire :
      <div class="questions">
        <?php foreach ($reponses as $nom_du_champ => $value) {
          echo displaySelectReponse( $nom_du_champ);
        }?>
      </div>
Il faut que tu joues sur les classes .error et .ok et des propriétés CSS.
Dans le code précédent, on complète un tableau ($errors) qui contient les mauvaises réponses donc si tu itères ce tableau tu peux attribuer une classe particulière aux bonnes et mauvaises réponses.
Il faut que tu lises attentivement comment fonctionne la fonction displayReponse().
Je vais t'expliquer en détail la fonction qui affiche les réponses :
/**
 * cette fonction sert à afficher les résultats
 * @param  string $nom_du_champ le nom de ton champ(name)
 * @return string retourne ton balisage HTML
 */
function displayReponse( $nom_du_champ ){

  //global veut dire que l'on fait référence à des variables définies hors de la fonction
  //ces variables doivent être définies avant l'appel de cette fonction bien sûr
  
  //$errors : tableau contenant les champs des fausses réponses
  //$reponses : tableau initial qui contient les champs attendus et les réponses attendues
  global $errors, $reponses;

  //assignation du mot de la question contenu dans le tableau initial $reponses
  $mot = $reponses[$nom_du_champ]['mot'];

  //par défaut, le nom de la classe CSS que l'on attribue au paragraphe de la réponse est 'ok'
  $reponse_class = 'ok';
  //cette variable $resultat contiendra la bonne réponse si la réponse est incorrecte
  $resultat = '';

  //si le nom du champ est dans le tableau d'erreurs c'est que la réponse est incorrecte
  //array_key_exists recherche dans la clé $nom_du_champ (chx_1 ou chx_8...) dans le tableau des erreurs ($errors)
  if( array_key_exists( $nom_du_champ, $errors) ){

    //on modifie la variable de classe CSS pour assigner un style d'erreur
    $reponse_class = 'error';
    //$resultat contient la bonne réponse que l'on va chercher dans le tableau initial $reponses
    $resultat = ' (' . $reponses[$nom_du_champ]['reponse'] . ' ' . $mot . ')';
  }

  //on commence à créer le balisage HTML
  $reponse = '<p class="' . $reponse_class . '">';

  $reponse .= '<span class="reponse">' . htmlspecialchars($_POST[$nom_du_champ]) . '</span> ' . $mot;
  $reponse .= ' <span class="resultat">'. $resultat . '</span> ';

  $reponse .= '<p>';

  //on retourne le balisage HTML
  return $reponse;
}

Tu comprends un peu mieux ?
Hé béh, chapeau bas Monsieur MatthieuR ! Joli, bien documenté et précis Smiley applause
Quand tu t'implique, tu ne fais pas dans la dentelle (donc tu n'es pas de Calais).

T'en as bien d'la chance Boni75 !

Bonne journée !

Smiley ravi
Pages :