Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Insertar multiples registros con checkbox

Estas en el tema de Insertar multiples registros con checkbox en el foro de PHP en Foros del Web. Hola, estoy desarollando una aplicación para una tienda online. En la zona de admin, tengo una sección para subir productos... Esos productos están relacionados con ...
  #1 (permalink)  
Antiguo 28/09/2013, 07:02
dankko
Invitado
 
Mensajes: n/a
Puntos:
Insertar multiples registros con checkbox

Hola, estoy desarollando una aplicación para una tienda online.

En la zona de admin, tengo una sección para subir productos...
Esos productos están relacionados con multiples tablas.

Tengo unos checkbox, que contienen varias opciones, las cuales pueden ir varias tildadas o sólo una, pero siempre tiene que llevar al menos una.

Mi problema es que no se como realizar ese insert. Lo estoy intentando de esta manera con un foreach, pero lo que hace es hacer como máximo 2 insert, y en la columna "compatible", en vez de añadir un valor distinto cada vez que añade un producto compatible, lo que hace es darle el mismo valor, es decir, si marco la casilla modelo 1, modelo 2 y modelo 3, Lo unico que me ingresa es:

Máximo de 2 insert
En la casilla compatible, a esos dos insert lo que hace es ponerle el mismo compatible (debería ser 1 y 2), es decir, sale 1 en los dos.


Código PHP:
Ver original
  1. <?php
  2. //conexión con la base de datos
  3. $conexion = conecta_base_datos();
  4. if($_POST) { //echo "he recibido los datos y procederé a insertarlos";
  5.     //primero se deben hacer algunas validaciones
  6. if ($_POST["nombre_producto"]==""){
  7.     echo "No he recibido el nombre del producto...";
  8. }elseif($_POST["id_subgeneral"]==""){
  9.     echo "No he recibido la categoría del equipo...";
  10. }else{
  11.     echo "He recibido datos correctos y procedo a insertarlos...";
  12.  
  13. $elec_array = $_POST['compatible'];
  14. if ($elec_array=='')
  15. {
  16.     $query = "INSERT INTO productos (nombre_producto,id_subgeneral,id_fabricante,compatible) VALUES('" . $_POST["nombre_producto"] . "','" . $_POST["id_subgeneral"] . "','" . $_POST["id_fabricante"] . "','')";
  17.     $result = mysql_query($query);
  18. }
  19. else
  20. {
  21.     foreach ($elec_array as $one_elec)
  22.     {
  23.     $source .= $one_elec.", ";
  24.     }
  25.     $elec = substr($source, 0, -2);
  26.     echo $elec;
  27.     $query = "INSERT INTO productos (nombre_producto,id_subgeneral,id_fabricante,compatible) VALUES('" . $_POST["nombre_producto"] . "','" . $_POST["id_subgeneral"] . "','" . $_POST["id_fabricante"] . "','" . $elec . "')";
  28.     $result = mysql_query($query);
  29. }
  30.  
  31.     //$ssql ="INSERT INTO productos (nombre_producto,id_subgeneral,id_fabricante,compatible)  values ('" . $_POST["nombre_producto"] . "','" . $_POST["id_subgeneral"] . "','" . $_POST["id_fabricante"] . "','" . $compatible . "')";
  32.         if (mysql_query($query)){
  33.             echo "<h4 class='alert_success'>¡Producto insertado correctamente!</h4>";
  34.             //print "<meta http-equiv=Refresh content=\"2 ; url=./\">";
  35.         }else{
  36.             echo"<h4 class='alert_error'>Hubo un error al insertar los datos</h4>";
  37.             echo mysql_error();
  38.         }
  39.     }
  40.         }else{
  41.     ?>
  42.    
  43.     <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
  44.         <fieldset>
  45.             <label>Nombre producto: </label>
  46.             <input type="text" name="nombre_producto">
  47.         </fieldset>
  48.         <fieldset>
  49.             <label>Categoría:</label>
  50.                 <select name="id_subgeneral">
  51.                     <?php
  52.                     $ssql = "select * from cat3_subgeneral";
  53.                     $rs = mysql_query ($ssql);
  54.                     while ($fila = mysql_fetch_array($rs)){
  55.    
  56.                         echo "<option value=" . $fila["id_subgeneral"] . ">" .$fila["nombre_subgeneral"] . "</option>";
  57.                     }
  58.                     mysql_free_result ($rs);
  59.                     ?>
  60.                 </select>
  61.         </fieldset>
  62.         <fieldset>
  63.             <label>Fabricante:</label>
  64.                 <select name="id_fabricante">
  65.                     <?php
  66.                     $ssql = "select * from fabricante";
  67.                     $rs = mysql_query ($ssql);
  68.                     while ($fila = mysql_fetch_array($rs)){
  69.    
  70.                         echo "<option value=" . $fila["id_fabricante"] . ">" .$fila["nombre_fabricante"] . "</option>";
  71.                     }
  72.                     mysql_free_result ($rs);
  73.                     ?>
  74.                 </select>
  75.         </fieldset>
  76.      
  77.         <fieldset>
  78.             <label>Coches compatibles:</label>
  79.                 <?php
  80.                 $conexion = conecta_base_datos();
  81.                 $ssql = "SELECT *
  82.                 FROM modelo
  83.                 INNER JOIN marcas ON marcas.id_marca = modelo.id_marca";
  84.                 $rs = mysql_query($ssql);
  85.                 while ($fila = mysql_fetch_array($rs)){
  86.        
  87.                     echo '<br><input type="checkbox" name="compatible[]" value="' . $fila["id_modelo"] . '">' . utf8_encode($fila["nombre_modelo"]) . ' - ' . utf8_encode($fila["nombre_marca"]) . '<br>';
  88.        
  89.                 }
  90.                 ?>
  91.         </fieldset>
  92.         <fieldset>
  93.             <input type="submit" value="Enviar">
  94.         </fieldset>
  95.     </form>
  96.  
  97.  <?php
  98. }
  99.  //Cerrar conexión con la base de datos, porque si no, al entrar demasiada gente, MYSQL se cae
  100.  mysql_close($conexion);
  101.  ?>

Este es el código.

También arroja otro error:

Notice: Undefined variable: source in C:\wamp\www\proyectos\...\admin\enviar-producto.php on line 26

Donde la variable indefinida es la variable que defino para usar el foreach:

$one_elec

La estructura de las tablas que aparecen:

modelo{id_modelo, nombre_modelo,id_marca}
marcas{id_marca,nombre_marca}
cat3_subcategoria{id_subcategoria,nombre_categoria }
productos{id_producto,nombre_producto,id_subcatego ria,compatible}

Donde la columna compatible, sería el valor de id_modelo.

Alguien sabe como podría solucionar esto?
  #2 (permalink)  
Antiguo 28/09/2013, 14:05
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 12 años, 9 meses
Puntos: 214
Respuesta: Insertar multiples registros con checkbox

<saludos>
Pues creo que te estás enredando al momento de insertar el tema del campo compatible, pues en principio los modelos están definidos en el formulario como un campo con nombre de array, y por ende php al recibirlo lo trata como tal, es decir,
que internamente dentro del insert actual que se tiene, se puede hacer otro foreach para recorrer los elementos de compatible (como un array cualquiera, solo que en la definición del foreach se usaría el elemento compatible de $_POST), y por cada elemento de estos si hacer el insert que ya se tiene (igual como entiendo el formulario va por producto, no es un masivo de productos a un mismo tiempo)

Igual si con este lazo que te enviè sigues enredado, te invito a que subas los scripts de tablas para recrear por completo ambiente de bd y aplicación para hacer los cambios pertinentes
</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
  #3 (permalink)  
Antiguo 29/09/2013, 03:33
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Insertar multiples registros con checkbox

Si, sigo enredado la verdad.

Dejo las tablas

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `cat3_subgeneral` (
  2.   `id_subgeneral` int(7) NOT NULL AUTO_INCREMENT,
  3.   `nombre_subgeneral` varchar(100) NOT NULL,
  4.   `id_pregeneral` int(7) NOT NULL,
  5.   `id_general` int(7) NOT NULL,
  6.   PRIMARY KEY (`id_subgeneral`)

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `fabricante` (
  2.   `id_fabricante` int(7) NOT NULL AUTO_INCREMENT,
  3.   `nombre_fabricante` varchar(250) NOT NULL,
  4.   PRIMARY KEY (`id_fabricante`)


Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `marcas` (
  2.   `id_marca` int(7) NOT NULL AUTO_INCREMENT,
  3.   `nombre_marca` varchar(250) NOT NULL,
  4.   `ruta` varchar(250) NOT NULL,
  5.   PRIMARY KEY (`id_marca`)
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `modelo` (
  2.   `id_modelo` int(7) NOT NULL AUTO_INCREMENT,
  3.   `nombre_modelo` varchar(250) NOT NULL,
  4.   `id_marca` int(11) NOT NULL,
  5.   `ruta` varchar(250) NOT NULL,
  6.   PRIMARY KEY (`id_modelo`)

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `productos` (
  2.   `id_producto` int(7) NOT NULL AUTO_INCREMENT,
  3.   `nombre_producto` varchar(250) NOT NULL,
  4.   `referencia` varchar(250) NOT NULL,
  5.   `id_fabricante` int(7) NOT NULL,
  6.   `id_subgeneral` int(7) NOT NULL,
  7.   `compatible` int(20) DEFAULT NULL,
  8.   PRIMARY KEY (`id_producto`)

La relación con la tabla productos la hago con la tabla subcategoria, y modelo.
Donde compatible en la tabla productos, es el ID del modelo, con los que el producto es compatible.

Saludos.
  #4 (permalink)  
Antiguo 07/11/2013, 11:13
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 12 años, 9 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

Etiquetas: multiples, mysql, registros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:38.