¿Cómo insertar registro a varias tablas (relacionadas) con un solo formulario?
3 seguidores
Hola,
Tengo una base de datos con 4 tablas relacionadas las cuales quisiera ingresar los registro desde un mismo formulario (a las 4 tablas) creado en dreamweaver cs5(no soy muy esperto en php y mysql )... Mi problema radica hay, como se haria con dreamweaver (o con codigo) un formulario que agregara los registros a las 4 tablas que tiene mi base de datos?
Lo busque por todos lados y los pocos que aparecieron no lo detallaban debidamente(no lo entendi)...
Desde ya gracias por responder...
Usuario desconocido
Saludos blackmel, por lo que te he entendido, quieres insertar los campos que pasas del formulario a cuatro tablas diferentes, supongo que relacionadas con un id ó clave primaria, que relaciona las cuatro tablas.
En código PHP un ejemplo podría ser algo así:
/*En el archivo que recoje las variables del formulario, suponiendo que en el formulario hayas puesto un valor de method="post" */
$variable_uno = $_POST['variable_uno'];
$variable_dos = $_POST['variable_dos'];
$variable_x = $_POST['variable_x'];
/* Después, mediante un include, o si lo incluimos directamente, ponemos los datos de conexión a la base de datos*/
$host = "localhost";
$database = "nombre_de_base_de_datos";
$username = "Nombre_de_usuario";
$password = "mi_password";
/* seleccionamos la base de datos*/
mysql_select_db($database);
/* insertamos el registro para cada tabla */
mysql_query("INSERT INTO tabla_1 VALUES ('$variable_uno', '$variable_dos', '$variable_x')");
mysql_query("INSERT INTO tabla_2 VALUES ('$variable_uno', '$variable_dos', '$variable_x')");
mysql_query("INSERT INTO tabla_3 VALUES ('$variable_uno', '$variable_dos', '$variable_x')");
mysql_query("INSERT INTO tabla_4 VALUES ('$variable_uno', '$variable_dos', '$variable_x')");
No se si esta era tu duda o no, espero haberte ayudado.
fakito
Al código de @ocelnet le faltaría un mysql_connect para establecer la conexión con la base de datos además de tener un sql injection en los INSERT.
De todas formas las funciones mysql_* están marcadas como obsoletas y deberías usar PDO que además ayudan a evitar ciertos problemas de seguridad.
Lo primero sería usar InnoDB en la base de datos para soportar transacciones, así si uno de los insert falla puedes hacer un rollback y evitar introducir el resto de datos en las otras tablas. Si tienes que usar MyISAM la única diferencia es que no podrás hacer el rollback.
A parte de eso la mecánica es la misma que apunta @ocelnet, aunque es posible que quieras mantener los datos relacionados entre sí con una clave foránea, para eso puedes recoger el id del primer insert y pasarlo como parámetro al resto de las sentencias.
Te pego un ejemplo rápido, no pongo el formulario porque me imagino que sabes como va, es un formulario normal y corriente enviado por POST.
<?php
// variables del formulario
$a = $_POST['a'];
$b = $_POST['b'];
$c = $_POST['c'];
$d = $_POST['d'];
// conectar la base da datos
$db = 'sample';
$host = 'localhost';
$user = 'root';
$pass = 'root';
$conn = new PDO("mysql:dbname=".$db.";host=".$host,$user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// iniciar transacción
$conn->beginTransaction();
try {
// tabla 1
$sql = 'INSERT INTO a (value) VALUES (:value);';
$result = $conn->prepare($sql);
$result->bindValue(':value', $a, PDO::PARAM_STR);
$result->execute();
$lastId = $conn->lastInsertId();
// tabla 2
$sql = 'INSERT INTO b (a_id, value) VALUES (:a_id, :value)';
$result = $conn->prepare($sql);
$result->bindValue(':a_id', $lastId, PDO::PARAM_INT);
$result->bindValue(':value', $b, PDO::PARAM_STR);
$result->execute();
// tabla 3
$sql = 'INSERT INTO c (a_id, value) VALUES (:a_id, :value)';
$result = $conn->prepare($sql);
$result->bindValue(':a_id', $lastId, PDO::PARAM_INT);
$result->bindValue(':value', $c, PDO::PARAM_STR);
$result->execute();
// tabla 4
$sql = 'INSERT INTO d (a_id, value) VALUES (:a_id, :value)';
$result = $conn->prepare($sql);
$result->bindValue(':a_id', $lastId, PDO::PARAM_INT);
$result->bindValue(':value', $d, PDO::PARAM_STR);
$result->execute();
$conn->commit();
echo 'Datos insertados';
} catch (PDOException $e) {
// si ocurre un error hacemos rollback para anular todos los insert
$conn->rollback();
echo $e->getMessage();;
}
Usuario desconocido
Gracias por el apunte @fakito ;). Espero que blackmel tenga una idea clara de cómo poder hacerlo ahora.