Te explicare como resolver un caso base simple, luego tu lo repetirás y adaptaras a tu problema.
Supongamos que tienes las siguientes tablas en la base de datos:
- clientes
codigo (pk) | nombre
- alergias
codigo (pk) | descripcion
- clientes_alergias
codigo_cliente (pk, fk(clientes.codigo)) | codigo_alergia (pk, fk(alergias.codigo))
Suponiendo que tienes el siguiente formulario para la carga de alergias a clientes:
Código HTML:
Ver original<input type="number" name="cliente"> <!-- Lista de alergias, donde el value es alergias.codigo -->
<!--
Tantas listas como quieras, incluso puedes con javascript
agregarlas o quitarlas dinamicamente.
es importante que tengan el mismo name
-->
<!-- Lista de alergias, donde el value es alergias.codigo -->
Cuando el formulario se envia, esta es la logica de php:
Código PHP:
Ver original<?php
// Validaciones de seguridad minimas.
$_POST["cliente"] = intval($_POST["cliente"]);
$_POST["alergias"] = [];
else
die("Error de conexion.");
// Borrar los que estaban y ya no estan mas.
mysqli_query($con, "DELETE FROM clientes_alergias WHERE codigo_cliente = $_POST[cliente]".($_POST["alergias"] ?
" AND codigo_alergia NOT IN (".implode(",", $_POST["alergias"]).")" : "");
if($_POST["alergias"])
{
// Insertar o actualizar los nuevos.
$query = "INSERT IGNORE INTO clientes_alergias (codigo_cliente, codigo_alergia) VALUES ";
// Recorrer sin variables auxiliares.
foreach($_POST["alergias"] as $_POST["alergias"])
$query .= ($nro ? ", " : "")."($_POST[cliente], $_POST[alergias])";
}
?>
En el caso de que cada registro de la tabla de relación tenga un atributo ej:
- clientes_alergias
codigo_cliente (pk, fk(clientes.codigo)) | codigo_alergia (pk, fk(alergias.codigo)) | detalle
tendrias un formulario del estilo:
Código HTML:
Ver original<input type="number" name="cliente"> <!-- Lista de alergias, donde el value es alergias.codigo -->
<input type="text" name="detalles[]"> <!--
Tantas listas y detalles como quieras, incluso puedes con javascript
agregarlas o quitarlas dinamicamente.
es importante que tengan el mismo name
-->
<!-- Lista de alergias, donde el value es alergias.codigo -->
<input type="text" name="detalles[]">
y un php:
Código PHP:
Ver original<?php
// Conexion con la base de datos.
die("Error de conexion.");
// Validaciones de seguridad minimas.
$_POST["cliente"] = intval($_POST["cliente"]);
$_POST["alergias"] = [];
else
{
foreach($_POST["alergias"] as $nro => &$codigo)
if(!($codigo = intval($codigo))) unset($_POST["alergias"][$nro], $_POST["detalles"][$nro]); else
$_POST["detalles"][$nro] = real_escape_string($con, $_POST["detalles"][$nro]);
}
if(count($_POST["alergias"]) != count($_POST["detalles"])) die("Error en los datos."):
// Borrar los que estaban y ya no estan mas.
mysqli_query($con, "DELETE FROM clientes_alergias WHERE codigo_cliente = $_POST[cliente]".($_POST["alergias"] ?
" AND codigo_alergia NOT IN (".implode(",", $_POST["alergias"]).")" : "");
if($_POST["alergias"])
{
// Insertar o actualizar los nuevos.
$query = "INSERT OR UPDATE INTO clientes_alergias (codigo_cliente, codigo_alergia, detalle) VALUES ";
// Recorrer sin variables auxiliares.
foreach($_POST["alergias"] as $nro => $_POST["alergias"])
$query .= ($nro ? ", " : "")."($_POST[cliente], $_POST[alergias], {$_POST['detalles'][$nro]})";
$query .= "ON DUPLICATE KEY UPDATE detalle = VALUES(detalle)";
}
?>