Ver Mensaje Individual
  #5 (permalink)  
Antiguo 03/04/2015, 22:27
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Sistema de fichas de pacientes y lógica al guardar.

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
  1. <form method="post">
  2. <input type="number" name="cliente">
  3.     <select name="alergias[]">
  4.         <!-- Lista de alergias, donde el value es alergias.codigo -->
  5.     </select>
  6.     <!--
  7.        Tantas listas como quieras, incluso puedes con javascript
  8.        agregarlas o quitarlas dinamicamente.
  9.        es importante que tengan el mismo name
  10.    -->        
  11.     <select name="alergias[]">
  12.         <!-- Lista de alergias, donde el value es alergias.codigo -->
  13.     </select>
  14. </form>

Cuando el formulario se envia, esta es la logica de php:
Código PHP:
Ver original
  1. <?php
  2.     // Validaciones de seguridad minimas.
  3.     $_POST["cliente"] = intval($_POST["cliente"]);
  4.    
  5.     if(empty($_POST["alergias"]) || !is_array($_POST["alergias"]))
  6.         $_POST["alergias"] = [];
  7.     else
  8.         $_POST["alergias"] = array_filter(array_map("intval", $_POST["alergias"]));
  9.    
  10.     $con = mysqli_connect("localhost","my_user","my_password","my_db");
  11.         die("Error de conexion.");
  12.    
  13.     // Borrar los que estaban y ya no estan mas.
  14.     mysqli_query($con, "DELETE FROM clientes_alergias WHERE codigo_cliente = $_POST[cliente]".($_POST["alergias"] ? " AND codigo_alergia NOT IN (".implode(",", $_POST["alergias"]).")" : "");
  15.    
  16.     if($_POST["alergias"])
  17.     {
  18.         // Insertar o actualizar los nuevos.
  19.         $query = "INSERT IGNORE INTO clientes_alergias (codigo_cliente, codigo_alergia) VALUES ";
  20.         // Recorrer sin variables auxiliares.
  21.         foreach($_POST["alergias"] as $_POST["alergias"])
  22.             $query .= ($nro ? ", " : "")."($_POST[cliente], $_POST[alergias])";
  23.            
  24.         mysqli_query($con, $query);        
  25.     }
  26.    
  27.     mysqli_close($con);        
  28. ?>

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
  1. <form method="post">
  2. <input type="number" name="cliente">
  3.     <select name="alergias[]">
  4.         <!-- Lista de alergias, donde el value es alergias.codigo -->
  5.     </select>
  6.     <input type="text" name="detalles[]">
  7.     <!--
  8.        Tantas listas y detalles como quieras, incluso puedes con javascript
  9.        agregarlas o quitarlas dinamicamente.
  10.        es importante que tengan el mismo name
  11.    -->        
  12.     <select name="alergias[]">
  13.         <!-- Lista de alergias, donde el value es alergias.codigo -->
  14.     </select>
  15.     <input type="text" name="detalles[]">
  16. </form>

y un php:
Código PHP:
Ver original
  1. <?php
  2.     // Conexion con la base de datos.
  3.     $con = mysqli_connect("localhost","my_user","my_password","my_db");
  4.         die("Error de conexion.");
  5.    
  6.     // Validaciones de seguridad minimas.
  7.     $_POST["cliente"] = intval($_POST["cliente"]);
  8.    
  9.     if(empty($_POST["alergias"]) || !is_array($_POST["alergias"]))
  10.         $_POST["alergias"] = [];
  11.     else
  12.     {        
  13.         foreach($_POST["alergias"] as $nro => &$codigo)            
  14.             if(!($codigo = intval($codigo)))
  15.                 unset($_POST["alergias"][$nro], $_POST["detalles"][$nro]);
  16.             else
  17.                 $_POST["detalles"][$nro] = real_escape_string($con, $_POST["detalles"][$nro]);  
  18.        
  19.         $_POST["alergias"] = array_values($_POST["alergias"]);
  20.         $_POST["detalles"] = array_values($_POST["detalles"]);
  21.     }
  22.     unset($codigo, $nro);
  23.    
  24.     if(count($_POST["alergias"]) != count($_POST["detalles"]))
  25.         die("Error en los datos."):
  26.    
  27.     // Borrar los que estaban y ya no estan mas.
  28.     mysqli_query($con, "DELETE FROM clientes_alergias WHERE codigo_cliente = $_POST[cliente]".($_POST["alergias"] ? " AND codigo_alergia NOT IN (".implode(",", $_POST["alergias"]).")" : "");
  29.    
  30.     if($_POST["alergias"])
  31.     {
  32.         // Insertar o actualizar los nuevos.
  33.         $query = "INSERT OR UPDATE INTO clientes_alergias (codigo_cliente, codigo_alergia, detalle) VALUES ";
  34.         // Recorrer sin variables auxiliares.
  35.         foreach($_POST["alergias"] as $nro => $_POST["alergias"])
  36.             $query .= ($nro ? ", " : "")."($_POST[cliente], $_POST[alergias], {$_POST['detalles'][$nro]})";  
  37.         $query .= "ON DUPLICATE KEY UPDATE detalle = VALUES(detalle)";
  38.        
  39.         mysqli_query($con, $query);        
  40.     }
  41.    
  42.     mysqli_close($con);        
  43. ?>
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 03/04/2015 a las 22:32