Insertar datos en tabla si existen variables, sino no

Mu buenas, a ver si me pueden echar una manita que me estoy volviendo loco.

Tengo un formulario que se construye dinamicamente segun lo que elija el usuario. Cuando recojo los datos de ese formulario, como hay variables que no van a existir (porque no las eligió el usuario), utilizo if(isset($variable)){} para asociarles valor. Hasta ahí bien.

Ahora quiero insertar los datos en la tabla (INSERT INTO), pero ¿como puedo saber que variables existen y cuales no, dentro del insert, para que no me de error? ¿O si no existe, en mysql da igual y no me da error, simplemente no me inserta nada? Ejemplo:

INSERT INTO baseDatos.tablaUno (usuario, nombre, email, direccion) VALUES ($user, $nombre, $email, $direccion)

Pero puede que, por ejemplo, $correo y $direccion no existan... porque no lo construyó así el usuario en el formulario... ¿Como hago?

Desde ya gracias y saludos!
Haz if, elseif, else, exageradamente simple tu problema (a simple vista)....

supongo que si es de formulario puedes conocer exactamente todos los "name" que tienen los input solo es cuestion de hacer esto :

//poner todas las variables posibles con su post es decir algo asi :

$variable1 = $_POST["NAME1"];
$variable2 = $_POST["NAME2"[; // Y ASI TODOS LOS DATOS DEL FORMULARIO

despues las comprobaciones con su insert :

if(!empty($variable1)){
//el insert que corresponde si existe variable uno
}
else if (!empty($variable2)){
//el segundo insert correspondiente
}
//si debes comprobar varias variables en uno asi
else if (!empty($variable3) && !empty($variable4)){

//el otro insert
}
else{
// el insert por default o un mensaje de error
}

Saludos
Hola:

¿Las tablas en la base de datos también se construyen dinámicamente? Si no, entonces no puedes insertar los datos en columnas que no existen.

Lee sobre las funciones array_keys() y array_values().

Saludos.
Haz if, elseif, else, exageradamente simple tu problema (a simple vista)....

Había pensado en eso, pero la verdad es que son muchos inputs (unos 141 con el formulario completo) los que hay, y muy pocos dependen de otros, con lo que casi todos son independientes. No se si será una buena opción, pensaba que podría haber alguna manera más rápida y eficiente. Me puedo morir haciendo if/else, jeje.

¿Las tablas en la base de datos también se construyen dinámicamente?

No no, las tablas existen con todos los campos, pero evidentemente algunos pueden quedar vacíos según elija el usuario. ¿Se os ocurre algo con array_search()? así a simple vista se me ocurre alguna cosa, pero muy vasta, como los del if/else...
Es que mira, yo haría esto lo siguiente:

Teniendo en cuenta que array_keys() extraerá todos los índices y sólo existirán si fueron llenados a no ser de que les hayas dado un valor por defecto, entonces podrías hacer esto:

$query = 'INSERT INTO tabla (';
$keys = array_keys( $_POST );

foreach( $keys as $k ) {
  $query .= "$k,";
}

$query = trim( $query, ',' );  // Esto es para quitar la coma (,) que sobrará al final)
$query .= ') VALUES (';

foreach( $keys as $k ) {
  $query .= "'" . $_POST[$k] . "',";
}

$query = trim( $query, ',' );
$query .= ')';

echo $query;

Este código asume que los nombres en los "input" del formulario son los nombres de la base de datos, lo cual es algo arriesgado. Algo menos arriesgado sería codificar los name de cada input o anteponerles un prefijo que después puedas remover fácilmente. Algo como <input type="text" name="form_email" /> y luego solo les quitas el "form_" a los índices:

foreach( $keys as $k ) {
  $k = str_replace( 'form_', '', $k );
  $query .= "$k,";
}

Creo que eso te sirve, no?

Saludos.
Si existe $_POST['correo'] el valor de la variable sera el valor de $_POST['correo'] si no, dejas la variable $correo en blanco y graba eso en la bd, repite lo mismo para todos las variables.
if($_POST['correo']){$correo=$_POST['correo'];}else{$correo="";}
Gracias skaparate, el tema es que tengo 4 tablas y (si he entendido bien tu código) esto sería óptimo para 1 tabla, ¿o no?, ya sabes que no controlo mucho jeje... ilumíname!

Waldragon gracias, en if/else ya había pensado, el problema es que tengo 141 campos en el formulario que tendría que comprobar, me puedo morir, jejeje. Aunque si finalmente no encuentro solución, tendré que hacer esto claro ;-)
Aaaaaaaaaaaaah, eso es más complejo de automatizar... La solución más simple, lamentablemente es hacerlo uno a uno.

La otra solución que se me ocurre es darle un número a cada tabla y en base a este número relacionar los campos del formulario con la tabla correspondiente. Este número no existirá realmente, o sea, no tendrás que añadirlo a ninguna parte:

<form action...>
<input type="text" name="0_nombre" />
<input type="text" name="1_url_imagen" />
<input type="text" name="2_direccion" />
<input type="submit" />
</form>

<?php
  
       $link = mysql_connect( 'tus datos... ' );
       mysql_select_db( 'database', $link );
	$delimiter = '_'; // Cámbialo por lo que será el delimitador (en realidad no hay muchas opciones :P)
	// Test es para pruebas, después debes cambiar array_keys( $test ) por array_keys( $_POST );
	//$test = array( '1_email' => '[correo eliminado]', '1_userid' => 'skaparate', '2_img' => 'http://misitio.com/imagen.png', '3_username' => 'Nombre Apellido');
	$keys = array_keys( $_POST );
        // Añade los nombres de las tablas tal cual aparecen aquí (los que puse yo no necesariamente existen :P):
	$inserts = array( 
			'usuario' => array( 'values' => '', 'keys' => '', 'query' => '' ),
			'imagenes' => array( 'values' => '', 'keys' => '', 'query' => '' ),
			'informacion_personal' => array( 'values' => '', 'keys' => '', 'query' => '' )
	);
        $tables = array_keys( $inserts );
	
	foreach( $keys as $k => $v ) {
		$tname = get_table_name( $v, $tables, $delimiter );
		$tmp = substr( $keys[$k], stripos( $keys[$k], $delimiter ) + 1 );
		if( ! empty( $_POST[$k] ) ) {
			$inserts[$tname]['values'] .= $_POST[$v] . ',';
			$inserts[$tname]['keys'] .= $tmp . ',';
			$inserts[$tname]['query'] = "INSERT INTO $tname (" . $inserts[$tname]['keys'];
		}
	}
	
	$out = 1; // true
	// Se construyen las consultas y se ejecutan:
	foreach( $inserts as $key => $val ) {
		$inserts[$key]['query'] = trim( $inserts[$key]['query'], ',' ) . ')';
		$inserts[$key]['query'] .= ' VALUES (' . trim( $inserts[$key]['values'], ',' ) . ')';
		$result = mysql_query( $inserts[$key]['query'] );
		$aff = mysql_affected_rows( $link );
		if( $aff > 0 )
			$out &= 1;
	}
	
	if( $out ) {
		echo "Se insertaron todos los datos";
	} else {
		echo "Ocurrió un erro al insertar los datos";
	}
	
	//print_keys( $keys );
	//print_inserts( $inserts );
	// 0 = tabla de usuario
	// 1 = tabla imágenes de usuario
	// 2 = tabla datos personales
	// N = etc.
        // DEBE comenzar por 0
	
	function get_table_name( $key, $tables, $delimiter ) {
		// Le pasas el nombre del índice
		$number = substr( $key, 0, stripos( $key, $delimiter ) );
	
		return $tables[$number];
	}
	
        // Estas funciones no son útiles, solo las puse para mostrar los valores (podrías usar var_dump en su lugar)
	function print_keys( $keys ) {
		echo "<br />Keys: <br />";
		foreach( $keys as $k ) {
			echo "$k<br />";
		}
	}
	
	function print_inserts( $inserts ) {
		echo "<br />Insert Querys: <br />";
		foreach( $inserts as $in ) {
			echo "VALUES: $in[values]<br />KEYS: $in[keys]<br />QUERY: $in[query]<br /><br />";
		}
	}
?>

Si quieres probar el código, descomenta la línea que tiene el arreglo $test y comenta las líneas que insertan los datos en la base (también mysql_connect y mysql_select_db). También descomenta las líneas print_keys( $keys ); y print_inserts( $inserts ); para que veas el resultado.

Esa es una forma de automatizarlo. Puede que hayan mejores formas de hacerlo, pero no se me ocurren, así que si lo puedes optimizar nos avisas :D.

Obviamente, si no entiendes algo pregunta :D.
Bueno, creo que entiendo "algo" del código, jajaja. Voy a cogerlo e ir haciendo pruebas a ver que saco en claro, sino, lo hare de uno en uno y luego tranquilamente iré depurando código. Iré comentando si tengo avances.

Muchas gracias por la ayuda [;)]

Saludos!
Bueno finalmente, y teniendo en cuenta mi bajo nivel de php, me he decantado por el if/else. He ido comprobando el isset o empty de las variables y utilizando bucles para darles valor, aunque he tenido que condicionar unas variables a otras, pero bueno, creo que no va mal encaminado. Como dije ya iré depurando, de momento funciona ;-)

Gracias a todos por la ayuda y saludos!