PHP - generar insert dinamico

   
Vista:

generar insert dinamico

Publicado por alberto (4 intervenciones) el 11/05/2016 18:47:41
hola buen día ojala puedan orientarme un poco

Tengo un formulario que viene de una tabla(mysql) para tomar los nombres de los campos. Pero esta tabla va creciendo según se registran nuevos campos, mi problema o en donde me he quedado parado, es como puedo hacer un insert dinamico para que no sea necesario introducir nuevos campos al insert manualmente si no que como vaya creciendo la tabla el insert tome los campos que deseo insertar en la tabla.

he pensado usar un while y una consulta para traer los nombres de la tabla pero no se me ocurre como hacerlo funcionar. Perdon pero aún estoy muy verde en PHP ojala puedan orientarme un poco

muchas gracias por tu ayuda!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

generar insert dinamico

Publicado por xve (5519 intervenciones) el 11/05/2016 21:33:10
Hola Alberto, no entiendo muy que quieres hacer... nos puedes comentar con mas detalle?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

generar insert dinamico

Publicado por alberto (4 intervenciones) el 11/05/2016 21:58:41
si por supuesto gracias por responder xve.

tengo una tabla en mysql. Esta tabla va creciendo es decir se van agregando nuevas columnas por ejemplo:
idCampo, producto, caracteristica1, caracteristica2, caracteristica3.... caracteristica10 y así sucesivamente

En esta tabla debo hacer un insert desde PHP, el formulario ya lo tengo bien me carga todos los campos en automatico asi se agregue la caracteristica15 se carga el input en automatico con su respectivo name

El problema me viene en el insert ya que se debe generar automaticamente todas las columnas y sus respectivos valores

insert into productos (producto,caracteristica1,caracteristica2,caracteristica3, .... caracteristica10) values ()

y pues en eso consiste mi problemilla no se como puedo generar este insert automaticamente para evitar estar haciendo cambios en el insert manualmente cada que el usuario agregue una nueva caracteristica.

no se si me halla explicado o revolvi mas el tema.

ojala puedan aclararme un poco

Gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VRM

generar insert dinamico

Publicado por VRM (171 intervenciones) el 12/05/2016 08:06:55
Hola:

Puedes obtener los campos de una tabla con el comando de mysql:
1
describe tabla

Algo como:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Consulta los campos de la tabla
$result = $base->query("describe productos");
$tabla = null;
while ($row = $result->fetch_array()) {
	$tabla[]=$row;
}
// Crea el comando para insertar
$comando = "insert into productos (
foreach ($tabla as $campo){
      $comando .= "$campo,";
}
$comando = substr($comando,0,-1).")";// Elimina la última coma y cierra paréntasis
echo " values (";
foreach ($valores as $valor){
      $comando .= "'$valor',";
}
$comando = substr($comando,0,-1).")";// Elimina la última coma y cierra paréntasis
// Ejecuta el comando
$base->query($comando);

$base es un objeto de la clase $mysqli

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

generar insert dinamico

Publicado por alberto (4 intervenciones) el 13/05/2016 00:09:48
gracias victor agradezco tu gran ayuda pero ahora me encuentro ante otra dificultad

lo que tengo desarrollado es esto

1
2
3
4
5
6
7
8
9
10
11
12
$campos = mysqli_query($conexion,"select column_name from information_schema.columns where table_name = 'productos';");
$variables = array_keys($_POST); //saco el nombre de la variable
$tabla = null;
while($row = mysqli_fetch_array($campos)){
	$tabla[] = $row[0];
}
$aregistrar = array_intersect($variables, $tabla);//busco coincidencias de los campos que llegan por post con los campos de la BD
$insert = "insert into productos (";
$insert.= implode(",", $aregistrar);
$insert.= ") values (";
 
echo $insert;

como salida tengo
1
insert into productos (codProducto,carac1,carac4,carac9) values (

hasta aqui bien pues ya logre introducir los campos que me llegan por post de la tabla en el insert

Decidí hacerlo asi por que los productos que registro en esta tabla algunos no cuentan con todas las caracteristicas, puede haber un producto que tenga tan solo dos caracteristicas o todas... Tambien porque no todos los campos que mando por este formulario los debo registrar en esta tabla si no que van a otras tablas de mi BD.

ahora mi dificultad esta en como puedo terminar mi insert es decir ordenar los valores del insert para que me correspondan con su respectiva columna ej.

1
insert into productos (codProducto,carac1,carac4,carac9) values ('$_POST['codProducto']','$_POST['carac1']','$_POST['carac4']','$_POST['carac9']');

talves ya complique bastante el desarrollo???

gracias por tu gran ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VRM

generar insert dinamico

Publicado por VRM (171 intervenciones) el 13/05/2016 09:17:01
Hola:

Si los valores de los campos los mandas por POST y el índice de $_POST coincide con el nombre del campo en la base de datos, yo haría lo siguiente:

1
2
3
4
5
6
7
8
$comando = "insert into productos (";
foreach ($_POST as $campo => $valor){
     $lista_campos .= "$campo,";
     $lista_valores  .= "'$valor',";
}
$lista_campos = substr($lista_campos,0,-1);// Elimina la última coma
$lista_valores = substr($lista_valores,0,-1);// Elimina la última coma
$comando .= $lista_campos.") values (".$lista_valores.")";

Con ello tienes el comando que escribes arriba. Pero no se puede pasar nada más por POST.

Si quieres que el código también seleccione la tabla destino, tendrías tres opciones:
1) Pasarla por POST como $_POST[tabla_destino] o cualquier otro nombre que no pueda ser una característica de los productos. El código quedaría:
1
2
3
4
5
6
7
8
9
10
$comando = "insert into ".$_POST[tabla_destino]." (";
foreach ($_POST as $campo => $valor){
     if ( $campo != "tabla_destino"){
          $lista_campos .= "$campo,";
          $lista_valores  .= "'$valor',";
     }
}
$lista_campos = substr($lista_campos,0,-1);// Elimina la última coma
$lista_valores = substr($lista_valores,0,-1);// Elimina la última coma
$comando .= $lista_campos.") values (".$lista_valores.")";
2) Pasarlo por GET:
1
2
3
4
5
6
7
8
$comando = "insert into ".$_GET[tabla_destino]." (";
foreach ($_POST as $campo => $valor){
     $lista_campos .= "$campo,";
     $lista_valores  .= "'$valor',";
}
$lista_campos = substr($lista_campos,0,-1);// Elimina la última coma
$lista_valores = substr($lista_valores,0,-1);// Elimina la última coma
$comando .= $lista_campos.") values (".$lista_valores.")";
Tiene el problema de que es más visible.
3) Pasarlo por SESSION:
1
2
3
4
5
6
7
8
$comando = "insert into ".$_SESSION[tabla_destino]." (";
foreach ($_POST as $campo => $valor){
     $lista_campos .= "$campo,";
     $lista_valores  .= "'$valor',";
}
$lista_campos = substr($lista_campos,0,-1);// Elimina la última coma
$lista_valores = substr($lista_valores,0,-1);// Elimina la última coma
$comando .= $lista_campos.") values (".$lista_valores.")";
Tiene el problema de que es más complejo: hay que crear la sesión, los datos guardados en sesión tienen persistencia (no se borran al pasar a otra página),...

Espero haberte ayudado.

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

generar insert dinamico

Publicado por alberto (4 intervenciones) el 13/05/2016 22:05:32
claro que me ayudaste y bastante y no solo a mi si no a todos aquellos colegas que tengan que resolver algo similar a esto.

Tuve que seccionar mi formulario de registro para poder resolver este conflicto y ahora funciona. me siento en deuda contigo y gracias de nuevo Victor.

mi código final quedo así.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if(!$_POST){
	include 'formulario.php';
}else{
	$producto = "insert into producto ( ";
	$columnas = "";
	$valores = "";
	foreach($_POST as $campo => $valor){
		$columnas .= $campo.",";
		$valores .= "'".$valor."',";
	}
	$columnas = substr($columnas, 0,-1);
	$valores = substr($valores, 0,-1);
	$producto.= $columnas. ") values (" .$valores. ");";
	$query = mysqli_query($conexion,$producto);
	if($query){
		echo "
			<script>
				alert(\"Se ha enviado la cotización\");
				location.href = \"alta-producto.php\";
			</script>
		";
	}else{
		echo "Error ".mysqli_error($conexion);
	}
}

un gran saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VRM

generar insert dinamico

Publicado por VRM (171 intervenciones) el 14/05/2016 08:45:20
A tu disposición.

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar