2

La evaluación con problemas planteados y sus respectivas opciones de respuesta de solo texto funciona sin inconvenientes por ejemplo:

a1     a2     a3     a4     answer
1/9    19/5   12/1  1/4      19/5

Las columnas a1, a2, a3, a4 son las opciones y la columna answer tiene la respuesta correcta, mediante JSON se genera esta información:

[
    'name'         => 'respuesta_1',
    'question'     => 'Planteamiento del problema?',
    'alternatives' => [1/9, 19/5, 12/1, 1/4],
    'answer'    => 19/5,
],

Donde sí selecciono la opción correcta 19/5 este me califica tal cual ganándome 1 punto.

introducir la descripción de la imagen aquí

Pero ya en el caso donde existen opciones donde no puedo agregar texto si no imágenes en las columnas a1, a2, a3, a4, el código PHP no puede detectar si es o no la opción seleccionada correcta o incorrecta es más aún así cuando se ha seleccionado la respuesta de imagen correcta esta la evalúa como incorrecta.

introducir la descripción de la imagen aquí

Por ejemplo, en este caso de imagen, yo tenía los siguientes datos registrados:

a1
<img src="https://i.imgur.com/HdfyxwC.png" width="18">
a2
<img src="https://i.imgur.com/4QIRf6R.png" width="18">
a3
<img src="https://i.imgur.com/fSNMF2l.png" width="18">
a4
<img src="https://i.imgur.com/DMTiaxk.png" width="18">
answer
<img src="https://i.imgur.com/fSNMF2l.png" width="18">

Como puedo solucionar este problema de evaluación, me pueden explicar como puedo hacer para que el calificador funcione tanto para texto como para imagen.

El código PHP que realiza esta evaluación es el siguiente:

results-evaluations.php

    $sql = "SELECT * FROM quiz";
    $result = $con->query($sql);

    while($row = mysqli_fetch_assoc($result)) {
        $answers[] = [
            'name' => 'respuesta_'.$row["id_question"],
            'question' => $row["question"],
            'alternatives' => [$row["a1"], $row["a2"],$row["a3"],$row["a4"]],
            'answer' => $row["answer"]
        ];
    }

    $questions = [];

    foreach($answers as $index => $answer) {
        $questions[]=$answer;
        $questions[$index]['answer']=null;
    }

 $final=[];
// Hay que evaluar
if(isset($_POST['student'])) {
    $student = $_POST['student'];

    $result=[];
    $qualify_score = 0;
    $top_score = sizeof($answers);

    foreach($answers as $index => $answer) {
        $result_quote=['index'=>$index]; 
        $result_quote['question']=$answer['question']; 
        $result_quote['your_answer']=isset($_POST[$answer['name']])? $_POST[$answer['name']] : 'N/A';
        $result_quote['correct_answer']= $answer['answer'];
        $result_quote['qualify_score']=($result_quote['your_answer']==$result_quote['correct_answer'])? 1:0;

        $qualify_score+=$result_quote['qualify_score'];
        $result[]=$result_quote;

    }
    $final=[
        'student'=>$student,
        'result'=>$result,
        'qualify_score'=>$qualify_score.' / '.$top_score
    ];

}
echo json_encode($final);

Por el momento entiendo que le código esta vulnerable, esto lo solucionare más adelante en la materia a orientados a objetos y seguridad.

Jacks
  • 173
  • 1
  • 10
  • Tu pregunta no se entiende bien. Pero intuyo que puedes incluir información en el elemento de la imagen, por ejemplo un `id` poniendo: ``, luego, junto con la imagen mandas la info de su atributo `id` y lees ese id. O, si quieres enviar más información, puedes usar los atributos `data-` de HTML. Supongo que estás enviando la info al servidor vía Ajax. – A. Cedano Nov 13 '18 at 13:56
  • @A.Cedano La información se envía por `ajax` basado a la [respuesta de amenadiel](https://es.stackoverflow.com/questions/205655/c%C3%B3mo-mostrar-los-resultados-de-la-evaluaci%C3%B3n-en-la-misma-p%C3%A1gina). Pero no logro entender su comentario, esas columnas `a1, a2, a3, a4` se convierten en opciones de respuestas y luego se comparan con la información de `answer` si una de las opciones seleccionadas coincide. – Jacks Nov 13 '18 at 14:13
  • @A.Cedano He editado la pregunta, espero sea más compresible ahora. – Jacks Nov 13 '18 at 14:22
  • Más que el código PHP que muestras, la solución a tu problema, creo yo, está del lado del cliente. En la petición Ajax que construyes en el cliente hay un parámetro `data` donde pones todos los datos que el servidor va a necesitar para trabajar. En ese parámetro `data` puedes por ejemplo en el caso de las imágenes, enviar el `id` de la imagen que ha sido seleccionada y ya con eso sabrás si se seleccionó la imagen `a1, a2, a3...` y actuar en consecuencia. ¿Acaso el problema que tienes no es saber una forma de identificar la imagen que fue seleccionada? – A. Cedano Nov 13 '18 at 14:28
  • @A.Cedano Ya me dolió la cabeza, realizarlo de tal forma creo que significa estructurar todo código jQuery y que pasaría luego cuando las respuesta son solo texto? – Jacks Nov 13 '18 at 14:52
  • Jacks, sigo insistiendo en que la clave está en tu código Javascript/Ajax. Puedes organizar los datos que envías al servidor de tal modo que el servidor sepa lo que ocurrió en el cliente. Por ejemplo, dentro de `data` puedes poner una clave que indique el tipo de respuesta: `image` o `text`... luego, puedes poner las respuestas, pasando si quieres el `id` de cada una. Luego en el servidor, buscas si en el POST hay la clave `image` o la clave `text` y en base a eso buscas lo que tengas que buscar. No sé si me entiendes... – A. Cedano Nov 13 '18 at 14:55
  • ... si son respuestas mixtas, que comprendan imagen y texto, lo mismo. Puedes organizar `data` usando pares, que indiquen de un lado el tipo de elemento y del otro la respuesta. O puedes usar una convención de identificación que indique qué tipo de elemento es. Por ejemplo: `imgA1, txtA1, imgA2, txtA2...` se entiende que los id que empiecen con `img` son imágenes (`A1`) sería la respuesta, y los que empiecen por `txt` son texto. O sea, es cuestión de tener un poco de creatividad en el código, usando tus id de forma inteligente y renunciando a puntos de vista rígidos. ¿Me entiendes o no? – A. Cedano Nov 13 '18 at 14:59

1 Answers1

0

Jacks aquí te dejo un ejemplo, a ver si se entiende mejor lo que quiero explicarte.

La lógica que se sigue es muy simple. Yo voy a usar de forma inteligente los id de cada elemento para identificar si se trata de un texto (txt) o de una imagen (img). Al pulsar en el botón mi código JS crea una variable data que podría ser enviada al servidor.

Por ejemplo, si se selecciona la opción B en texto y la opción C en imagen, vamos a enviar esta info al servidor:

{
  "respuestas": [
    "txt2",
    "img3"
  ]
}

Simplemente por la nomenclatura, ya sabremos que:

  • la respuesta uno es del tipo texto y corresponde a a2, por algo tiene el id txt2 ...
  • la respuesta dos es del tipo imagen y corresponde a a3, por algo tiene el id img3 ...

Con esos datos, el servidor ya sabrá como tiene que trabajar.

No sé si es exactamente ese tu escenario, pero la respuesta muestra una forma de usar nuestros identificadores inteligentemente para saber el tipo de elemento que se está pulsando y a qué respuesta corresponde.

var btnEnviar = document.getElementById('btnEnviar');
btnEnviar.onclick = function() {
  var txtRadio = document.querySelector('input[name = "txt"]:checked').id;
  var imgRadio = document.querySelector('input[name = "img"]:checked').id;
  var data = {
    respuestas: [txtRadio, imgRadio]
  };
  console.log(data);
};
.question-img {
  vertical-align: middle;
  margin-bottom: 5px;
}
<div>
  <p><b>Seleccione (texto):</b></p>

  <input type="radio" id="txt1" name="txt" value="1/9" checked />
  <label for="txt1">A) 1/9</label> <br />

  <input type="radio" id="txt2" name="txt" value="19/5" />
  <label for="txt2">B) 19/5</label> <br />

  <input type="radio" id="txt3" name="txt" value="12/1" />
  <label for="txt3">C) 12/1</label> <br />

  <input type="radio" id="txt4" name="txt" value="1/4" />
  <label for="txt4">D) 1/4</label> <br />
</div>


<div>
  <p><b>Seleccione (imagen):</b></p>

  <input type="radio" id="img1" name="img" value="9/50" checked />
  <label for="img1">A) <img class="question-img"  src="https://i.imgur.com/HdfyxwC.png" width="18"></label> <br />

  <input type="radio" id="img2" name="img" value="19/50" />
  <label for="img2">B) <img class="question-img"  src="https://i.imgur.com/4QIRf6R.png" width="18"></label> <br />

  <input type="radio" id="img3" name="img" value="9/19" />
  <label for="img3">C) <img class="question-img"  src="https://i.imgur.com/fSNMF2l.png" width="18"></label> <br />

  <input type="radio" id="img4" name="img" value="10/19" />
  <label for="img4">D) <img class="question-img"  src="https://i.imgur.com/DMTiaxk.png" width="18"></label> <br />
</div>
<hr />
<button id="btnEnviar">Enviar</button>
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • los campos `input` pueden tener más de un nombre, porque todos los `input` ya están identificados con sus respectivos `name` `` – Jacks Nov 13 '18 at 16:30
  • @Jacks los `radio` por ejemplo suelen tener el mismo `name` por grupos, debido a que son elementos de los que sólo se puede seleccionar uno. El mismo `name` sirve por ejemplo para saber, de todos los radio con ese `name` cuál ha sido seleccionado. Desde el punto de vista de HTML lo que está prohibido repetir es el id, pero no el name. En cualquier caso, eso es lo menos importante, tú puedes usar el `id`, o el `name` para identificar inteligentemente los elementos y por el mismo `name` puedes saber de qué elemento se trata según el contexto. – A. Cedano Nov 13 '18 at 16:35
  • me imagino que en la columna `answer` debo agregar esto `img3` en vez de la etiqueta de img. – Jacks Nov 13 '18 at 16:54
  • @Jacks no entendí bien tu comentario. Teniendo las respuestas, puedes adaptar el código PHP para que lea y determine qué tipo de respuesta hubo (texto o imagen) y qué respuesta fue: (la 1, la 2, la 3...). Eso es lo de menos. – A. Cedano Nov 13 '18 at 17:01