Formulario con 2 inputs submit
5 seguidores
Hola de nuevo por el foro,
En esta ocasión os quiero comentar un problema que tengo con un formulario que tiene dos inputs submit en el mismo documento y el action es el mismo. Los datos van a parar a una bbdd.
En el primer submit se selecciona una asignatura y en el segundo submit se inserta otra. Pero si la asignatura ya existe no se debería enviar a la bbdd.
Aquí os dejo el código
Espero haberme explicado.
El tema es que si el valor de la variable de la primera asignatura ya existe no vaya a parar a la bbdd el valor al añadir otra asignatura.
<?php
include('conexion_mysql.php');
@mysql_query("SET NAMES 'utf8'");
$asignaturas=mysql_query("SELECT asignaturas.nombre as asig FROM asignaturas",$link);
$area=mysql_query("SELECT asignaturas.area as area FROM asignaturas,interseccion",$link);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-type" content="text"/>
<link type="text/css" rel="stylesheet" href="stylo_ejerciciomysql.css" media="screen" />
<title>formulario del ejercicio mysql</title>
</head>
<body style="font-family: verdana,arial, sans-serif; font-size: 10pt;">
<?php
if(!isset($_POST['submit']) && (!isset($_POST["submit2"]))) {
?>
<form method="POST" action="formulario.php" class="form">
<fieldset class="fieldset">
<legend class="legend">INTRODUCE LOS SIGUIENTES DATOS</legend>
<table>
<tr>
<td style="font-weight:bold;">Nombre:</td>
<td>
<input type="text" name="nombre"/>
</td>
</tr>
<tr>
<td style="font-weight:bold;">Apellidos: </td>
<td>
<input type="text" name="apellidos"/>
</td>
</tr>
<tr>
<td style="font-weight:bold;">DNI: </td>
<td>
<input type="text" name="dni" maxlength="9"/>
</td>
</tr>
<tr>
<td style="font-weight:bold;">Asignatura: </td>
<td>
<select type="text" name="asignaturas_id">
<?php
if($asignaturas===false) die(mysql_error());
while($row=mysql_fetch_assoc($asignaturas)) {
$array=array('<option>'.$row["asig"].'</option>');
print_r($array);
}
?>
</select>
</td>
</tr>
<tr>
<td style="font-weight:bold;">Área: </td>
<td>
<select type="text" name="area_id">
<?php
if($area==false) die(mysql_error());
while($row=mysql_fetch_assoc($area)) {
$arrayb=array('<option>'.$row["area"].'</option>');
print_r($arrayb);
}
?>
</select>
</td>
</tr>
</table><tr><br><br>
<input type="submit" name="submit"/>
</fieldset>
</form>
<br><br>
<form method="POST" action="formulario.php" class="form">
<fieldset class="fieldset"><br>
<legend class="legend">INSERTAR NUEVA ASIGNATURA</legend>
<table>
<tr>
<td style="font-weight:bold;">Asignatura: </td>
<td>
<input type="text" name="nuevaasig" maxlength="15"/>
</td>
</tr>
<tr>
<td style="font-weight:bold;">Área: </td>
<td>
<input type="text" name="area" maxlenght="9"/>
</td>
</tr>
</table><tr><br><br>
<input type="submit" name="submit2"/>
</fieldset>
</form>
</body>
</html>
<?php
}
//PARA OBTENER LOS DATOS SI HAY ENVIO
else {
// RECUPERAR LAS VARIABLES DEL FORMULARIO
// ENVÍO DEL PRIMER SUBMIT
if(isset($_POST["submit"])) {
$nombre=$_POST["nombre"];
$apellidos=$_POST["apellidos"];
$dni=$_POST["dni"];
$asignaturas_id=$_POST["asignaturas_id"];
$area_id=$_POST["area_id"];
$insertar=mysql_query("INSERT INTO alumno(nombre,apellidos,dni)VALUES('{$nombre}','{$apellidos}','{$dni}')",$link);
$alumno_id=mysql_insert_id();
$insert=mysql_query("INSERT INTO asignaturas (nombre,area) VALUES ('{$asignaturas_id}','{$area_id}')",$link);
$my_error=mysql_error($link);
}
// ENVÍO DEL SEGUNDO SUBMIT
if(isset($_POST["submit2"])) {
$nuevaasig=$_POST["nuevaasig"];
$area=$_POST["area"];
$insert=mysql_query("INSERT INTO asignaturas (nombre,area) VALUES ('{$nuevaasig}','{$area}')",$link);
$my_error=mysql_error($link);
}
?>
<html>
<head>
<!--<meta http-equiv="Refresh" content="5; URL=http://localhost/EJERCICIO_mysql/ejercicio_mysql.php">-->
<meta charset="UTF-8"/>
<link type="text/css" rel="stylesheet" href="stylo_ejerciciomysql.css" media="screen" />
<title>formulario del ejercicio mysql</title>
</head>
<body style="font-family: verdana,arial, sans-serif; font-size: 10pt;">
<?php
if(!empty($my_error)){
echo "Ha habido un error al insertar los valores. $my_error";
}
else {
echo '<p class="parrafoformulario">Los datos han sido introducidos satisfactoriamente';
include('desconexion(b)_mysql.php');
}
}
?>
</body>
</html>
excel
Je, je. No me extraña JuaRoAl...
Ya lo tengo aclarado
Mil gracias a todos
juaroal
¿Porqué no pones el enunciado del ejercicio para que entendamos lo que te piden? Porque yo me sigo sin aclarar xD
¡Un saludo!
fakito
Hola Segol,
Lo la tabla de intersección que comentas lo único que tienes que hacer es recoger el id del insert del alumno, el id de la asignatura ya lo tienes en el $_POST, y hacer otro insert a la tabla de intersección.
Según el método que uses para la conexión a la base de datos tienes una función u otra para recuperar el último id insertado. En el código de ejemplo que subí lo usé con PDO para recuperar el el id de la asignatura insertada, puedes echarle un ojo.
Lo del MySQLi no te sabría decir ya que no uso XAMPP, pero me imagino que será cuestión de meter la extensión en el php.ini como comentas. Busca a ver si tienes esta línea:
extension= php_mysqli.dll
Y si no está prueba a añadirla. Deberás reiniciar el servidor, eso si.
excel
Una pregunta Fakito, si bien ya havia visto que mysql està obsoleta, frente a mysqli, yo que trabajo con xampp no me reconoce esta modalidad. Tu sabes si tengo que anyadir alguna extension al archivo php.ini?
excel
Hola Fakito,
Pues tenías razón....
Cada vez que insertaba un alumno, estaba insertando también una nueva asignatura, aunque ya existiera...
Realmente lo que sí quiero insertar cuando inserto un alumno, es insertar en la tabla intersección (formada por el id del alumno y el id de la asignatura), el los id correspondientes de alumno y de asignatura. Y esto ahora no se me inserta.
fakito
Hola Segol,
En lo de las tablas no hay mucho que discrepar, tienen sus usos y la maquetación no es uno de ellos. Si aún así quieres usarlas para diseñar la página no es asunto mio.
Para la conexión a la base de datos no te lo propongo yo, te lo proponen el mismo lenguaje, mysql_* está obsoleto, usa MySQLi o PDO.
http://es1.php.net/manual/es/function.mysql-query.php
excel
Hola Fakito,
Gracias. Me miraré con calma el código, seguro que saco ideas de provecho.
En lo que discrepo es en lo de las tablas. Como tu muy bien dices la consulta va dirigida a php. Yo suelo utilizar las tablas en php, y sí, sé que en html están un tanto obsoletas.
Una pregunta Fakito. Dices que las funciones mysql_*, están obsoletas, ¿Qué opción propones?
Respecto a si hay detalles extraños y poco habituales, tienes razón, pero el código forma parte de un ejercicio de php de un curso que estoy realizando, por lo que debe seguir ciertas normas. No es un caso real. Si fuera por mí, ya me hubiese complicado menos la vida...je, je, je
Por lo demás me pongo a valorar tus soluciones....
Mil gracias
fakito
Hola Segol,
Al igual que al resto de compañeros a mi también se me hace difícil entender lo que te hace falta. Aún así, a ver si con algunos comentarios puedes dar con la solución, o al menos darle otro enfoque al problema.
Lo primero es que deberías dejar de usar las funciones mysql_*, están obsoletas y son propensas a causar problemas de seguridad. sin ir más lejos, en tu código hay varios 'sql injection' que en producción te podrían causar muchos problemas.
Otra cosa que también te recomendaría es que no hagas la maquetación del HTML usando tablas, hace mucho que superamos esa etapa. En cualquier caso tu pregunta va enfocada al PHP así que si necesitas repasar o actualizar tu HTML/CSS igual es mejor que te pases por el foro de programación cliente.
Y ya entrando al tema, puedes tener varios submit en el mismo formulario como propones, aunque no es lo habitual. Incluso puedes usar el mismo campo 'name' en los dos submits ya que solo se envía al servidor el valor del campo que se haya usado para enviar el formulario.
En tu código estás usando dos formularios distintos, cada uno con su correspondiente submit, así que no coincide con lo que estás pidiendo. Si usas el mismo nombre para los submits en el PHP solo tienes que mirar su valor y puede resultar más fácil de gestionar.
La estructura de tus datos también es algo extraña. Viendo el formulario entiendo que lo que quieres hacer es asignar una asignatura a un usuario, pero en el insert no le estás dando el id de la asignatura, así que los dos selects tal y como están no hacen ninguna función.
También dices que si la asignatura ya existe no debe introducirse de nuevo en la base de datos, sin embargo tú mismo las estás volviendo a introducir cada vez que añades un alumno. Si te fijas, cuando haces el insert en la tabla de de alumnos también haces un insert en la de asignaturas con la asignatura seleccionada, que obviamente ya existe.
En lugar de eso lo que tendrías que hacer, si entiendo bien la idea, es meterle el id de la asignatura al alumno y hacer el insert solo para los alumnos.
También permites seleccionar una asignatura con un área diferente a la que originalmente se le ha dado. No entiendo lo que intentas hacer aquí, pero si quieres que las asignaturas y las áreas sean independientes unas de otras deberías hacer una nueva tabla para las áreas con una relación de 'many to many' con las asignaturas.
La sesión no te hace falta para comprobar si la asignatura existe o no, para eso tienes que hacer una consulta a la base de datos. Si lo que quieres hacer es recuperar la asignatura introducida previamente para, por ejemplo, seleccionarla automáticamente en el select, lo que puedes hacer es meter los inserts al principio, antes del formulario, así ya dispones de ese dato sin necesidad de sesiones ni queries.
He subido el código para que le eches un ojo y veas que partes te pueden ser útiles, he obviado algunos datos, como el apellido o dni del alumno, ya que no son necesarios para mostrar lo que te estoy comentando.
http://pastebin.com/m4bfPSzY
A ver si te es útil y sacas algo en claro.
excel
Je, je. Pues tienes razón Feliper, con el cacho tocho de código que he puesto cualquiera se entera...
Pues bien, la opción Javascript no puede ser, pues sólo puedo utilizar php.
Las normas del ejercicio son tener un único formulario con dos botones submit. Para que funcionen independientemente he puesto names diferentes a los submits.
En el 1er. form se inserta a la bbdd: nombre, apellidos, dni, asignatura y área
En el 2o. form se inserta a la bbdd: una nueva asignatura con su correspondiente área
Peeeeeero.....
Si la asignatura del 2º form ya existe entre las asignaturas ya existentes en la bbdd, no se tiene que insertar de nuevo, y si no existe, pues si que se inserta.
La opción para conseguirlo es utilizar la variable $_SESSION que parece que funciona en toda la parte del código ahora mismo.
Pero el problema lo tengo en 2 puntos:
- S_SESSION no me está guardando todo el array, sólo me guarda la asignatura que el usuario elige en ese momento en el 1er. form.
-$_SESSION me guarda la asignatura que he elegido en la sesión anterior, en el envío anterior, no en el actual envío.
Espero haberme explicado más ahora.
Os dejo el código del array que tiene que recoger $_SESSION. Ahora he puesto un for, pero tengo que probar que imprima todas las asignaturas.......
<select type="text" name="asignaturas_id">
<?php
if($asignaturas===false) die(mysql_error());
while($row=mysql_fetch_assoc($asignaturas)) {
$array[]=$row["asig"];
//echo ('<option>'.$row["asig"].'</option>');
echo ('<option>'.$array.'</option>');
for($i=0;$i<count($array);$i++)
{$array[$i]};
$_SESSION['array']=$array[$i];
}
?>
</select>
feliper
Que es lo que no te funciona ?
o que es lo que no sabes resolver ?
SI pones el "tocho" de código entero es muy difícil ayudarte ...
Creo que un Form no puede tener dos submit declarados como lo haces, no estoy seguro del todo, pero el atributo name de un botón submit no es enviado en el formulario ... para hacer lo que quieres o haces dos formularios como te dicen arriba, que creo que es la mejor solución ... o los botones no son submit sino que les pones una ID distinta a cada una y manejas su funcionamiento con javascript
saludos !!
excel
No es esto a lo que me refiero. Ya que lo tengo que hacer con 2 inputs submit pero bueno tomo nota de tus ideas....Gracias
juaroal
A ver si me aclaro: Lo que quieres hacer es que si la asignatura no esta entre las opciones de la base de datos se pueda insertar una asignatura nueva, ¿no?
Lo que yo suelo hacer en estos casos es poner los formularios por separado, uno para insertar los datos del formulario y otro para dar de alta un campo nuevo, en este caso una asignatura, cada una con su script php correspondiente, por ejemplo, "insertar-usuario.php" y "asignatura-nueva.php".
Otra opción, aunque ya te tienes que meter en cositas de javaScript, es añadir a la lista de asignaturas la opción "otra" y si se selecciona esta opción mostrar un campo oculto para que se ponga el nombre y luego en el script php comprobar que si la opción es "otra" hay que guardar el dato del campo en el que está el nombre y si no guardar el value del option.
No sé si es esto a lo que te refieres...
¡Un saludo!
excel
Sí es cierto, no sale dentro de la caja gris
excel
Pruebo de nuevo con Quote
maxer3d
Lo pegaste con "quote" en lugar de "code", pero igualmente probando parece que el botón de code solamente te deja poner fragmentos de código y no todo el documento completo.