Foros del Web » Programando para Internet » PHP »

Datos de formulario no llegan a BBDD por problema con clave foranea

Estas en el tema de Datos de formulario no llegan a BBDD por problema con clave foranea en el foro de PHP en Foros del Web. El error: Cannot add or update a child row: a foreign key constraint fails (`omohr4`.`empleado`, CONSTRAINT `rut_a_fk` FOREIGN KEY (`rut_a_fk`) REFERENCES `administrador` (`rut_a`) ON DELETE ...
  #1 (permalink)  
Antiguo 10/06/2012, 18:25
 
Fecha de Ingreso: noviembre-2008
Mensajes: 23
Antigüedad: 15 años, 5 meses
Puntos: 0
Datos de formulario no llegan a BBDD por problema con clave foranea

El error:
Cannot add or update a child row: a foreign key constraint fails (`omohr4`.`empleado`, CONSTRAINT `rut_a_fk` FOREIGN KEY (`rut_a_fk`) REFERENCES `administrador` (`rut_a`) ON DELETE NO ACTION ON UPDATE NO ACTION)

El HTML/PHP:
Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Registro Empleados</title>
</head>

<body>

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
  <p><b>Formulario de registro de Empleado</b> <br><br>
    
    Primer nombre: <input type="text" name="nombre"><br>
    Primer apellido: <input type="text" name="apellido"><br>
    RUT: <input type="text" name="rut_e"><br>
    Calle y número: <input type="text" name="calle_nro"><br>
    Comuna: <input type="text" name="comuna"><br>
    Región: <input type="text" name="region"><br>
    Fecha contrato: <input type="text" name="fecha_contrato"><br>
    Tipo Empleado: <select name="tipo_empleado"><option>a</option><option>v</option><option>j</option>
</select><br>
    Rut jefe: <input type="text" name="rut_a_fk">
  </p>
  <p>	
    <input type="submit" value="Registrar" />
    <br>
  </p>
</form>
 
<?php
 
if(isset($_POST['nombre'])){
 
$host="localhost";
$username="root";
$password="";

$conexion=mysql_connect($host,$username,$password)  or die(mysql_error()); 
$db = @mysql_select_db("omohr4", $conexion) or die(mysql_error()); 
$nombre=$_POST["nombre"];
$apellido=$_POST["apellido"];
$rut_e=$_POST["rut_e"];
$calle_nro=$_POST["calle_nro"];
$comuna=$_POST["comuna"];
$region=$_POST["region"];
$fecha_contrato=$_POST["fecha_contrato"];
$tipo_empleado=$_POST["tipo_empleado"];
$rut_a_fk=$_POST["rut_a_fk"];




if ($rut_a_fk='')
{mysql_query("INSERT INTO empleado (`rut_e`, `nombre`, `apellido`, `calle_nro`, `comuna`, `region`,`fecha_contrato`,`tipo_empleado`,`rut_a_fk`) VALUES ('$rut_e','$nombre','$apellido','$calle_nro','$comuna','$region','$fecha_contrato','$tipo_empleado', NULL)") or die(mysql_error());
}

mysql_query("INSERT INTO empleado (`rut_e`, `nombre`, `apellido`, `calle_nro`, `comuna`, `region`,`fecha_contrato`,`tipo_empleado`,`rut_a_fk`) VALUES ('$rut_e','$nombre','$apellido','$calle_nro','$comuna','$region','$fecha_contrato','$tipo_empleado','$rut_a_fk')") or die(mysql_error());
	
if ($tipo_empleado = a)
{
$titulo="DEFECTO";
mysql_query("INSERT INTO administrador (`rut_a`, `titulo`) VALUES ('$rut_e,'$titulo')") or die(mysql_error());
}
if ($tipo_empleado=v)
{
mysql_query("INSERT INTO vendedor (rut_v) VALUES ('rut_e')") or die(mysql_error());
}
if ($tipo_empleado=j)
{
$cargo_mantencion="DEFECTO";
mysql_query("INSERT INTO junior (rut_j, cargo_mantencion) VALUES ('$rut_e, '$cargo_mantencion')") or die(mysql_error());
}

}
?>

</body>
</html> 
Extracto del SQL comprometido:
Código:
-- -----------------------------------------------------
-- Table `omohr4`.`administrador`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `omohr4`.`administrador` (
  `rut_a` INT(8) NOT NULL ,
  `titulo` VARCHAR(35) NOT NULL ,
  PRIMARY KEY (`rut_a`) ,
  INDEX `rut_a` (`rut_a` ASC) ,
  CONSTRAINT `rut_a`
    FOREIGN KEY (`rut_a` )
    REFERENCES `omohr4`.`empleado` (`rut_e` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `omohr4`.`empleado`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `omohr4`.`empleado` 
(
  `rut_e` INT(8) NOT NULL ,
  `nombre` VARCHAR(35) NOT NULL ,
  `apellido` VARCHAR(35) NOT NULL ,
  `calle_nro` VARCHAR(35) NOT NULL ,
  `comuna` VARCHAR(35) NOT NULL ,
  `region` VARCHAR(35) NOT NULL ,
  `fecha_contrato` DATE NOT NULL ,
  `tipo_empleado` ENUM('a','v','j') NOT NULL ,
  `rut_a_fk` INT(8) NULL ,
  
  PRIMARY KEY (`rut_e`) ,
  INDEX `rut_a_fk` (`rut_a_fk` ASC) ,
  CONSTRAINT `rut_a_fk`
    FOREIGN KEY (`rut_a_fk` )
    REFERENCES `omohr4`.`administrador` (`rut_a` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)
  
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `omohr4`.`vendedor`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `omohr4`.`vendedor` (
  `rut_v` INT(8) NOT NULL ,
  PRIMARY KEY (`rut_v`) ,
  INDEX `rut_v` (`rut_v` ASC) ,
  CONSTRAINT `rut_v`
    FOREIGN KEY (`rut_v` )
    REFERENCES `omohr4`.`empleado` (`rut_e` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `omohr4`.`entrega`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `omohr4`.`entrega` (
  `id_entrega` INT NOT NULL AUTO_INCREMENT ,
  `rut_c_fk2` INT(9) NOT NULL ,
  `rut_v_fk` INT(8) NOT NULL ,
  `fecha` DATE NOT NULL ,
  PRIMARY KEY (`id_entrega`) ,
  INDEX `rut_c_fk2` (`rut_c_fk2` ASC) ,
    CONSTRAINT `rut_c_fk2`
    FOREIGN KEY (`rut_c_fk2` )
    REFERENCES `omohr4`.`cliente` (`rut_c` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `rut_v_fk`
    FOREIGN KEY (`rut_v_fk` )
    REFERENCES `omohr4`.`vendedor` (`rut_v` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `omohr4`.`junior`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `omohr4`.`junior` (
  `rut_j` INT(8) NOT NULL ,
  `cargo_mantencion` VARCHAR(35) NOT NULL ,
  PRIMARY KEY (`rut_j`) ,
  INDEX `rut_j` (`rut_j` ASC) ,
  CONSTRAINT `rut_j`
    FOREIGN KEY (`rut_j` )
    REFERENCES `omohr4`.`empleado` (`rut_e` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
Ya tenía un tema con este error, pero empezé enviando otra pregunta y antes de desviar el tema del topic, preferí empezar otro.

Saludos.

Última edición por oliverm; 10/06/2012 a las 18:26 Razón: Dejar más claro el contenido.
  #2 (permalink)  
Antiguo 11/06/2012, 05:19
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: Datos de formulario no llegan a BBDD por problema con clave foranea

Por lo que creo que estas haciendo es que estas insertando en una sola tabla cuando tener claves foraneas, por lo que estas obligado a insertar en la otra tabla que tiene la relación porque sino te quedaria inconcistente la base e innoDB se encarga de que asi no sea.

Fijate bien a la hora de hacer el insert de que tambien insertes en la tabla que tiene relacion.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com

Etiquetas: bbdd, clave, formulario, html, llegan, mysql, registro, sql, foreignkey
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:01.