Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Tablas relacionadas

Estas en el tema de Tablas relacionadas en el foro de Bases de Datos General en Foros del Web. Hola. Tengo estas dos tablas: TEST //Guarda 5 preguntas de un test id_test (PK) p-1 (FK) p-2 (FK) p-3 (FK) p-4 (FK) p-5 (FK) PREGUNTAS ...
  #1 (permalink)  
Antiguo 01/06/2004, 07:40
Avatar de sedinho  
Fecha de Ingreso: marzo-2003
Mensajes: 91
Antigüedad: 21 años, 1 mes
Puntos: 0
Tablas relacionadas

Hola. Tengo estas dos tablas:

TEST //Guarda 5 preguntas de un test
id_test (PK)
p-1 (FK)
p-2 (FK)
p-3 (FK)
p-4 (FK)
p-5 (FK)



PREGUNTAS //Cada una de las preguntas de un test con su respuesta correcta
id_pregunta (PK)
r-a
r-b
r-c
rcorrecta


Es decir, desde la tabla TEST se relaciona cada campo "p-1", "p-2",...,"p-5" (preguntas) con un registro de la tabla PREGUNTAS. En PREGUNTAS aparece "r-a", "r-b", "r-c" y "rcorrecta" que son respuesta a, respuesta b, respuesta c y respuesta correcta.
A parte, he creado un formulario con un campo de texto vacio para introducir la pregunta, 3 campos de texto vacios para introducir respuestas y uno mas para indicar la respuesta correcta. Es decir, un formulario para que pueda crear un test.
Mi pregunta es que instruccion MySQL (bajo PHP) debo escribir para que cuando rellene un formulario automaticamente me guarde los campos de respuesta y correcto en la tabla PREGUNTAS y el id_pregunta se inserte en el "p-1" (por ejemplo) de la tabla "TEST"
  #2 (permalink)  
Antiguo 01/06/2004, 10:40
Avatar de Kelpie  
Fecha de Ingreso: febrero-2002
Ubicación: NorthSpain
Mensajes: 609
Antigüedad: 22 años, 2 meses
Puntos: 8
Suponiendo que los datos los vas a escribir tu para llenar tablas...

Un script no inserta datos 'por ejemplo' sino 'por algo'. Es decir, cada registro de la tabla TEST va a guardar datos de 5 preguntas, pero tu solo vas a generar una pregunta de cada vez. ¿En qué campo p-x vas a meterla?. Yo me pondría un par de cuadros de texto más para especificar el registro de TEST a llenar y el campo p-x. Aunque también (y es mejor) se podrían generar de golpe las 5 preguntas y así no hay problemas...

Si has definido las constraint de las tablas solo te queda la segunda opción ya que no debería dejarte meter datos en una FK sin que exista aún su PK.

Si optas por especificar los dos datos de más el esquema sería (contando con que el formulario envia datos del tipo campo1, campo2...):

1º Añadir las claves primarias...
$sq1="INSERT INTO PREGUNTAS (id_pregunta,r-a,r-b,r-c,rcorrecta) VALUES ('$campo1','$campo2','$campo3','$campo4','$campo5' )";
$res1=@mysql_query($sq1) or die("Error");

2º Comprobar si existe el TEST
$sq1="SELECT id_test FROM TEST WHERE id_test='$campo6'";
$res1=@mysql_query($sq1) or die("Error");
if(@mysql_num_rows($res1)<1){
//Hay que añadir el registro
$sq2="INSERT INTO test (id_test,$campo7) VALUES ('$campo6','$campo1')";
}else{
//Hay que actualizar el registro
$sq2="UPDATE test SET $campo7='$campo1' WHERE id_test='$campo6'";
}
$res2=@mysql_query($sq2) or die("Error");


La segunda opción te la pongo en otro mensaje para no aburrir...
  #3 (permalink)  
Antiguo 01/06/2004, 12:43
Avatar de sedinho  
Fecha de Ingreso: marzo-2003
Mensajes: 91
Antigüedad: 21 años, 1 mes
Puntos: 0
Gracias por responder. Vamos a ver:
Efectivamente, como bien dices, creo un formulario para poder recoger de una sola vez todos los datos de un test, lo hago de esta forma:


<form name="test" method="get" action="creartest.php" onSubmit="return Validar()">

<script language="javascript" type="text/javascript">

for (i=1; i<11; i++)

{

document.write("Pregunta " + i + ": <input type='text' name='p" + i + "' size='100' maxlength='200'>");
document.write("<p style='margin-left: 20px;'>Respuesta a:<input type='text' name='r" + i + "a' size='100' maxlength='200'></p>");
document.write("<p style='margin-left: 20px;'>Respuesta b:<input type='text' name='r" + i + "b' size='100' maxlength='200'></p>");
document.write("<p style='margin-left: 20px;'>Respuesta c:<input type='text' name='r" + i + "c' size='100' maxlength='200'></p>");
document.write("<p style='margin-left: 20px;'>Respuesta d:<input type='text' name='r" + i + "d' size='100' maxlength='200'></p>");
document.write("<p style='margin-left: 20px;'>Respuesta Correcta:<select name='rc" + i + "'>");
document.write("<option value='a'>a</option>");
document.write("<option value='b'>b</option>");
document.write("<option value='c'>c</option>");
document.write("<option value='d'>d</option>");
document.write("</select></p>");
document.write("<hr>");
}

</script>

De esta forma, se genran 10 (que es realmente lo que necesitaba, no 5 como os puse antes) campos para preguntas y por cada campo para preguntas se crean 4 campos para respuesta y uno para decir cual de esas cuatro es la correcta.
Esto funciona bien.

Luego, en el formulario "creartest.php" recojo todas las variables creadas antes y las meto en la basse de datos asi:

for ($i=1; $i<11; $i++)
{
$pregunta="p".$i;
$respuesta_a= "r".$i."a";
$respuesta_b= "r".$i."b";
$respuesta_c= "r".$i."c";
$respuesta_d= "r".$i."d";
$rcorrecta= "rc".$i;

$p=$$pregunta;
$a=$$respuesta_a;
$b=$$respuesta_b;
$c=$$respuesta_c;
$d=$$respuesta_d;
$r=$$rcorrecta;

//Lo de arriba lo hago porque no se recogerlas de otra forma. Se que no esta bien, asi que si alguien
//me puede decir una forma mejor se lo agradeceria

//elegimos la consulta

$sql = "INSERT INTO preguntas (pregunta,ra,rb,rc,rd,rcorrecta) VALUES ('$p','$a','$b','$c','$d','$r')";
//He quitado la forma r-a por ra a secas porque me daba problemas
//A la hora de añadir solo añado pregunta,ra,rb,rc,rd y rcorrecta. Hay otro campo que es
//id_pregunta, pero es autonumerico y es la PK y se actualiza solo.

//Enviamos la consulta. En $consulta recibimos la respuesta
$consulta= mysql_query($sql,$link) or die ('No se puede insertar datos por la siguiente razón: ' . mysql_error());


}

Todo esto lo hace bien, es decir, que la tabla PREGUNTAS se va creando y actualizando correctamente. Ahora solo me falta que cuando se añadan a la tabla PREGUNTAS cada una de estas preguntas, a la vez se añada a la tabla TEST cada uno de los id_pregunta en su correspondiente campo (es decir, la primera pregunta de esta ristra añada su id_pregunta en p-1 de la tabla TEST, la segunda pregunta añada su id_pregunta en la p-2 de la tabla TEST y asi sucesivamente).


¡¡¡Uffffff. Vaya cacho de trozo que os he soltado!!! En fin, a ver si me he explicado bien y me podeia ayudar. Gracias de nuevo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:21.