@Triby: me gusto lo de que los value sean numericos.....
Ve directo al final que te dejo una idea aunque seguro lo resolveras mejor.
@CHAEEZ: el puntaje se puede calcular tienendo en cuenta valores para respuestas correctas, incorrectas y preguntas sin contestar:
Cita: $valor_rta_ok = 1; // suma +1
$valor_rta_not_ok = 0; // no suma, podria restar
$valor_rta_null = 0; // no suma, podria restar algo
Preguntas (agrego una, corrijo otra)
Código HTML:
Ver original<form method="POST" action='<?=$_SERVER['PHP_SELF']?>' >
Cual es la capital de Argentina ?
<br/> <input type="radio" name="pregunta0" value="1"/>Paris
<br/> <input type="radio" name="pregunta0" value="2"/>Caracas
<br/> <input type="radio" name="pregunta0" value="3"/>Bogota DC
<br/> <input type="radio" name="pregunta0" value="4"/>Ninguna de las anteriores
<br/> Que es la Metamorfosis
<br/> <input type="radio" name="pregunta1" value="1"/>Cambio de forma
<br/> <input type="radio" name="pregunta1" value="2"/>Un cometa
<br/> <input type="radio" name="pregunta1" value="3"/>Una droga
<br/> <input type="submit" value="Enviar" /> La cartografia del Gran descubrimiento (America) fue ...
<br/> <input type="radio" name="pregunta2" value="1"/>Española
<br/> <input type="radio" name="pregunta2" value="2"/>Italiana
<br/> <input type="submit" value="Enviar" />
Programa:
Código PHP:
Ver original<?php
// Configuracion:
$valor_rta_ok = 1;
$valor_rta_not_ok = 0;
$valor_rta_null = 0;
// respuestas correctas
$correctas = array(4,1,2);
$cant_preguntas = count($correctas); $coincidencias = array();
for ($i=0;$i<$cant_preguntas;$i++){
$var = 'pregunta'.$i;
$rtas[] = (isset($_POST[$var]) ?
$_POST[$var] : null); }
// Calculo puntaje
$cant_correctas = 0;
$cant_nulas = 0;
foreach ($rtas as $pos=>$rta)
{
if ($rta ==null)
$cant_nulas++;
else
$cant_correctas += ($rta == $correctas[$pos]);
}
$cant_incorrectas = $cant_preguntas - $cant_correctas ;
if ($cant_nulas != $cant_preguntas)
{
$puntaje = ($valor_rta_ok*$cant_correctas) + ($valor_rta_not_ok*$cant_incorrectas) + ($valor_rta_null*$cant_nulas);
echo "<p/><b>Puntaje: $puntaje";
}
Cita: Sigo trabajando en esto, pero el plan es incluir en el name del radio la id de cada pregunta, porque las voy a mostrar modificando el orden cada que se resuelva el test... no me sirve consecutivo, aunque podría ser, pero me complicaría más.
Una forma de alterar el orden y que sea dificil / imposible pillar si esa respuesta estubo en otro examen seria generar VALUEs y NAMEs ambos numericos grandes ó alfanumericos complicados como los unique_id() de PHP, luego al momento de leer $_POST o $_GET se buscan esos NAMEs alfanumericos ('AF34534jh34g37447535542') en vez de los tipicos "pregunta23" y... para validar las respuestas en vez de comparar con VALUE="3" lo haces contra VALUE="jj5jj54j554j45j45UUkio" ... lo cual complica un poco la lectura....
Adicional, yo guardaria esos identificadores para respuestas (name y value) en una tabla de "test_generados" y asi los puedo cambiar por cada test realizado !
Podrias guardar el "numero de alumno", "documento" o "IP" en esa tablita de generados (o el ID de la tabla usuarios si son usuarios registrados) ... asi evitas tambien que generen otro test y vuelvan a probar suerte ;)