Regresar a la página ComoCrearTuWeb.com
Resultados 1 al 10 de 10

Tema: Insertar datos en tabla si existen variables, sino no

  1. #1
    Esto empieza a ser un vicio... Habitante Avatar de Web-Freelance
    Fecha de Ingreso
    15 sep, 11
    Ubicación
    España
    Mensajes
    568
    Poder de Reputación
    19

    Unhappy 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:

    Código:
    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!
    Agradece si te ayudan, que desagradecidos ya sobran.

  2. #2
    Me va gustando esto... Habitante Avatar de SurKaiser
    Fecha de Ingreso
    15 oct, 11
    Mensajes
    246
    Poder de Reputación
    18
    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
    Mi web en construccion :
    surkaiser . com . es
    "El conocimiento es Poder"

  3. #3
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,046
    Poder de Reputación
    29
    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.

  4. #4
    Esto empieza a ser un vicio... Habitante Avatar de Web-Freelance
    Fecha de Ingreso
    15 sep, 11
    Ubicación
    España
    Mensajes
    568
    Poder de Reputación
    19
    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...
    Última edición por Web-Freelance; 16/06/2012 a las 14:57
    Agradece si te ayudan, que desagradecidos ya sobran.

  5. #5
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,046
    Poder de Reputación
    29
    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:

    Código PHP:
    $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:

    Código PHP:
    foreach( $keys as $k ) {
      
    $k str_replace'form_'''$k );
      
    $query .= "$k,";

    Creo que eso te sirve, no?

    Saludos.

  6. #6
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    17 ene, 09
    Ubicación
    argentina
    Mensajes
    431
    Poder de Reputación
    23
    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.
    Código PHP:
    if($_POST['correo']){$correo=$_POST['correo'];}else{$correo="";} 

  7. #7
    Esto empieza a ser un vicio... Habitante Avatar de Web-Freelance
    Fecha de Ingreso
    15 sep, 11
    Ubicación
    España
    Mensajes
    568
    Poder de Reputación
    19
    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 ;-)
    Agradece si te ayudan, que desagradecidos ya sobran.

  8. #8
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,046
    Poder de Reputación
    29
    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>

    Código PHP:
    <?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' => 'a@a.com', '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 ) + );
            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 )
                
    $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$key0stripos$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.
    Última edición por skaparate; 17/06/2012 a las 21:07

  9. #9
    Esto empieza a ser un vicio... Habitante Avatar de Web-Freelance
    Fecha de Ingreso
    15 sep, 11
    Ubicación
    España
    Mensajes
    568
    Poder de Reputación
    19
    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!
    Agradece si te ayudan, que desagradecidos ya sobran.

  10. #10
    Esto empieza a ser un vicio... Habitante Avatar de Web-Freelance
    Fecha de Ingreso
    15 sep, 11
    Ubicación
    España
    Mensajes
    568
    Poder de Reputación
    19
    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!
    Agradece si te ayudan, que desagradecidos ya sobran.

Temas Similares

  1. insertar los datos guardados en POST en la tabla USUARIOS
    Por danielestudio en el foro Php Bases de Datos y MySQL (Nuevo!)
    Respuestas: 13
    Último Mensaje: 16/09/2013, 22:42
  2. Insertar tabla de datos
    Por ericku en el foro Foro General
    Respuestas: 10
    Último Mensaje: 28/01/2012, 22:50
  3. Insertar tabla de datos
    Por ericku en el foro Foros
    Respuestas: 4
    Último Mensaje: 23/01/2012, 23:08
  4. Problemas para insertar datos en una tabla
    Por hugoCent en el foro Php Bases de Datos y MySQL (Nuevo!)
    Respuestas: 3
    Último Mensaje: 31/07/2009, 18:01

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •