epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Hola a todos otra vez :S

Tengo un formuario en PHP con Mysql, pero me sucede algo extraño... cuando lleno todos los campos me almacena todo sin problema, pero cuando lleno solamente los campos "requisitos" me arroja error:

Query Failed: Cannot add or update a child row: a foreign key constraint fails (`sanofi`.`educacion`, CONSTRAINT `educacion_ibfk_1` FOREIGN KEY (`rut`) REFERENCES `pacientes` (`rut`) ON DELETE CASCADE ON UPDATE CASCADE)


Tengo 4 Tablas:
1652987380515.png


El formulario es uno solo con todos esos campos y al final el botón "Guardar" ... si completo todo el formulario , almacena sin problema, pero si lleno por ejemplo los campos que son obligatorios, me arroja ese error.

Los INSERT que tengo en la parte superior son estos:

$pacientes = "INSERT INTO pacientes (rut, nombres, apellidos, f_nac, edad, estado_civil, genero, telefono1, telefono2, email1, email2, direccion, comuna, ciudad, region, tipo_prevision, ges, tipo_diabetes, f_ing_prog, contacto_emerg, telefono_emerg) VALUES ('$rut', '$nombres', '$apellidos', '$f_nac', '$edad', '$estado_civil', '$genero', '$telefono1', '$telefono2', '$email1', '$email2', '$direccion', '$comuna', '$ciudad', '$region', '$tipo_prevision', '$ges', '$tipo_diabetes', '$f_ing_prog', '$contacto_emerg', '$telefono_emerg')";

$resultado_pacientes = $mysqli->query($pacientes);

------------------------------------


$tratamiento = "INSERT INTO tratamiento (tipo_insulina, hora_insulina, dosis_insulina, f_ind_insulina, estatus_pcte, hipo_orales_act, hipo_utilizado_act, otra_insulina_act, insulina_uti_act, trat_inyectable_act, tratamiento_act, hipo_orales_ant, hipo_utilizado_ant, otra_insulina_ant, insulina_uti_ant, trat_inyectable_ant, tratamiento_ant, HBA1C, f_examen, med_tratante, tel_med, mail_med, cent_atencion, rut) VALUES ('$tipo_insulina', '$hora_insulina', '$dosis_insulina', '$f_ind_insulina', '$estatus_pcte', '$hipo_orales_act', '$hipo_utilizado_act', '$otra_insulina_act', '$insulina_uti_act', '$trat_inyectable_act', '$tratamiento_act', '$hipo_orales_ant', '$hipo_utilizado_ant', '$otra_insulina_ant', '$insulina_uti_ant', '$trat_inyectable_ant', '$tratamiento_ant', '$HBA1C', '$f_examen', '$med_tratante', '$tel_med', '$mail_med', '$cent_atencion', '$rut')";

$resultado_tratamiento = $mysqli->query($tratamiento);

------------------------------------

$educacion = "INSERT INTO educacion (ed_asignada, f_derivacion, f_educacion, mod_educacion, educado, cons_informado, obs_educacion, abandono_ing, f_aban_educacion, rut) VALUES ('$ed_asignada', '$f_derivacion', '$f_educacion', '$mod_educacion', '$educado', '$cons_informado', '$obs_educacion', '$abandono_ing', '$f_aban_educacion', '$rut')";

$resultado_educacion = $mysqli->query($educacion);

Estan bien hecho esos INSERT por separado o hay que hacerlo de otra forma? o quizás hay que poner algunos if entremedio para que vaya guardando por parte?? ya que da a entender como si guardara primero en la tabla "educación" y no en "paciente" ??
 

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Por lo que leo, el problema no es sintaxis sino más bien que estás guardando en una tabla "hijo" un valor que no existe en la tabla "padre". Por el error parei que el rut que estás intentando insertar en la tabla educación no existe en la tabla paciente.

¿Te es posible hacer la prueba con cada insert por separado? Por el siguiente orden:

paciente
tratatamiento
educacion

¿Y te es posible forzar que te muestre el valor del rut en pantalla para cada operación?
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
Los insert se ejecutan en ese mismo orden?

No es la pregunta directa pero ojo cuando tienes múltiples insert y ocurre un error un alguno de ellos, pq algunos insert si ocurrirán y otros no. A veces es necesario que "se inserte absolutamente todo, o no se inserte nada" y tu script no está tomando esa precaucion.
Googlea: start transaction.
 
Última modificación:
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Por lo que leo, el problema no es sintaxis sino más bien que estás guardando en una tabla "hijo" un valor que no existe en la tabla "padre". Por el error parei que el rut que estás intentando insertar en la tabla educación no existe en la tabla paciente.

¿Te es posible hacer la prueba con cada insert por separado? Por el siguiente orden:

paciente
tratatamiento
educacion

¿Y te es posible forzar que te muestre el valor del rut en pantalla para cada operación?

si, pienso que es ese mismo error, pero lo raro es que es un solo rut el que estoy ingresando en el campo rut del formulario y es el que se guarda en los 3 insert. Si lleno todos los campos guarda bien, es como si en algunos casos (por ejemplo si solo lleno los campos obligatorios) quisiera almacenar primero los datos en las tablas hijas en vez de la principal que es "pacientes".

Si hago esos insert directamente en mysql , en ese mismo orden funciona y guarda.

Si en PHP comento la parte del formulario de tratamiendo y educación y dejo solo la primera que es de "paciente" (que llena justamente la tabla paciente) y luego comento los 2 insert (tratamiento y educacion) y guardo me arroja esto:

Query Failed: Incorrect integer value: '' for column `prueba`.`pacientes`.`edad` at row 1

quizás cuando dejo las 3 tablas y solo lleno los campos obligatorios (edad no lo es) y aplico Guardar , no guarda paciente y trata de ejecutar el siguiente insert que es tratamiento y luego educación y reclama porque no existe el rut en la primera tabla. Aunque no se porque no reclama primero con la tabla "tratamiento" en el error:

Query Failed: Cannot add or update a child row: a foreign key constraint fails (`sanofi`.`educacion`, CONSTRAINT `educacion_ibfk_1` FOREIGN KEY (`rut`) REFERENCES `pacientes` (`rut`) ON DELETE CASCADE ON UPDATE CASCADE)
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Los insert se ejecutan en ese mismo orden?

No es la pregunta directa pero ojo cuando tienes múltiples insert y ocurre un error un alguno de ellos, pq algunos insert si ocurrirán y otros no. A veces es necesario que "se inserte absolutamente todo, o no se inserte nada" y tu script no está tomando esa precaucion.
Googlea: start transaction.

Sip, ese mismo orden.

creo que por ahi va el problema, pero no se porque no acepta algunos campos... lo detalle en el post de arriba
 
Upvote 0

alex_xp

Gold Member
Se incorporó
12 Octubre 2004
Mensajes
2.613
Me parece que tú problema ahí es que a la hora de hacer la ejecución desde el formulario hace la ejecución de los 3 insert en la misma llamada y después hace el commit lo que significa que cuando creas el RUT en la tabla este aún no está commiteado hace la inserción en las demás tablas y esta no encuentran la información de la tabla padre.

Creo que tú solución ahí es hacer una llamada un SP que haga esa pega
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
Intenta arreglar lo de la edad del paciente primero, pudiera ser la causa de que el paciente no se cree, y por ende no hay tal rut.

Posible causa: el número edad este pasando como string y no int.
Puedes usar is_int() para averiguarlo.
 
Última modificación:
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Intenta arreglar lo de la edad del paciente primero, pudiera ser la causa de que el paciente no se cree, y por ende no hay tal rut.

Posible causa: el número edad este pasando como string y no int.
Puedes usar is_int() para averiguarlo.

Lo que pasa es que lo dejo en blanco, cuando lo dejo en blanco al parecer esta el problema... porque si le pongo un numero pasa, pero me salta el mismo error pero para el campo telefono1.

En la BD estos campos estan "edad int(3)" y "telefono int(9)" ambos con la opción de "nulo si", si les pongo números no hay problema, pero si los dejo vació me tira ese error.

En PHP están como "type=number" y "type=tel"

<div class="form-group">
<label for="edad" class="col-sm-2 control-label">Edad</label>
<div class="col-sm-10">
<input type="number" maxlength="3" class="form-control" id="edad" name="edad" placeholder="Edad" >
</div>
</div>

<div class="form-group">
<label for="telefono1" class="col-sm-2 control-label">Teléfono Principal</label>
<div class="col-sm-10">
<input type="tel" maxlength="9" class="form-control" id="telefono1" name="telefono1" placeholder="987678771">
</div>
</div>


Estuve probando y al parecer ese es el problema de todo... que cuando dejo en blanco algo que sea "number" o "tel" me queda la escoba.
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
tengo que guardar un 0 en esos campos entonces por lo que lei... es asi?
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
Esto haria yo:
Revisar lo que estas mandando con php usando
Código:
var_dump($_POST);
y pegalo aca.

Query Failed: Incorrect integer value: '' me dice algo esta intentando insertar, pero me extraña dado que dices que es un campo vacio. Algo no calza aca.
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Esto haria yo:
Revisar lo que estas mandando con php usando
Código:
var_dump($_POST);
y pegalo aca.

Query Failed: Incorrect integer value: '' me dice algo esta intentando insertar, pero me extraña dado que dices que es un campo vacio. Algo no calza aca.

var_dump($_POST);

array(53) { ["rut"]=> string(10) "5566677788" ["nombres"]=> string(6) "qweqwe" ["apellidos"]=> string(6) "qweqwe" ["f_nac"]=> string(10) "2022-05-19" ["edad"]=> string(0) "" ["estado_civil"]=> string(9) "Soltero/a" ["genero"]=> string(1) "M" ["telefono1"]=> string(0) "" ["telefono2"]=> string(0) "" ["email1"]=> string(0) "" ["email2"]=> string(0) "" ["direccion"]=> string(0) "" ["comuna"]=> string(0) "" ["ciudad"]=> string(0) "" ["region"]=> string(0) "" ["tipo_prevision"]=> string(0) "" ["ges"]=> string(2) "Si" ["tipo_diabetes"]=> string(0) "" ["f_ing_prog"]=> string(10) "2022-05-18" ["contacto_emerg"]=> string(0) "" ["telefono_emerg"]=> string(0) "" ["tipo_insulina"]=> string(6) "Toujeo" ["hora_insulina"]=> string(2) "AM" ["dosis_insulina"]=> string(1) "2" ["f_ind_insulina"]=> string(10) "2022-05-19" ["estatus_pcte"]=> string(18) "Inicio de Insulina" ["hipo_orales_act"]=> string(2) "No" ["hipo_utilizado_act"]=> string(0) "" ["otra_insulina_act"]=> string(2) "No" ["insulina_uti_act"]=> string(0) "" ["trat_inyectable_act"]=> string(2) "No" ["tratamiento_act"]=> string(0) "" ["hipo_orales_ant"]=> string(2) "No" ["hipo_utilizado_ant"]=> string(0) "" ["otra_insulina_ant"]=> string(2) "No" ["insulina_uti_ant"]=> string(0) "" ["trat_inyectable_ant"]=> string(2) "No" ["tratamiento_ant"]=> string(0) "" ["HBA1C"]=> string(0) "" ["f_examen"]=> string(0) "" ["med_tratante"]=> string(6) "qweqwe" ["tel_med"]=> string(0) "" ["mail_med"]=> string(0) "" ["cent_atencion"]=> string(6) "qweqwe" ["ed_asignada"]=> string(20) "ÁNGELA PAVEZ CUADRA" ["f_derivacion"]=> string(10) "2022-05-19" ["f_educacion"]=> string(0) "" ["mod_educacion"]=> string(0) "" ["educado"]=> string(2) "No" ["cons_informado"]=> string(2) "No" ["obs_educacion"]=> string(0) "" ["abandono_ing"]=> string(2) "No" ["f_aban_educacion"]=> string(0) "" } Query Failed: Cannot add or update a child row: a foreign key constraint fails (`prueba`.`educacion`, CONSTRAINT `educacion_ibfk_1` FOREIGN KEY (`rut`) REFERENCES `pacientes` (`rut`) ON DELETE CASCADE ON UPDATE CASCADE)



print_r($_POST);

Array ( [rut] => 123231231 [nombres] => fdgdfgdg [apellidos] => dfgdfgd [f_nac] => 2022-05-19 [edad] => 44 [estado_civil] => Soltero/a [genero] => M [telefono1] => [telefono2] => [email1] => [email2] => [direccion] => [comuna] => [ciudad] => [region] => [tipo_prevision] => [ges] => Si [tipo_diabetes] => [f_ing_prog] => 2022-05-19 [contacto_emerg] => [telefono_emerg] => 12312321 [tipo_insulina] => Lantus [hora_insulina] => AM [dosis_insulina] => 2 [f_ind_insulina] => 2022-05-19 [estatus_pcte] => De Baja del Programa [hipo_orales_act] => No [hipo_utilizado_act] => [otra_insulina_act] => No [insulina_uti_act] => [trat_inyectable_act] => No [tratamiento_act] => [hipo_orales_ant] => No [hipo_utilizado_ant] => [otra_insulina_ant] => No [insulina_uti_ant] => [trat_inyectable_ant] => No [tratamiento_ant] => [HBA1C] => [f_examen] => [med_tratante] => asdasdasd [tel_med] => [mail_med] => [cent_atencion] => asdasdasd [ed_asignada] => CAROLYN ACUÑA CANTUARIAS [f_derivacion] => 2022-05-19 [f_educacion] => [mod_educacion] => [educado] => No [cons_informado] => No [obs_educacion] => [abandono_ing] => No [f_aban_educacion] => ) Query Failed: Cannot add or update a child row: a foreign key constraint fails (`prueba`.`educacion`, CONSTRAINT `educacion_ibfk_1` FOREIGN KEY (`rut`) REFERENCES `pacientes` (`rut`) ON DELETE CASCADE ON UPDATE CASCADE)
 
Última modificación:
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
Ya, diría yo que el problema va por que no puedes insertar strings vacíos como integer en tu tabla.

La solución fácil es que los valores vacíos sean null, intenta en mysql poner valor default como null en edad y las demás que sean tipo int. Creo que eso podría resultar. Si no te resulta asi, tambien lo puedes pasar como null en php, pero es mas trabajo.
 
Última modificación:
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Si intentas subir los datos desde phpmyadmin te pasa igual?

No, en phpmyadmin no sucede, deja guardan sin problema si esos campos no los mando, osea esta consulta por ejemplo la almacena sin problema:

INSERT INTO `pacientes`(`rut`, `nombres`, `apellidos`, `f_nac`, `genero`, `ges`, `f_ing_prog`) VALUES ('11000111-1','username','userlastname','1981/12/12','Si','2022/01/01')

En ella no envíe la edad ni los teléfonos y la almaceno de igual forma.

Ya, diría yo que el problema va por que no puedes insertar strings vacíos como integer en tu tabla.

La solución fácil es que los valores vacíos sean null, intenta en mysql poner valor default como null en edad y las demás que sean tipo int. Creo que eso podría resultar. Si no te resulta asi, tambien lo puedes pasar como null en php, pero es mas trabajo.
serian 2 opciones pasarla como NULL en PHP o en esos campos ingresar el 0... lo del cero me vale bien en este caso.
 
Upvote 0

K3rnelpanic

non serviam
Miembro del Equipo
MOD
Se incorporó
1 Octubre 2007
Mensajes
6.065
Agrégale un if a tu código que si el campo edad del formulario (o los camps que no se llenan y son integers) están vacios los deje como NULL.
También puedes hacerlo con NULLIF en la query SQL. Por ejemplo dentro de tu INSERT en SQL:
SQL:
$pacientes = "INSERT INTO pacientes (rut, nombres, apellidos, f_nac, edad, estado_civil, genero, telefono1, telefono2, email1, email2, direccion, comuna, ciudad, region, tipo_prevision, ges, tipo_diabetes, f_ing_prog, contacto_emerg, telefono_emerg) VALUES ('$rut', '$nombres', '$apellidos', '$f_nac', NULLIF('$edad',''), '$estado_civil', '$genero', '$telefono1', '$telefono2', '$email1', '$email2', '$direccion', '$comuna', '$ciudad', '$region', '$tipo_prevision', '$ges', '$tipo_diabetes', '$f_ing_prog', '$contacto_emerg', '$telefono_emerg')";
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
No, en phpmyadmin no sucede, deja guardan sin problema si esos campos no los mando, osea esta consulta por ejemplo la almacena sin problema:

INSERT INTO `pacientes`(`rut`, `nombres`, `apellidos`, `f_nac`, `genero`, `ges`, `f_ing_prog`) VALUES ('11000111-1','username','userlastname','1981/12/12','Si','2022/01/01')

En ella no envíe la edad ni los teléfonos y la almaceno de igual forma.
Mucho ojo con una sutileza. No es el mismo insert.
El de phpmyadmin no intenta insertar edad, en cambio en tu script, intenta insertar un string vacio en edad.
El equivalente de tu script seria este:
Código:
INSERT INTO `pacientes`(`rut`, `nombres`, `apellidos`, `f_nac`, `genero`, `ges`, `f_ing_prog`, `edad`) VALUES ('11000111-1','username','userlastname','1981/12/12','Si','2022/01/01','')
Que pudiera no insertarse y salir el error.

serian 2 opciones pasarla como NULL en PHP o en esos campos ingresar el 0... lo del cero me vale bien en este caso.
Ten cuidado con usar el 0. Bajo ciertas condiciones es un problema, pq el numero 0 si existe como numero, en cambio NULL no es un numero. Esto puede traer problemas cuando quisieras hacer consultas del estilo: "tiene un numero registrado?" Como 0 si es un numero, y existe dentro de la tabla, respondera TRUE o 0 en verz de FALSE
 
Última modificación:
Upvote 0

alex_xp

Gold Member
Se incorporó
12 Octubre 2004
Mensajes
2.613
Ten cuidado con usar el 0. Bajo ciertas condiciones es un problema, pq el numero 0 si existe como numero, en cambio NULL no es un numero. Esto puede traer problemas cuando quisieras hacer consultas del estilo: "tiene un numero registrado?" Como 0 si es un numero, y existe dentro de la tabla, respondera TRUE o 0 en verz de FALSE
Asi es hay una diferencia entre tener cero, null o vacío
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Mucho ojo con una sutileza. No es el mismo insert.
El de phpmyadmin no intenta insertar edad, en cambio en tu script, intenta insertar un string vacio en edad.
El equivalente de tu script seria este:
Código:
INSERT INTO `pacientes`(`rut`, `nombres`, `apellidos`, `f_nac`, `genero`, `ges`, `f_ing_prog`, `edad`) VALUES ('11000111-1','username','userlastname','1981/12/12','Si','2022/01/01','')
Que pudiera no insertarse y salir el error.


Ten cuidado con usar el 0. Bajo ciertas condiciones es un problema, pq el numero 0 si existe como numero, en cambio NULL no es un numero. Esto puede traer problemas cuando quisieras hacer consultas del estilo: "tiene un numero registrado?" Como 0 si es un numero, y existe dentro de la tabla, respondera TRUE o 0 en verz de FALSE

pero en realidad los registros los descargan en un excel... en definitiva es algo pequeño.
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
lo tire a un docker el sistemita este y me arroja esto:

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/index.php:1) in /var/www/html/index.php on line 29

Warning
: session_start(): Cannot start session when headers already sent in /var/www/html/index.php on line 31

si lo dejo en un server normal , no tire ningun warning.
 
Upvote 0
Subir