Buenas,
La verdad es que mirando un poco el código por encima, esta muy liado todo. Haces varias acciones dos veces lo cual no es muy lógico. Las respuestas serian muy estáticas (r82..r83) lo cual si en un futuro quieres cambiar una de las preguntas te va a tocar cambiar todo el código.
La solución a tu código seria solo mirar si las respuestas que te interesan están seleccionadas y las demás no. Si lo están incrementas los puntos mientras que si no lo están incrementas los errores. No hace falta que hagas las demás comprobaciones.
De todos modos te quisiera proponer otro punto de vista sobre la manera de hacer y comprobar las preguntas. Uno un poco mas dinámico.
Supongamos que tenemos un array con unas preguntas predefinidas:
<?php
'titulo' => '¿Cuanto es 2+2?',
'4'=>true,
'cuatro'=>true,
'6'=>false,
'3'=>false,
'8'=>false,
),
'puntos' => 0.5,
'tipo' => 'checkbox'
);
'titulo' => '¿En que año dio inicio la WWII?',
'1924'=>false,
'1945'=>false,
'1919'=>false,
'1939'=>true,
),
'puntos' => 0.5,
'tipo' => 'radio'
);
?>
Cada pregunta tiene un id único (
$preguntas['1']), dentro de ella hay
titulo => El titulo de la pregunta
respuestas => un array con las respuestas y si son falsas o verdaderas
puntos => los puntos que da la pregunta en caso de ser correcta
tipo => El tipo de pregunta (respuestas múltiples (checkbox) o una sola (radio) ).
Para mostrar las preguntas utilizamos lo siguiente:
<form action='' method='post'>
<?php
foreach($preguntas as $id=>$pregunta){
echo '<fieldset>';
echo '<legend>', $pregunta['titulo'], '</legend>';
echo '<ol type="a">';
$nombre = 'res['.$id.']';
if($pregunta['tipo']=='checkbox'){ $nombre .= '[]'; }
foreach( $pregunta['respuestas'] as $respuesta=>$_l){
echo '<li><label>';
echo '<input type="', $pregunta['tipo'] ,'" name="', $nombre ,'" value="', $respuesta ,'" /> ';
echo $respuesta;
echo '</label></li>';
}
echo '</ol></fieldset><br />';
}
?>
<input type='submit' value='Comprobar' />
</form>
Al utilizar el elemento
ol y ponerle tipo a (type=a), las respuestas adquieren automáticamente un orden (a,b,c,d).
$nombre define el nombre con el que podrás identificar las preguntas/respuestas.
En HTML si utilizas
<input type='text' name='algo[]' value='hola' /> <input type='text' name='hola[]' value='mundo' />
Al enviarlo, se convierte en un array accesible desde PHP mediante
$_POST['hola];Y finalmente para comprobar las preguntas y respuestas:
<?php
$puntos = 0;
$errores = 0;
// Si hay respuestas
if(isset($_POST['res'])){
// por cada "pregunta"
foreach($_POST['res'] as $id=>$respuesta){
// Si la pregunta no esta definida, la saltamos.
if(!isset($preguntas[$id])){ continue; } $_error = false;
// por cada respuesta proporcionada
foreach((array)$respuesta as $rep){
// si la respuesta existe y es falsa
if(isset($preguntas[$id]['respuestas'][$rep]) && $preguntas[$id]['respuestas'][$rep] == false){
$_error=true; // hay un error
break; // Dejamos de comprobar respuestas de esta pregunta
}
}
// Si no ha habido errores en las respuestas
// incrementamos puntos. Si no, incrementamos errores.
if(!$_error){ $puntos += $preguntas[$id]['puntos']; }
else { $errores++; }
}
}
echo 'Puntos: ', $puntos, '<br />';
echo 'Errores: ', $errores;
Esta mas o menos explicado con comentarios. Te dejo el código tal cual en debian paste:
http://paste.debian.net/178176/Si tienes cualquier duda comenta.
Saludos