• Publicidad

Problemas con un cgi

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problemas con un cgi

Notapor hugo11ab » 2007-10-19 11:08 @505

Que tal, espero y me puedan ayudar con el problema que se me presentó.

Estoy haciendo un cgi que cada vez que se hace una solicitud manda un correo de activación (esto ya lo tengo). El problema que tengo es que cuando desde el correo le doy click al enlace el cual me direcciona a otro script de Perl, al momento de hacer el insert lo hace dos veces; ya verifiqué que el script solamente se ejecuta una sola vez, pero cuando veo el resultado en la base de datos, resulta que el registro está duplicado.

Entonces tengo otra aplicación (pero no desde el correo) donde también se pueden activar estas solicitudes y ahí no tengo ningún problema y prácticamente es el mismo código. Solamente desde el correo es cuando me duplica la información.

Aquí les pongo el código que estoy ocupando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($rs,$fetch) = record(db=>"$FORM{db}",tabla=>"modificado",condicion=>"WHERE clvproyecto='$FORM{programa_quitar}' and clvuaa='$FORM{clvuaa}' a
nd anio=$FORM{anioconsulta} and tipo='GL' and tipo_reg='R'"
,campos=>"max(control)",alias=>"maximo",visible=>"no");
 while($fetch->()) {}
 $$rs{maximo}+=1;

 $sql="INSERT INTO modificado (clvuaa,clvproyecto,clvpartida,tipo,reduccion,anio,fech_mov,descripcion,control,ip,usuario,tipo_reg,fech_aplicacion) VALUES ('$FORM{clvuaa}','$FORM{programa_quitar}',$FORM{partida_quitar},'GL','$importes',$FORM{anioconsulta},'$fecha','APLICADO POR EL SISTEMA',$$rs{maximo},'$ip','$FORM{usr}','R','$FORM{fech_aplicacion}');";
 &ejecuta("$FORM{db}",$sql);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Tienen alguna idea de por qué está pasando esto si solamente estoy ejecutando un solo INSERT y no tengo ningún for ni nada por el estilo?

De antemano muchas gracias.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Publicidad

Problemas con un script

Notapor hugo11ab » 2007-10-19 11:47 @533

U otra. No sé si el enlace tenga algo que ver.

Aquí lo pongo.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Notapor explorer » 2007-10-19 13:11 @591

Si ejecutas el cgi directamente (en línea de comandos, por ejemplo), ¿también ocurre el fallo?

Esto lo he visto hace años y el problema estaba en el propio usuario, que en vez de hacer un click, siempre hacía un doble click, por lo que explorer mandaba dos peticiones iguales. Más tarde tuvimos el mismo problema porque un troyano se le quedó pegado al explorer y provocaba el mismo efecto. Y la tercera fue un virus que modificó el tiempo predefinido de un doble clisk en el sistema.

Al final, todo eran problemas del sistema del usuario.

La solución: no usar INSERT sino UPDATES (con los correspondientes campos clave para evitar duplicados).

Pero antes... debes repasar los logs de actividad del servidor web y verificar que efectivamente solo hay una petición. Si es así, el problema está en el código. Y en el código que pones, aparte de alguna cosa rara, no veo nada erróneo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor hugo11ab » 2007-10-19 14:04 @628

Agredezco tu pronta respuesta Explorer.

Con lo referente al doble click cuando está solicitud se activa, al momento de volverla activar ya no me va a dejar porque ya está activa. Al parecer se ejecuta 2 veces porque puse esta condición antes de hacer el INSERT en la cual estoy verificando que si ya está activada que me mande el mensaje:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($rs,$fetch) = record(db=>"$FORM{db}",tabla=>"solicitudes_ejercido",condicion=>"WHERE  anio=$FORM{anioconsulta} and solicitud=$FORM{solicitud
} and tipo='$FORM{tipo}'"
,campos=>"aplicada",visible=>"no");
 while($fetch->()) { }
 if ($$rs{aplicada}) {
  &msj("Error ...","<font class=\"sBL2b\">No se puede aplicar esta solicitud, por que la misma ya fué ejercida con anterioridad .</font>","<button name=\"opc\" class = \"Bsbttn\" type=\"button\" value=\"Cerrar\" onClick=\"window.close();\"> Cerrar </button>");
  exit;
 }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo raro es que con esto hace el INSERT correctamente pero cuando se vuelve a ejecutar por segunda ocasión, el mensaje no se muestra en pantalla, esto se me hace muy raro, porque ya había hecho esto antes y no se me había presentado este problema.

Con respecto a usar UPDATES en vez de INSERT es que las solicitudes se van ingresando conforme la van autorizando y no siempre las autorizan el mismo día.

¿A que te refieres con alguna cosa rara?

Pero es muy raro esto, porque antes de que pusiera la condición al momento de que yo pintaba los INSERT en pantalla siempre me mostraba el primer INSERT y no el segundo.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Notapor explorer » 2007-10-19 16:00 @708

Lo de la cosa rara es porque no había visto nunca antes lo del bucle while vacío.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor hugo11ab » 2007-10-19 16:35 @732

Agradezco mucho que me hayas apoyado a encontrar la solución a mi problema.

Con respecto a lo del while vacío, es porque en el query que le precede al while siempre me va a traer un solo registro y es por eso que va vacío, así que mi variable $$rs{aplicada} va a contener el valor que se haya barrido en el while, pero también esta variable puede ir dentro del while y me arrojaría el mismo resultado.

Agradezco mucho que me hayas ayudado. Saludos.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Notapor kidd » 2007-10-20 09:30 @437

hugo11ab escribiste:Con respecto a lo del while vacío, es porque en el query que le precede al while siempre me va a traer un solo registro y es por eso que va vacío


No siempre es lo más recomendable confiar completamente en lo que debería de pasar, especialmente cuando sacas la información de medios externos, mínimo te recomendaría pongas un LIMIT 1.

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado