Ver Mensaje Individual
  #4 (permalink)  
Antiguo 07/11/2013, 11:13
Avatar de mortiprogramador
mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Insertar multiples registros con checkbox

<saludos>
Bueno, pues revisando el tema tengo lo siguiente:

En efecto, cuando por ej se tienen 4 marcas y se chequean todas,
al guardar solo realiza 2 inserciones, y en ambas guarda la misma marca compatible (es decir, el primer check)

Esto sucede por lo siguiente:
- Cuando se hace el ELSE se inserta un primer registro de este modo
INSERT INTO productos (nombre_producto,id_subgeneral,id_fabricante,compa tible) VALUES('producto1','64','77','3082, 3083, 3084, 3085')

Imagino yo que el último campo (compatible) que esta definido como int, al recibir semejante valor ('3082, 3083, 3084, 3085' que son los ids de los compatibles)
trunca el valor y solo deja el primero antes de la coma, en este caso el 3082

Y con esto ya tenemos un registro insertado en la tabla
Ahora bien, luego del ELSE se tiene un IF donde pregunta por un mysql_query y de nuevo usa el mismo query anterior, por esto es que siempre
registra 2 veces la misma data (que a todas estas es algo que no debería permitirse incluso por base de datos, es decir, que debería ser un registro único
la combinación de producto con marca compatible, pero que actualmente si lo permite)

La solución? Bueno, pues opino que una solución podría ser fusionar el código, es decir, que en el foreach se haga lo que tienes en el else y el siguiente if,
lo resumo así:


Código PHP:
Ver original
  1. <?php
  2.  
  3. $elec_array = $_POST['compatible'];
  4. if ($elec_array=='')
  5. {
  6.     $query = "INSERT INTO productos (nombre_producto,id_subgeneral,id_fabricante,compatible) VALUES('" . $_POST["nombre_producto"] . "','" . $_POST["id_subgeneral"] . "','" . $_POST["id_fabricante"] . "','')";
  7.     $result = mysql_query($query);
  8. }
  9. else
  10. {
  11.     foreach ($elec_array as $one_elec)
  12.     {
  13.         $source .= $one_elec.", ";
  14.         $query = "INSERT INTO productos (nombre_producto,id_subgeneral,id_fabricante,compatible) VALUES('" . $_POST["nombre_producto"] . "','" . $_POST["id_subgeneral"] . "','" . $_POST["id_fabricante"] . "','" . $one_elec . "')";
  15.         if (mysql_query($query)){
  16.             echo "<h4 class='alert_success'>¡Producto insertado correctamente!</h4>";
  17.             //print "<meta http-equiv=Refresh content=\"2 ; url=./\">";
  18.         }else{
  19.             echo"<h4 class='alert_error'>Hubo un error al insertar los datos</h4>";
  20.             echo mysql_error();
  21.         }
  22.     }
  23.    
  24.     $elec = substr($source, 0, -2);
  25.     echo $elec;
  26. }
  27.  
  28.     //$ssql ="INSERT INTO productos (nombre_producto,id_subgeneral,id_fabricante,compatible)  values ('" . $_POST["nombre_producto"] . "','" . $_POST["id_subgeneral"] . "','" . $_POST["id_fabricante"] . "','" . $compatible . "')";
  29.     }
  30.         }else{
  31.     ?>
  32.    
  33.     <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">


Ahora bien, finalmente me permito darte algunas sugerencias para tu modelo de bd y aplicación

1. La referencia entre las tablas marcas y modelo no cuenta con una llave foránea,
es decir, que si bien el query que hace el join funciona, a nivel de base de datos
no se tiene una normatividad consistente que en efecto se inserte un modelo
de una marca que si exista, y por esto puede que tengan distintos ids y en algún
momento algunos datos no se visualicen correctamente
Mi sugerencia es aplicarle un foreign key a la tabla modelo que apunte al campo id_marca de la tabla marcas

2. Creo que se podría mejorar el modelo aplicandole reglas de normalización a la tabla productos,
pues como actualmente funciona por cada modelo compatible inserta en la tabla, duplicando datos.
Sugiero que se haga lo siguiente:

2.1. Que la tabla de productos solo guarde el producto como tal una única vez
2.2. Crear una tabla productos_modelo donde se guarden id de producto y id de marca compatible
(Este último significaría un cambio en el foreach que acabamos de modificar, pero pues a nivel de data
sería lo mejor)

Sin embargo, son sugerencias que ya puedes decidir si las necesitas o no, por ahora prueba lo que
te publiqué y nos cuentas como te fue
</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com