Insertar varios registros en la base de datos

Ahora tengo otro problema... Lo que pasa es que tengo que insertar en una tabla de mysql varios registro de un formulario que tiene los 7 campos de la tabla que te mencione pero se deben insertar 7 registro entonces la tabla en php queda de 7 x 7, hasta el momento puedo insertar un solo registro pero como le hago con los demás no se si debo usar un ciclo o que, porque mis campos de texto tienen nombres diferentes.

1 respuesta

Respuesta
1
Puedes insertar los siete registros de golpe o bien uno a uno. Esto último es lo más frecuente porque así es más flexible por si en el futuro en lugar de 7 son 8 ó 10.
En cualquier caso, si tienes registros pertenecientes a una misma tabla y por lo tanto con el mismo número de campos, deberías almacenarlos en matrices y así poder hacer un bucle. Por ejemplo:
$registro[0][0]="Primer campo del primer registro";
$registro[0][1] = "Segundo campo del segundo registro";
$registro[1][0] = "Primer campo del segundo registro";
Si tienes una matriz de este tipo, realizar un bucle para la inserción ya es mucho más sencillo.
Disculpa soy nueva en esto y la verdad como que no te entendí muy bien, pero mira te explico, mi inserción la tengo de la siguiente forma
$query = 'INSERT INTO necesidades (necesidad, cantidad, descripcion, uso, avances, solicita, responsable)
VALUES (\''.$necesidad.'\',\''.$cantidad.'\',\''.$descripcion.'\',\''.$uso.'\',\''.$avances.'\',\''.$solicita.'\',\''.$responsable.'\'),
(\''.$necesidad1.'\',\''.$cantidad1.'\',\''.$descripcion1.'\',\''.$uso1.'\',\''.$avances1.'\',\''.$solicita1.'\',\''.$responsable1.'\'),
(\''.$necesidad2.'\',\''.$cantidad2.'\',\''.$descripcion2.'\',\''.$uso2.'\',\''.$avances2.'\',\''.$solicita2.'\',\''.$responsable2.'\'),
(\''.$necesidad3.'\',\''.$cantidad3.'\',\''.$descripcion3.'\',\''.$uso3.'\',\''.$avances3.'\',\''.$solicita3.'\',\''.$responsable3.'\'),
(\''.$necesidad4.'\',\''.$cantidad4.'\',\''.$descripcion4.'\',\''.$uso4.'\',\''.$avances4.'\',\''.$solicita4.'\',\''.$responsable4.'\'),
(\''.$necesidad5.'\',\''.$cantidad5.'\',\''.$descripcion5.'\',\''.$uso5.'\',\''.$avances5.'\',\''.$solicita5.'\',\''.$responsable5.'\'),
(\''.$necesidad6.'\',\''.$cantidad6.'\',\''.$descripcion6.'\',\''.$uso6.'\',\''.$avances6.'\',\''.$solicita6.'\',\''.$responsable6.'\')';
Pero no la quiero así ya que no siempre se llenan todos los campos y sin embargo inserta campos vacíos en la base de datos. Yo creo que de la forma en que me dices es la correcta pero no te entendí bien. Podrías se más claro por favor.
Para tratar datos semejantes se ideó en programación el concepto de matriz (array en inglés). Esto permite guardar datos semejantes de forma muy potente. En tu caso, por ejemplo, te recomendaría crearte una matriz para cada campo de tu tabla.
La manera de referenciar una matriz es poniéndole un índice entre corchetes con lo que podemos acceder a cualquier valor de la lista.
Por ejemplo:
$necesidad[0] = "El primer valor";
$necesidad[1] = "El segundo valor";
$cantidad[0] = 23.5;
$cantidad[1] = 34.9;
Una vez tengas los datos en esta forma, puedes hacer fácilmente un bucle que inserte cada registro si los datos no están vacíos. Mediante un índice que recorra las matrices y compruebe si el dato tiene valor.
Quizás deberías mirarte la parte de matrices de algún tutorial de PHP:
http://www.aprende-gratis.com/php/curso.php?lec=arrays-matrices
Hola
Ahora tengo el siguiente código, pero algo estoy haciendo mal por que me marca un error para insertar los datos en la base de datos. Parfavo puedes revisar el código y decirme que estoy haciendo mal. Acepto sigerencias :-)
<?php
$i=0;
for($i=1;$i<=5;$i++){?>
<tr>
<td><label>
<input name="necesidad[<?php echo $i; ?>]" value="" type="text" size="32" />
</label></td>
<td><label>
<input name="cantidad[<?php echo $i; ?>]" value="" type="text" size="15" />
</label></td>
<td><label>
<input name="descripcion[<?php echo $i; ?>]" value="" type="text" size="40" />
</label></td>
<td><label>
<input name="uso[<?php echo $i; ?>]" value="" type="text" size="40" />
</label></td>
<td><label>
<input name="avances[<?php echo $i; ?>]" value="" type="text" size="15" />
</label></td>
<td><label>
<input name="solicita[<?php echo $i; ?>]" value="" type="text" size="40" />
</label></td>
<td><label>
<input name="responsable[<?php echo $i; ?>]" value="" type="text" size="40" />
</tr>
<br>
<?php }?></label></td>
</table>
<p> </p>
<p>
<label>
<input type="submit" name="Submit" value="GUARDAR" />
<input type="text" value="<?php echo $i-1; //dato que me sirve para saber cuantas filas tendra el array ?>" name="cantidad" />
</label>
</p>
</form>
</body>
</html>
<?php
}
else
//si envio el formulario por post recupero los valores
{
$cantidad=$REQUEST['cantidad']; //cantidad de filas que tiene mi array variable que viene del formulario
$datos =array(necesidad=>$POST['necesidad'],cantidad=>$POST['cantidad'],descripcion=>POST['descripcion'],uso=>POST['uso'],avances=>POST['avances'],solicita=>POST['solicita'],responsable=>['responsable']);//creo el array $datos
//preparo insercion
$query = 'INSERT INTO necesidades (necesidad, cantidad, descripcion, uso, avances, solicita, responsable) values ';
//cuento el numero de registros
for($i=0;$i<=$cantidad;$i++)
{
if($datos['necesidad'][$i]!=""){// si una fila no tiene datos, no recupero
// listo los datos del array
echo $necesidad= $datos['necesidad'][$i];
echo $cantidad= $datos['cantidad'][$i];
echo $descripcion= $datos['descripcion'][$i];
echo $uso= $datos['uso'][$i];
echo $avances= $datos['avances'][$i];
echo $solicita= $datos['solicita'][$i];
echo $responsable= $datos['responsable'][$i];
echo "<br>";
//creo el cuerpo de los valores
$sql.='($necesidad,$cantidad,$descripcion,$uso,$avances,$solicita,$responsable)';
//se ejecuta la sentencia
mysql_query($query) or die(mysql_error());
echo 'Las necesidades han sido registradas de manera satisfactoria.<br />';
echo '<a href="necesidades4.php">Regresar</a></p>
';
}
}
} ?>
no veo el if del else, pero supongo que tú si lo tienes puesto. Yo no haría ese trasvase que haces a $datos. No es necesario, puedes operar directamente con la matriz $_POST. Aparte de que no lo haces correctamente puesto que los valores que te vienen por post son arrays y por lo tanto tendrías que asignar cada valor. Es decir, no tienes $_POST["necesidad"] sino $_POST["necesidad"][0]
Recuerda que los nombres que les has dado a los campos de formulario eran necesidad[0], necesidad[1], etc.
Yo haría esto:
else
//si envio el formulario por post recupero los valores
{
$cantidad=$REQUEST['cantidad']; //cantidad de filas que tiene mi array variable que viene del formulario
//preparo insercion
$query = 'INSERT INTO necesidades (necesidad, cantidad, descripcion, uso, avances, solicita, responsable) values ';
//cuento el numero de registros
for($i=0;$i<=$cantidad;$i++)
{
if(!empty($_POST['necesidad'][$i])){// si una fila no tiene datos, no recupero
// listo los datos del array
echo "<br>";
//creo el cuerpo de los valores
if ($i>0)
$sql.=", "; // Si hay varios grupos de valores se deben separar por una coma
$sql.="('$_POST[necesidad][$i]','$_POST[cantidad][$i]','$_POST[descripcion][$i]','$_POST[uso][$i]','$_POST[avances][$i]','$_POST[solicita][$i]','$_POST[responsable][$i]')";
//se ejecuta la sentencia
mysql_query($query) or die(mysql_error());
echo 'Las necesidades han sido registradas de manera satisfactoria.<br />';
echo '<a href="necesidades4.php">Regresar</a></p>
';
}
Como ves te ahorras un montón de trasvases de información de una variable a otra. Esto es así porque dentro de una cadena entre comillas dobles, las variables se reconocen y se sustituyen (es una parte muy potente de PHP).
Como verás, también hay una condición para añadir una coma si hay varias filas a insertar.
Espero que vaya bien. Si da algún error que no sepas solucionar, ayuda bastante si copias el error.
Aunque yo creo que con un poco que te pongas lo solucionas.
Perdona, yo creo que ya te devi haber chocado con mis preguntas pero en verdad esto se me esta complicando un buen por que nunca había manejado algo parecido, pero estoy intentando hacer lo más que puedo.
Con el código que me mandas lo acople y ahora no me manda ningún error, pero tampoco me hace nada, eso me confunde más aun por que no se que esta mal...
¿Tu me puedes decir que podría ser?
Tendrás que debugar: coloca 'chivatos' con echo que te informen del valor de las variables clave o de si se entra en una condición o si se ejecuta un determinado trozo de código y podrás deducir lo que ocurre.
Suele ocurrir que las variables no tienen contenido por que los nombres no coinciden con los de los campos de los formularios, o que hay alguna condición mal escrita...
Por ejemplo si $necesidad[] no tiene ningún valor, hay una condición que dice que no se debe hacer nada. Quizás sea el caso...
Hola.
Cambie el código y ya me inserta en la base de datos paro ahora no se como poner la condición para que no inserte los campos que están vacíos. El código es el siguiente, ahora si te incluyo todo el código:
<?php
//si no envio el formulario muestro los campos
if (!isset(POST['id']))
{
?>
<form name="form1" method="post" action="necesidades44.php">
<input type="hidden" value="1" name="id"/>
<label>
<div align="center"><strong>NECESIDADES</strong></div>
<table width="1381" border="1" bgcolor="#FFFFFF">
<tr>
<th width="227" scope="col">NECESIDAD</th>
<th width="85" scope="col">CANTIDAD</th>
<th width="227" scope="col">DESCRIPCION</th>
<th width="213" scope="col">USO</th>
<th width="79" scope="col">AVANCES % </th>
<th width="211" scope="col">SOLICITA</th>
<th width="293" scope="col">RESPONSABLE</th>
</tr>
<?php
$i=0;
for($i=1;$i<=3;$i++){?>
<tr>
<td><label>
<input name="necesidad[<?php echo $i; ?>]" value="" type="text" size="32" />
</label></td>
<td><label>
<input name="cantidad[<?php echo $i; ?>]" value="" type="text" size="15" />
isset </label></td>
<td><label>
<input name="descripcion[<?php echo $i; ?>]" value="" type="text" size="40" />
</label></td>
<td><label>
<input name="uso[<?php echo $i; ?>]" value="" type="text" size="40" />
</label></td>
<td><label>
<input name="avances[<?php echo $i; ?>]" value="" type="text" size="15" />
</label></td>
<td><label>
<input name="solicita[<?php echo $i; ?>]" value="" type="text" size="40" />
</label></td>
<td><label>
<input name="responsable[<?php echo $i; ?>]" value="" type="text" size="40" />
</tr>
<br>
<?php }?></label></td>
</table>
<p> </p>
<p>
<input type="submit" name="Submit" value="GUARDAR" />
</p>
</form>
</body>
</html>
<?php
}
else
//si envio el formulario por post recupero los valores
{ //preparo insercion
if((POST['Submit'])){
$strquery='insert into necesidades (necesidad, cantidad, descripcion, uso, avances, solicita, responsable) values';
for($i=0;$i<count(POST['necesidad']);$i++){
$strquery.="('".POST['necesidad'][$i]."','".POST['cantidad'][$i]."','". POST['descripcion'][$i]."','". POST['uso'][$i]."','". POST['avances'][$i]."','". POST['solicita'][$i]."','". POST['responsable'][$i]."'),";
}
$strquery=substr($strquery,0,(strlen($strquery)-1)).';';
echo $strquery;
mysql_query($strquery) or die(mysql_error());
echo 'Las necesidades han sido registradas de manera satisfactoria.<br />';
echo '<a href="necesidades44.php">Regresar</a></p>
';
exit;
}
} ?>
Espero y me puedas ayudar con esta nueva duda. Y cualquier sugerencia es muy bien recibida.
Gracias
Si no quieres incluir los registros que están vacíos, puedes añadir una condición que lo revise. Por ejemplo:
for($i=0;$i<count(POST['necesidad']);$i++){
if (!empty($_POST['necesidad'][$i])) {
$strquery.="('".POST['necesidad'][$i]."','".POST['cantidad'][$i]."','". POST['descripcion'][$i]."','". POST['uso'][$i]."','". POST['avances'][$i]."','". POST['solicita'][$i]."','". POST['responsable'][$i]."'),";
}
}

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas