Examen tipo test MySQL y PHP

Iniciado por migue_coco, 29 Mayo 2013, 11:31 AM

0 Miembros y 1 Visitante están viendo este tema.

migue_coco

Buenas a todos.
Tengo una duda en la que estoy atascado y espero que podais echarme un mano.
Tengo una base de datos en la que se han guardado las respuestas a un examen tipo test. Son 105 respuestas de tipo A, B, C y D
En la base de datos, la estructura es:
Lengua1
Lengua 2
Lengua 3
...
Lengua 15
Matematicas 1
Matematica 2
...
Matematicas 15
Sociales 1
Sociales 2
...
Hasta las 105 preguntas

El caso es que quisiera hacer un codigo PHP en el que yo le indico que recupere los valores de cada respuesta de la base de datos.
Y despues indicar que:
Lengua 1 debe ser = a B (como respuesta correcta)
Lengua 2 = C
Lengua 3 = A
...
Hasta ahi todo bien,
pero claro, lo que no tengo ni idea de como hacer es para que me cuente cuantas respuestas correctas, (o cuantas igualdades se confirman)

Habia pensado en indicar que si la igualdad es correcta le asigne  Value = 1, si es incorrecta Value = 0 y despues contar cuantos 1 existen
Pero no se si ese planteamiento es correcto, ni se como se debe hacer.

Creen que pueden echarme un mano con el codigo?
Es que de la idea en mi cabeza a escribir el codigo, para mi, hay un paso muy grande y no consigo plasmar la idea en php :S

Un saludo y muchas gracias por la ayuda!!

El Che Guevara

...parece algo simple pero hasta lo mas simple lleva mucho codigo de programacion....
bajate 'pangolin professional edition' y desile a tu profe que lo programaste vos! jaa  :laugh:
"la unica verdad es la realidad" (Domingo Peron)

#!drvy

Hola,

Cuando dices:  "En la base de datos, la estructura es:"
Te refieres a que en una tabla tienes 105 celdas y cada una de ella es del tipo "Lengua1","Lengua 2" ?

O, podrías poner como tienes la estructura (exactamente) ?

Saludos


migue_coco

El problema es que el profesor soy yo jajajaja
Si, la estructura es nombre, email, y las 105 respuestas, atendiendo a la forma que puse al principio.

Entonces, seria posible que si una igualdad se cumple, darle un value y despues hacer un count de los values=1??

O me estoy inventando esto??

Gracias por vuestra ayuda!!

#!drvy

Hola,

Entonces, según he entendido no has guardado en la BD las respuestas correctas. Yo lo que haría, seria indicar todas en un array, tal y que 'Lengua1'=>'a', y así sucesivamente. Luego, sacaria todas las respuestas y las pasaría por el array.

Te dejo un ejemplo mas o menos.

Código (php) [Seleccionar]
<?php
$client 
mysqli_connect('localhost','root','','test');
if(!
$client){die('No se pudo conectar a la bd.');}

$correctas = array(
   
'Lengua1'=>'a',
   
'Lengua2'=>'b',
   
'Lengua3'=>'a',
   
'Lengua4'=>'d',
   
'Lengua5'=>'a',
   
'Matematicas1'=>'b',
   
'Matematicas2'=>'c',
   
'Matematicas3'=>'d',
   
'Matematicas4'=>'a'
);

$query 'SELECT * FROM examen';
$resultado mysqli_query($client,$query);

// $respuestas contendrá las cuentas (correctas/incorrectas) por cada columna.
$respuestas = array(); // Array para modo estrcito.

// Por cada resultado,
while($row mysqli_fetch_array($resultado,MYSQLI_ASSOC)){
   
// Creamos un array por cada email que contara y lo ponemos en 0
   
$respuestas[$row['email']] = array('correctas'=>0,'incorrectas'=>0);
   
// Por cada item en $correctas.
   
foreach($correctas as $index=>$correcta){
      
// Comprobamos si el valor que contiene el nombre del item (Lengua1,Lengua2) que hemos sacado de la bd
      // Coincide con la respuesta correcta.
      
if($row[$index]===$correcta){
         
// Si coincide sumamos 1 correctas
         
$respuestas[$row['email']]['correctas']++;
      }else{
         
// Si no coincide sumamos a incorrectas.
         
$respuestas[$row['email']]['incorrectas']++;
      }
   }
}

echo 
'<pre>';
print_r($respuestas);
?>


La idea, es que el nombre de $correctas (Lengua1,Lengua2) coincida exactamente con el nombre que tiene la celda en la bd y que la respuesta (a,b,c,) sea la correcta. Si todo sale bien, el resultado seria algo asi xD.

Array
(
    [listillo@soylist.com] => Array
        (
            [correctas] => 9
            [incorrectas] => 0
        )

    [juancho@intentoserlisto.com] => Array
        (
            [correctas] => 2
            [incorrectas] => 7
        )

)


Saludos

migue_coco

Gracias por la respuesta!!!

He probado ese codigo (con algunas modificaciones mias) y me reporta este error:

Warning: mysql_fetch_array() expects parameter 1 to be resource, null given in /home/../enviar.php on line 43

Array
(
)

Linea 43:
while($row = mysqli_fetch_array($resultado,MYSQLI_ASSOC)){

A que se debe ese error?
Un saludo!

#!drvy

Algo te falla en la consulta Prueba cambiar esto:
Código (php) [Seleccionar]
$resultado = mysqli_query($client,$query);

Por
Código (php) [Seleccionar]
$resultado = mysqli_query($client,$query);
if(!$resultado){die('Error en consulta: '.mysqli_error($client));}


Así te debería de mostrar el error que salta en la consulta.

Saludos

migue_coco

Vale, el problema es que en parte de mi codigo esta usando
mysql_algo
Y despues al copiar, habiadejado
msyqlI_algo
Al quitar la I no aparece el error.
Pero el print sale sin ningun valor
Array(
)
No muestra nada dentro...

Jo, lamento mi torpeza!!

#!drvy

Hola,

Yo te he puesto le código con la libreria mysqli (osease, con una i latina al final). Es porque mysql_ esta considerado como obsoleto y terminara por desaparecer de php.

Saludos

migue_coco

Vale.
Ya lo he solucionado.
Os cuento, porque pensaba que podia hacer lo que yo tenia pero parece que no.
El caso es el siguiente.
Os lo explico con todo detalle:
Primero, la base de datos tiene el nombre, email, 105 respuestas y otros datos personales.
Claro, yo pensaba que podia añadir este codigo al que yo tenia, de forma que se mostraran los datos personales y debajo las respuestas correctas e incorrectas.
Pero tal y como lo tenia, hacia que el array no funcionara.
Mi codigo era este:

<HTML>
<HEAD>
<TITLE>Correcion</TITLE>
</HEAD>
<BODY>
<?php
//Incluimos datos de conexion
include("conectar.php");
// Nos conectamos a phpmyadmin
$conectar mysql_connect($dbhost$dbuser$dbpasswd);
// Comprobamos que  nos pudieramos conectar a phpmyadmin
if (!$conectar) {
    die(
'No se pudo conectar a la base: ' mysql_error());
}
// Nos conectamos a la base
mysql_select_db($dbname);
//Cogemos los campos del formulario
$ID=$_POST['ID'];
//Realizamos la consulta
$sql "SELECT Nombre, Email, FROM test_online_1 
WHERE ID = '
$ID'";
$result mysql_query($sql);
?>

<table align="center">
<tr>
<th>Nombre</th>
<th>Email</th>
</tr>
<?php
// Recoger y mostrar los resultados
while ($result_fila mysql_fetch_array($result)){
echo 
'<tr><td>' .$result_fila['Nombre'] . '</td>';
echo 
'<td>'.$result_fila['Email'] . '</td></tr>';
}
mysql_free_result($result)
?>

</table>
</BODY>
</HTML>


Entonces yo habia pegado debajo del while que yo habia hecho, el while del codigo que habeis puesto aqui, pero asi no funciona.
Entonces, para que se entienda.
Una tabla en la que ponga
Nombre | Email | Dato personal 1 | Dato personal 2 | etc...
Y debajo me muestra el array.

Se entiende lo que quiero decir?
Muchisimas gracias por vuestra ayuda!!
Un saludo!!!!

P.D. ya, lo de la i latina lo conocia, pero son manias que cuesta dejar jejejeje