Ver Mensaje Individual
  #6 (permalink)  
Antiguo 26/11/2013, 15:42
Avatar de marlanga
marlanga
 
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Formulario php preguntas de 1 en una

Como veo que has trabajado bastante en el código, te pongo una forma alternativa de hacer lo que quieres.

Código PHP:
Ver original
  1. <?php
  2.  
  3. $preguntas = array(
  4.     array('pregunta' =>'Donde se ejecuta el codigo PHP?',
  5.         'respuestas' => Array('Servidor','Cliente'),
  6.         'correcta' => 0
  7.     ),
  8.     array('pregunta' =>'Cual de estat son marcas para la insercion del codigo PHP en html?',
  9.         'respuestas' => array('< ? y ? >','< php >< /php >','<# y #>'),
  10.         'correcta' => 0
  11.     ),
  12.     array('pregunta' =>'En que atributo del formulario especificamos la pagina a la que se envian los datos?',
  13.         'respuestas' => array('name','file','action','description'),
  14.         'correcta' => 2
  15.     ),
  16.     array('pregunta' =>'Cual de estas instrucciones esta bien escrita en PHP?',
  17.         'respuestas' => array('if (a=0) print a','if (a==0) echo "hola mundo";','if (a==0) { echo ok }','if (a==0): print a;'),
  18.         'correcta' => 1
  19.     )
  20. );
  21.  
  22. $totalPreguntas=count($preguntas);
  23. if (!isset($_SESSION["respuestas"]))
  24. {
  25.     $_SESSION["respuestas"]=array();
  26.     for($i=0;$i<$totalPreguntas;$i++)
  27.     {
  28.         $_SESSION["respuestas"][]=0;
  29.     }
  30. }
  31.  
  32. $pregunta=(isset($_POST["pregunta"]))?(int)$_POST["pregunta"]:0;
  33. $respuesta=(isset($_POST["respuesta"]))?(int)$_POST["respuesta"]:0;
  34.  
  35. if (isset($_POST["solucion"]))
  36. { //Entra cuando se pulsa el boton de ver resultado
  37.     $_SESSION["respuestas"][$pregunta]=$respuesta;
  38.    
  39.     $totalPreguntas=count($preguntas);
  40.     $correctas=0;
  41.     for ($i=0;$i<$totalPreguntas;$i++)
  42.     {
  43.         if ($preguntas[$i]["correcta"]==$_SESSION["respuestas"][$i]) $correctas++;
  44.     }
  45.  
  46.     ?>
  47.     <html>
  48.     <head>
  49.         <title>Respuestas</title>
  50.     </head>
  51.     <body>
  52.         <h2>Respuestas correctas</h2>
  53.         <p>(<?php echo $correctas; ?> de <?php echo $totalPreguntas; ?>)</p>
  54.         <a href="index.php">Volver a las preguntas</a>
  55.     </body>
  56.     </html>
  57.  
  58. <?php
  59. }
  60. else
  61. { //Entra cuando se quiere responder a alguna de las preguntas
  62.     $adelante=isset($_POST["adelante"]);
  63.     $atras=isset($_POST["atras"]);
  64.  
  65.     if ($adelante){
  66.         $_SESSION["respuestas"][$pregunta]=$respuesta;
  67.         $pregunta=min(count($preguntas)-1,$pregunta+1);
  68.     }
  69.     else if($atras){
  70.         $_SESSION["respuestas"][$pregunta]=$respuesta;
  71.         $pregunta=max(0,$pregunta-1);
  72.     }
  73.     ?>
  74.     <html>
  75.     <head>
  76.         <title>Pregunta N-<?php echo ($pregunta+1); ?></title>
  77.     </head>
  78.     <body>
  79.         <form action="index.php" method="POST">
  80.         <h2>Pregunta N-<?php echo ($pregunta+1); ?></h2>
  81.         <p><?php echo htmlentities($preguntas[$pregunta]["pregunta"]); ?></p>
  82.         <?php for($i=0;$i<count($preguntas[$pregunta]["respuestas"]);$i++) {
  83.             $tachado=($_SESSION["respuestas"][$pregunta]==$i)?'checked="checked"':'';
  84.             ?>
  85.             <input name="respuesta" value="<?php echo $i; ?>" type="radio" <?php echo $tachado; ?>/>
  86.             <?php echo htmlentities($preguntas[$pregunta]["respuestas"][$i]); ?><br/>
  87.         <?php } ?>
  88.         <input type="hidden" name="pregunta" value="<?php echo $pregunta; ?>" />
  89.         <input type="submit" name="adelante" value="Adelante" />
  90.         <input type="submit" name="atras" value="Atras" />
  91.         <?php if($pregunta==$totalPreguntas-1) { ?>
  92.         <input type="submit" name="solucion" value="Ver solucion" />
  93.         <?php } ?>
  94.         </form>
  95.     </body>
  96.     </html>
  97. <?php } ?>

Copia y pega todo el código en un archivo index.php y pruébalo.

La sesión sólo contendrá un array de respuestas dadas. Lo primero que hago es comprobar si existe ese array de respuestas en la sesión. Si no existe, lo creo y lo lleno de ceros (uno por cada pregunta).

No es muy usado, pero es posible poner varios input:submit con diferentes names en los formularios, y cuando se envíe el formulario, sólo se enviará el name del onput:submit que se presionó. Eso me servirá para enviar el formulario a la vez que sabré si se ha pulsado "adelante" o "atrás", abrá un input:submit para cada uno. Y otro más para ver la solución de la página, pero sólo cuando la pregunta msotrada sea la última.

En un input:hidden del formulario pondré el índice (posición en el array) de la pregunta que estoy mostrando, para así poder almacenar la respuesta cuando el servidor reciba el formulario. Ese campo, mas el input:submit presionado, me servirá para saber qué pregunta mostrar.

Y esto es todo, entiendiendo lo escrito, el código es fácil de seguir.