Foros del Web » Programando para Internet » PHP »

Problema con INSERT INTO desde formulario PHP

Estas en el tema de Problema con INSERT INTO desde formulario PHP en el foro de PHP en Foros del Web. Hola, quisiera saber si el hecho de tener una tabla en mysql con 1 PK formada por los 4 campos de la tabla, tal que ...
  #1 (permalink)  
Antiguo 18/08/2005, 03:27
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 12 años, 4 meses
Puntos: 0
Problema con INSERT INTO desde formulario PHP

Hola, quisiera saber si el hecho de tener una tabla en mysql con 1 PK formada por los 4 campos de la tabla, tal que así:

pactor_id PK smallint(4) unsigned - a su vez FK
diag_date PK date
sip PK varchar(8)
dis_name PK varchar(60) - estas tres ultimas son FK, las 3 juntas

puede afectar al modo que inserta PHP los campos en la tabla MySQL??? Es que en mi codigo php del formulario, inserta sin problemas los datos de otras tablas excepto las que estan compuestas por una PK formada por todos los campos de la tabla (ya que son relaciones n:n). En el caso de estas tablas, no devuelve ningun error pero los datos no estan insertados en MySQL. Todos estos campos ya se encuentran insertados en sus respectivas tablas, por lo que el problema de que no se creasen las relaciones lo descarto

El código php sería el siguiente (el mismo para las 4 tablas n:n cambiando los campos):


if ($pactor_id AND $diag_date AND $sip AND $dis_name) {
$sql_selra = "SELECT pactor_id,diag_date,sip,dis_name FROM relation_a WHERE pactor_id='$pactor_id' AND diag_date='$diag_date' AND sip='$sip' AND dis_name='$dis_name'";
if (! $result_ra = mysql_query($sql_selra, $conn)) {
stderr ("Error querying: $sql_selra");
}
$rows = mysql_num_rows($result_ra);
if ($rows==0) {
$sql_rela = "INSERT INTO relation_a (pactor_id, diag_date, sip, dis_name)
VALUES ('$pactor_id', '$diag_date', '$sip', '$dis_name')";
if (! $query = mysql_query($sql_rela, $conn)) {
stderr ("Error querying: $sql_rela");
}
if ($sql_rela) { echo("SQL REL A: $sql_rela");} //borrar (prueba para ver errores)
}
else {
stderr ("Relation a is already in the database");
}
}
else {
print "<br><font style='color: black'>";
printf ("Missing Information, cannot insert Relation a\n");
print "</font></br>";
}


Agradecería su ayuda. Muchas gracias.
  #2 (permalink)  
Antiguo 18/08/2005, 06:59
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 15 años, 5 meses
Puntos: 1
No se si será el problema en si pero creo q hay un error en la consulta sql...

declaras pactor como smallint pero lo pones entre comillas..indicandole asi q es texto y no numerico...

debería quedar así

$sql_rela = "INSERT INTO relation_a (pactor_id, diag_date, sip, dis_name)
VALUES ($pactor_id, '$diag_date', '$sip', '$dis_name')";

prueba a ver si es eso...

salu2.
  #3 (permalink)  
Antiguo 19/08/2005, 02:38
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 12 años, 4 meses
Puntos: 0
Hola! he probado lo que dices y ocurre lo mismo. He añadido esto al inicio del codigo:

error_reporting(E_ALL);

y el error que aparece es:

Error querying: INSERT INTO relation_a (pactor_id, diag_date, sip, dis_name) VALUES (1, '2005/08/19', '1', '1')

Previamente, en el mismo formulario, se insertan datos en la tabla en la que esta pactor_id (con el mismo tipo de dato, smallint) sin problemas, con el mismo codigo (cambiando los campos y con comillas). Lo que hago es un COMMIT WORK una vez insertadas las tablas sin FK y luego otro BEGIN WORK-COMMIT WORK con las relaciones n:n.

He revisado el codigo un montón de veces y sigo sin encontrar el fallo. Al insertar directamente en la bd por comandos, la misma sentencia INSERT no da ningun tipo de error...

Gracias por la ayuda.
  #4 (permalink)  
Antiguo 19/08/2005, 06:54
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 15 años, 5 meses
Puntos: 1
Pon un mysql_error($link)

a ver si te da más información.

Salu2.
  #5 (permalink)  
Antiguo 19/08/2005, 07:21
 
Fecha de Ingreso: julio-2005
Mensajes: 43
Antigüedad: 12 años, 4 meses
Puntos: 0
Pon este tal cual a ver si te lo coje

$sql_rela = 'INSERT INTO `relation_a` ( `pactor_id` , `diag_date` , `sip` , `dis_name` ) '
. ' VALUES ( \'$pactor_id\', \'$diag_date\', \'$sip\', \'$dis_name\' );'
. ' ';

Espero que te sirva
  #6 (permalink)  
Antiguo 29/08/2005, 04:23
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 12 años, 4 meses
Puntos: 0
Vuelta de vacaciones he vuelto a probar el codigo, he puesto mysql_error(link) al principio del codigo y me da esto:

Warning: mysql_error(): supplied argument is not a valid MySQL-Link resource in /usr/local/apache/htdocs/www/scripts/cinfform2.php on line 6

donde la linea 6 es donde pone:

mysql_error(link);

También he probado poner la sentencia como decis arriba,

$sql_rela = 'INSERT INTO `relation_a` ( `pactor_id` , `diag_date` , `sip` , `dis_name` ) '
. ' VALUES ( \'$pactor_id\', \'$diag_date\', \'$sip\', \'$dis_name\' );'
. ' ';

y nada, también he probado a poner una sentencia INSERT INTO...SELECT...FROM...WHERE y tampoco se introducen los datos en las tablas de mysql que son relaciones n:n
  #7 (permalink)  
Antiguo 29/08/2005, 07:34
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 15 años, 5 meses
Puntos: 1
Antes de leerme toda la parrafada..decirte q hay un error...

el mysql_error() se usa después de hacer una consulta a la bse de datos....

osease depues del insert pones

Código PHP:
echo mysql_error($link); 
ah y cuando hagas la conexion a la base de datos...necesitas hacer...

Código PHP:
$link mysql_connect() 
prueba y nos cuentas...

Salu2.
  #8 (permalink)  
Antiguo 29/08/2005, 08:30
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 12 años, 4 meses
Puntos: 0
a ver si lo he entendido bien... primero pongo la conexión en una variable, y luego veo el error despues del query del insert con,

echo mysql_error($link); (siendo $link la variable de conexion)

...pero este echo no me dara el error de la conexión unicamente? o aparece todos los errores que hayan hasta que se cierra la conexion?

saludos y gracias. mañana lo pruebo y comento los resultados.
  #9 (permalink)  
Antiguo 29/08/2005, 10:12
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 15 años, 5 meses
Puntos: 1
Al igualar a link...link contendrá el identificador de laconexion...

y el echo del mysql_error despues de cualqueir consulta contendrá el error q deveulva mysql si lo hay después de dicha consulta con dicho identificador de conexión.

Solo devolverá el último error devuelto por la última consulta hecha...antes de llamar a mysql_error().

Osease el link sirve para decirle a q conexion corresponde la consulta q queires conocer dicho error.

Espero q te haya quedado claro.

Salu2.
  #10 (permalink)  
Antiguo 30/08/2005, 02:26
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 12 años, 4 meses
Puntos: 0
Buenos días, he probado con mysql_error() y me aparecen los siguientes errores:

Cannot add or update a child row: a foreign key constraint fails
Error querying: INSERT INTO `relation_a` (`protectorfactor_id`, `diagnosis_date`, `sip`, `disease_name`)VALUES ('$protectorfactor_id', '$diagnosis_date', '$sip', '$disease_name');
Cannot add or update a child row: a foreign key constraint fails
Error querying: INSERT INTO `relation_b` (`riskfactor_id`, `diagnosis_date`, `sip`, `disease_name`)VALUES ('$riskfactor_id', '$diagnosis_date', '$sip', '$disease_name');
Cannot add or update a child row: a foreign key constraint fails
Error querying: INSERT INTO `relation_c` (`sign_id`, `diagnosis_date`, `sip`, `disease_name`)VALUES ('$sign_id', '$diagnosis_date', '$sip', '$disease_name');
Cannot add or update a child row: a foreign key constraint fails
Error querying: INSERT INTO `relation_d` (`symptom_id`, `diagnosis_date`, `sip`, `disease_name`)VALUES ('$symptom_id', '$diagnosis_date', '$sip', '$disease_name');

El usuario que realiza la conexión tiene permisos totales en mysql, es igual que el root. No entiendo que es lo que falla. Agradezco su ayuda.

Un saludo
  #11 (permalink)  
Antiguo 30/08/2005, 07:04
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 15 años, 5 meses
Puntos: 1
Pues ese error queire decir q estás haciendo un insert con datos de la llave primaria q ya exsiten o son nulos.

Lo más probable es q estes insertando valores nulos.

Revisa si el valor de las variables q insertas es el correcto.

Salu2.
  #12 (permalink)  
Antiguo 30/08/2005, 10:38
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 12 años, 4 meses
Puntos: 0
El problema esta en el insert de las tablas que son relaciones entre otras entidades. El script recoge datos de un formulario para varias tablas, y algunas de ellas (todos sus campos son PK de tablas rellenadas previamente sin problemas con el mismo formulario) son las que me dan problemas. Todas tablas de tipo InnoDB. Entonces, lo que creo que ocurre, es que al insertar información de otras tablas (insertadas correctamente con el mismo formulario) en tablas que las relacionan, parece que no estan insertadas y no las tomas para las tablas de las relaciones. Bueno, no se si me explico... es como si una tabla A tiene PK=a y una tabla B tiene PK=b, entonces yo tengo otra tabla C con PK=a y PK=b. Lo que ocurre es que A y B estan correctamente insertadas pero C no.

He intentado poner lo siguiente antes de la inserción de tablas que contengan algún tipo de información que luego requerirán otras tablas:

//comenzamos las ordenes a mysql: BEGIN WORK

$BG_W = "BEGIN WORK";

$CM_W = "COMMIT WORK";

if (! $BG = mysql_query($BG_W, $conn)) {

echo mysql_error($conn);

stderr ("Error querying: $BG_W");

}
//COMMIT!!!! BEGIN!!!!

if (! $CM = mysql_query($CM_W, $conn)) {

echo mysql_error($conn);

stderr ("Error querying: $CM_W");

}

if (! $BG = mysql_query($BG_W, $conn)) {

echo mysql_error($conn);

stderr ("Error querying: $BG_W");

}
etc...

Pero me aparece el siguiente error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WORK' at line 1
Error querying: COMMIT WORK

Que debo modificar? Como puedo solucionarlo? Muchas gracias por la ayuda.

Un saludo.
  #13 (permalink)  
Antiguo 30/08/2005, 14:28
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 15 años, 5 meses
Puntos: 1
Vamos a ver no entiendo mucho lo q dices pero bueno...

para empezar eso de commit work me parece q...en mysql no existe

se usan estas 3...

Código PHP:
mysql_query("BEGIN");

mysql_query("COMMIT");

mysql_query("ROLLBACK"); 
luego...sobre lo de las relaciones...basandome en elejemplo de la tabla A, B y C...

segun tu tienes rellenadas las tablas A y B pero no C.

y C tiene PKa y PKb...pues entonces cuandohagas un insert es obligatorio q estos dos valores se hayen en A y B.

Por el error que diria q cuando haces el insert en C con los valores correspondientes..estos no se hayan en A y B.

Simplemente coje el analizador de consultas de mysql y comprueba si tus inserts funcionan...

Salu2.
  #14 (permalink)  
Antiguo 31/08/2005, 02:16
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 12 años, 4 meses
Puntos: 0
Muchas gracias. He borrado WORK y me funcionan correctamente todas las inserciones en la base de datos. Muchas gracias por su ayuda.

Un saludo.
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 21:09.