Foros del Web » Programando para Internet » PHP »

insertar multiples registros con php mysql

Estas en el tema de insertar multiples registros con php mysql en el foro de PHP en Foros del Web. hola, el problema que tengo es el siguiente: extraigo 48 datos del registro de una bd en mysql con php y los organizo en una ...
  #1 (permalink)  
Antiguo 19/04/2014, 09:19
Avatar de futusystem  
Fecha de Ingreso: febrero-2013
Ubicación: barcelona
Mensajes: 57
Antigüedad: 11 años, 2 meses
Puntos: 0
Información insertar multiples registros con php mysql

hola, el problema que tengo es el siguiente:
extraigo 48 datos del registro de una bd en mysql con php y los organizo en una tabla con un where, cada linea la quiero insertar en otra tabla. me explico mejor quiero que cuando le de al botón de enviar formulario me inserte los 48 registros en la bd.

nota: hice la prueba recibiendo el valor por post pero solo me ingresa el ultimo valor la otras 47 lineas no las toma en cuenta.

gracias de antemano al que me pueda ayudar con este problema, es un poco urgente.
  #2 (permalink)  
Antiguo 19/04/2014, 12:33
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: insertar multiples registros con php mysql

Aquí ayudamos a solucionar problemas a la brevedad posible, las urgencias y milagros nos llevan un poco más de tiempo, sobre todo cuando no proporcionas código donde podamos ver lo que está pasando.

Jugando un poco al adivino milagroso, supongo que en las 48 líneas estás usando el mismo nombre para los inputs, de forma que el navegador envía solo el último declarado.

Es decir, tienes algo como:
Código HTML:
Ver original
  1. <input type="text" name="nombre" value="" />
  2. <input type="text" name="nombre" value="" />
  3. <input type="text" name="nombre" value="" />

No importa cuantos declares, solo el último será enviado por el navegador, ya que sobreescribe los anteriores; lo correcto sería:

Código HTML:
Ver original
  1. <input type="text" name="nombre[]" value="" />
  2. <input type="text" name="nombre[]" value="" />
  3. <input type="text" name="nombre[]" value="" />
  4. <input type="text" name="nombre[]" value="" />

Que luego en PHP recibes como array:

Código PHP:
Ver original
  1. foreach($_POST['nombre'] as $indice => $nombre) {
  2.       echo "$indice -> $nombre<br />";
  3.       // Suponiendo que tienes otros campos, con la misma cantidad de inputs
  4.       echo $_POST['otro_campo'][$indice];
  5. }
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 20/04/2014, 21:24
 
Fecha de Ingreso: abril-2014
Mensajes: 51
Antigüedad: 10 años
Puntos: 1
Respuesta: insertar multiples registros con php mysql

Buenas noches
yo aplique esta misma forma para agregar múltiples datos dinámicos
y me parece correcta tu manera ahora, llegue al momento en que necesito editar esos múltiples datos, y no logro hacer que funciones este es mi código..

foreach($_POST['t'] as $value)
$item[]= $value;

foreach($_POST['c'] as $value)
$cantidad[]= $value;

foreach($_POST['h'] as $value)
$des[]= $value;

$idpro = $_POST['i'];

for($i=0; $i<count($_POST['t']); $i++)
{
mysql_select_db($db, $con);
mysql_query("UPDATE productos SET descripcion='$des[$i]', cantidad='$cantidad[$i]', item='$item[$i]' WHERE id = '$idpro'",$con)or die(mysql_error());
}

actualiza pero si sin mas de uno actualiza todos con los mismo datos del ultimo campo
  #4 (permalink)  
Antiguo 20/04/2014, 23:48
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: insertar multiples registros con php mysql

EdyArgueta, bienvenido a FDW.

Tienes un par de problemas, el que me parece más grave, es que tengas todos tus campos como array, excepto $_POST['i'], que asignas a $idpro, con lo que no importa cuantas veces ejecutes la consulta, siempre se actualizará solo una fila... suponiendo que el valor sea correcto.

El otro problema, es que no necesitas recorrer todos los campos para crear variables temporales, bien puedes hacer esto:

Código PHP:
Ver original
  1. foreach($_POST['t'] as $indice => $valor) {
  2.     $item = mysql_real_escape_string($valor);
  3.     $cantidad = $_POST['c'][$indice] * 1;
  4.     $des = mysql_real_escape_string($_POST['h'][$indice]);
  5.     $idpro = mysql_real_escape_string($_POST['i'][$indice]);
  6.  
  7.     $sql = "UPDATE productos SET descripcion = '$des', cantidad = '$cantidad', item = '$item' WHERE id = '$idpro'";
  8.     mysql_query($sql) or die(mysql_error());
  9. }

Otro problema importante es en cuanto a la librería mysql, que es obsoleta y seguridad; lee esto: http://www.forosdelweb.com/f18/aport...8/#post4265377
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 21/04/2014, 13:41
 
Fecha de Ingreso: abril-2014
Mensajes: 51
Antigüedad: 10 años
Puntos: 1
Respuesta: insertar multiples registros con php mysql

Muchas gracias Triby ahora el detalle que tengo es que actualiza perfectamente pero necesito enviar todos esos datos agregados por correo electrónico y me vuelve a suceder el primer error de solo enviar el ultimo dato este es el codigo

Código PHP:
Ver original
  1. foreach($_POST['t'] as $indice => $valor) {
  2.     $item = mysql_real_escape_string($valor);
  3.     $cantidad = $_POST['c'][$indice] * 1;
  4.     $des = mysql_real_escape_string($_POST['h'][$indice]);
  5.     $idpro = mysql_real_escape_string($_POST['i'][$indice]);
  6.     mysql_select_db($db, $con);
  7.     $sql = "UPDATE productos SET descripcion = '$des', cantidad = '$cantidad', item = '$item' WHERE id = '$idpro'";
  8.     mysql_query($sql) or die(mysql_error());
  9. }
  10.  
  11. $to = $_POST['usermail'];
  12. $headers = "Content-Type: text/html; charset=utf8";
  13. $headers .= "Sistema de Requerimientos";           
  14. $tema="Reporte de Solicitud";
  15. $mensaje="
  16. <table border='0' cellspacing='2' cellpadding='2'>
  17.  <tr>
  18.    <td align='center' bgcolor='#FFFFCC'><strong>Items:</strong></td>
  19.    <td align='left'>".$item + $cantidad + $des."</td>
  20.  </tr>
  21. </table>
  22. ";
  23.  
  24. @mail($to,$tema,$mensaje,$headers);

En que estoy fallando si ya arregle el detalle de los array y actualiza perfecto ?

Última edición por Triby; 22/04/2014 a las 01:56 Razón: Código en Highlight
  #6 (permalink)  
Antiguo 21/04/2014, 17:03
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: insertar multiples registros con php mysql

Estás armando el contenido del correo fuera del foreach, por eso solo incluye el último elemento.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 11/06/2014, 11:46
 
Fecha de Ingreso: abril-2014
Mensajes: 51
Antigüedad: 10 años
Puntos: 1
Respuesta: insertar multiples registros con php mysql

Hola de nuevo habia logrado evadir ese problema pero me e encontrado con la necesidad de terminarlo por capricho! intente lo de dejar dentro del foreach pero igual nunca funciono

$item= array();
$cantidad= array();
$des= array();

$con = mysql_connect($host, $user, $pw) or die ("No se pudo conectar a la base de datos");
mysql_select_db($db, $con) or die ("No se encontro la base de datos");
mysql_set_charset('utf8');
mysql_query("INSERT INTO solicitud (hora,usuario,fecha,tipo,prioridad,rama,equip,prov eedor,correo) VALUES ('$_POST[hora1]','$_POST[usuario]','$_POST[fecha]','$_POST[tipo]','$_POST[prioridad]','$_POST[rama]','$_POST[equip]','$_POST[proveedor]','$_POST[usermail]')",$con)or die ("primera base mala".mysql_error());

$id_soli=mysql_insert_id();

foreach($_POST['t'] as $key=>$value)
$item[]= $value;

foreach($_POST['c'] as $key=>$value)
$cantidad[]= $value;

foreach($_POST['h'] as $key=>$value)
$des[]= $value;

for($i=0; $i<count($item); $i++) {
mysql_select_db($db, $con);
mysql_query("INSERT INTO productos (id_solicitud,descripcion,item,cantidad)
VALUES ('$id_soli','$des[$i]','$item[$i]','$cantidad[$i]')",$con)or die(mysql_error());

$mensaje = $cantidad[$i];
}

mysql_set_charset('utf8');
$to = $_POST['usermail'];
$headers = "Content-Type: text/html; charset=utf8";
$headers .= "Sistema de Requerimientos";
$tema="Reporte de Solicitud";

@mail($to,$tema,$mensaje,$headers);

echo "<exito>Listo su solicitud se envio con exito<exito>";

intente solo con un dato que es "cantidad" y aun no entiendo el por que solo toma el ultimo dato
  #8 (permalink)  
Antiguo 11/06/2014, 16:22
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: insertar multiples registros con php mysql

Porque en cada iteración estás asignando a $mensaje el valor de $cantidad[$i], no lo estás agregando, para eso debes concatenar, ejemplo:

Código PHP:
Ver original
  1. // Primero debes inicializar la variable para evitar errores
  2. $mensaje = '';
  3.  
  4. for($i = 0; $i < count($item); $i++) {
  5.       // Haces la inserción a base de datos y, después:
  6.       $mensaje = $mensaje . $cantidad[$i] . '<br/>';
  7.       // Ves los puntos?, son los que hacen que se unan los valores en vez de sobreescribir
  8.       // De hecho, esa línea puede simplificarse un poco así:
  9.       $mensaje .= $cantidad[$i] . '<br/>';
  10.       // Solo usa una de las dos xD
  11. }
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 12/06/2014, 18:38
 
Fecha de Ingreso: abril-2014
Mensajes: 51
Antigüedad: 10 años
Puntos: 1
Respuesta: insertar multiples registros con php mysql

Si al final la respuesta fue pasar la variable sobre variable
$mensaje = $mensaje . $cantidad[$i] . '<br/>';

asi lo aplique y funciono al 100% muchas gracias
$item_mail = "$item_mail ITEM: $fila[item] CANTIDAD: $fila[cantidad] DESCRIPCION: $fila[descripcion]<br/>";

Etiquetas: form, inputs, mysql+php
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 21:30.