Announcement

Collapse
No announcement yet.

Civilizaciones Codificadoras

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Civilizaciones Codificadoras

    Saludos a todos, vengo en son de paz.. erm no, eso es otro dialogo.

    Bueno, tengo el sgte dilema en el trabajo en el que estoy. Yo he trabajando antes un poco con Macromedia Dreamweaver y php, y aparte con MySql y BD's.. asi que cuando mi jefe me dijo si podia hacer un formulario en php para que guarde los datos en mysql yo dije claro, como no, pero el problema surje aqui...

    Luego de normalizar la data obtuve 4 tablas (Persona, Estudios Superiores, Idiomas, Exp Laboral) y los datos para estas se recogen del formulario. No tengo ninguna complicacion para enviar los datos a la 1era tabla, el problema es en la 2da (y siguientes) debido a que tengo que enviarle la Id de la persona en cuestion. Yo he implementado lo siguiente que no estoy 100% seguro de que funcione (ya que el Dreamweaver no tiene forma de ser depurado! )

    Code:
    		//Asignando la conexion				
    		require ('conexion.php');
    			
    		//Tomando la IdPersona que sera utlizada por sus tablas relacionadas				
    		$sqlIdPersona = "SELECT IdPersona FROM hv_persona WHERE (APaterno = '".$_POST['txtApePaterno']."') AND (AMaterno = '".$_POST['txtApeMaterno']."') AND (Nombres = '". $_POST['txtNombres']."')";
    		
    		$result = mysql_query($sqlIdPersona,$con);
    		if (!$result) {
    		    die('Could not query:' . mysql_error());
    		}
    		$row =	mysql_fetch_row($result);
    		$IdPersona = $row [0];	
    		settype($IdPersona,"integer");
    Y luego de lo otro que no estoy muy seguro es como uso la variable en las queryes (las Ids son integer con autoincremento)

    Code:
    		//insertado datos a la tabla hv_estu_superior
    		$sql2 = "insert into hv_estu_superior (IdPersona, SFec_Ini, SFec_Fin, Actualmente, Nombre, Titulo) values (".$IdPersona.", '".$_POST['txtSupFecIni']."', '".$_POST['txtSupFecFin']."', ".$SupAct.", '".$_POST['SupNombre']."', '".$_POST['txtSupTitulo']."')";
    Y finalmente inserto todos los datos ingresados a la BD de la sgte manera :

    Code:
    		 	if (mysql_query($sql1, $con)){
    				if(mysql_query($sql2, $con)){
    					if(mysql_query($sql3, $con)){
    						if(mysql_query($sql4, $con)){			
    							$correcto = "Se registro correctamente ...";			
    						}else{	
    							$error = "Se produjo un error con la Sql 4 

    Vuelva a intentar ...
    "; } }else{ $error = "Se produjo un error con la Sql 3

    Vuelva a intentar ...
    "; } }else{ $error = "Se produjo un error con la Sql 2

    Vuelva a intentar ...
    "; } }else{ $error = "Se produjo un error con la Sql 1

    Vuelva a intentar ...
    "; }
    Agradecere mucho la asistencia que puedan ofrecer que este asunto me tiene hacer por 2 dias sin resolver y aun no hago ni el diseño correcto de la pagina!

    Fortune and Glory, here I come!!!.
    Indiana Jones
    Spanish Empire Civ for Civilization 5 (in Spanish/en Español)

  • #2
    Bueno, la verdad es que no se donde ves el problema, pero por mi parte ningun pero, para mi está todo ok. Además veo que dices que las 4 tablas donde tienes que insertar registros tienen un campo Id que es autonumérico y la verdad es que como muy bien has hecho no hace falta pasarle valor en la consulta insert.

    EDIT ----

    Ahora que estaba mirando la parte final del código, me he fijado que la forma de controlar si la consulta ha ido bien no me acaba de gustar demasiado. Yo probaria a utilizar la función mysql_error. Aquí te pego un trozo de código propio para que veas un poco como utilizarlo

    $sql = "INSERT INTO Usuarios (Nombre, Apellido, Edad) VALUES ('Pepe', 'Grillo', 38)"
    $res = mysql_query($sql) or die(mysql_error());
    mysql_free_result($res);
    Last edited by Frucus; May 19, 2008, 14:34.
    Dame argo mi alma ... necesito pc nuevo para jugar al CIV 5

    CivELO:2556 (9º) (CIV3 Edition)

    Comment


    • #3
      Hombre, yo tambien lo veo bien, pero el detalle es que nunca paso al mensaje de "Se registro correctamente" y solo la tabla persona obtiene datos.

      Quiza no me termine de expresar bien sobre las tablas, su estructura es la sgte.

      Tabla Persona (IdPersona es la PK, se autoincrementa)
      Code:
      hv_persona (IdPersona, APaterno, AMaterno, Nombres, Direccion, Telefono, Email, FecNac, Descripcion, Prim_F_Ini,Prim_F_Fin, Prim_Nombre, Sec_F_Ini, Sec_F_Fin, Sec_Nombre)
      Tabla Estudios Superiores (IdEstSuperior y IdPersona son PK, IdEstSuperior se autoincrementa e IdPersona señala a que persona pertenece este registro)
      Code:
      hv_estu_superior (IdEstSuperior, IdPersona, SFec_Ini, SFec_Fin, Actualmente, Nombre, Titulo)
      Tabla Idiomas (Id_Est_Idiomas y IdPersona son PK, Id_Est_Idiomas se autoincrementa e IdPersona señala a que persona pertenece este registro)
      Code:
      hv_est_idiomas (Id_Est_Idiomas, IdPersona, Idioma, Lectura, Escritura, Exp_Oral)
      Tabla Experiencia Laboral (IdExpLaboral y IdPersona son PK, IdExpLaboral se autoincrementa e IdPersona señala a que persona pertenece este registro)
      Code:
      hv_exp_laboral (IdExpLaboral, IdPersona, xpFec_Ini, xpFec_Fin, xp_Tipo, xpCargo, xp_Act_Resp, xp_Apor_Logr)
      Gracias de antemano
      Last edited by The Slayer; May 19, 2008, 14:52.
      Fortune and Glory, here I come!!!.
      Indiana Jones
      Spanish Empire Civ for Civilization 5 (in Spanish/en Español)

      Comment


      • #4
        No, si te he entendido muy bien el como están diseñadas las tablas y sigo insistiendo, que la consulta sql2, al principio es correcta, pero también podrías hacer que la página php muestre la consulta sql2 que vas a lanzar contra la base de datos y así ver si es correcta. Podrías también probar de abrir el query analizer del mysql y lanzar manualmente la consulta esa a ver si da algun mensaje de error.

        Por cierto, creo recordar que el la funcion mysql_error devuelve el mensaje el mensaje de error de la última instrucción, igual eso te ayuda.
        Dame argo mi alma ... necesito pc nuevo para jugar al CIV 5

        CivELO:2556 (9º) (CIV3 Edition)

        Comment


        • #5
          Pues he cambiado ese texto por el comando mysql_error() y ahora veo que es problema de llave foranea .. lo curioso es que puedo ingresar manualmente nuevos registros sin problemas en las tablas desde el Query Browser. Este es el mensaje en cuestion.

          Cannot add or update a child row: a foreign key constraint fails (`cjava/hv_estu_superior`, CONSTRAINT `FK_hv_estu_superior_persona` FOREIGN KEY (`IdPersona`) REFERENCES `hv_persona` (`IdPersona`))
          Tengo que hacer un drop keys, insertar y luego restore keys desde el php? (nunca termino de entenderme con lo de las llaves foraneas )

          Gracias por la ayuda
          Fortune and Glory, here I come!!!.
          Indiana Jones
          Spanish Empire Civ for Civilization 5 (in Spanish/en Español)

          Comment


          • #6
            Pues la verdad es que poco te puedo decir de las claves foráneas, más que nada porque nunca las utilizo al ser bastante tocahuevos

            Yo de ti las sacaría, ya que con el id autoincremental más que suficiente y así te evitas problemas cuando quieras borrar registros de la tabla estudiantes. Eso o a esperar que se pase alguien que sepa más, que seguro que alguno que otro hay por aquí
            Dame argo mi alma ... necesito pc nuevo para jugar al CIV 5

            CivELO:2556 (9º) (CIV3 Edition)

            Comment


            • #7
              Danke Mr Frucus, igual sin ese detalle hubiera tardado mucho mas en encontrar el problema (y eso que en otra parte del documento si puse lo de mysql_error ).

              He (aparentemente) encontrado una solucion al dilema. Como tengo que seguir la secuencia de : Quitar la llave, Insertar Datos, Reponer la llave; y el mysql_query() no acepta multiples queries, encontre una funcion que agrupa las queries en un array(arreglo) y las ejecuta una a una, devolviendo true o false conforme se ejecuten y al final la funcion entera te devuelve true o false si es que se pudo ejecutar todo o no. Hice una primera prueba y me lleno 3 de las 4 tablas que tengo, asi que quiero aun refinarlo un poco mas y con gusto comparto la solucion para futura referencia, tanto mia, como de alguna otra persona que tenga un problema similar.

              Fortune and Glory, here I come!!!.
              Indiana Jones
              Spanish Empire Civ for Civilization 5 (in Spanish/en Español)

              Comment


              • #8
                The Slayer, usa Eclipse con el plug-in de PHPEclipse, verás que gozada...
                El futuro pertenece a quienes creen en la belleza de sus sueños.
                - Eleanor Roosevelt

                Comment


                • #9
                  Pues lo usaria si supiera como usarlo .. el proximo ciclo recien comenzamos a usar Eclipse. Bueno eso y que en el trabajo no tengo el Eclipse.

                  Al final tube que usar una solucion de lo mas sencilla (por si alguno esta interesado). Escribire el agorito para no marear mucho.

                  Code:
                  ...
                  mysql_query(eliminar la llave foranea);
                  mysql_query(el insert, update o delete que quiera realizar);
                  mysql_query(restaurar / ingresar la llave foranea antes borrada);
                  Nota : como yo estaba trabajando en InnoDB, las queries de eliminar y crear llaves foraneas son ligeramente diferentes a las normales.

                  Bueh con eso solucionado ya puedo trabajar en el disenio

                  Fortune and Glory, here I come!!!.
                  Indiana Jones
                  Spanish Empire Civ for Civilization 5 (in Spanish/en Español)

                  Comment

                  Working...
                  X