Vie Oct 19, 2007 10:08 am
|
 |
hugo11ab
Perlero Nuevo

|
Registrado: 22 Jul 2006
Mensajes: 31
|
|
| Problemas con un cgi |
|
|
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:
| Perl: | ($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); |
¿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. |
|
|
|

Vie Oct 19, 2007 10:47 am
|
 |
hugo11ab
Perlero Nuevo

|
Registrado: 22 Jul 2006
Mensajes: 31
|
|
| Problemas con un script |
|
|
U otra. No sé si el enlace tenga algo que ver.
Aquí lo pongo. |
|

Vie Oct 19, 2007 12:11 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4101
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Vie Oct 19, 2007 1:04 pm
|
 |
hugo11ab
Perlero Nuevo

|
Registrado: 22 Jul 2006
Mensajes: 31
|
|
|
|
|
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:
| Perl: | ($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;
} |
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. |
|

Vie Oct 19, 2007 3:00 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4101
Ubicación: Valladolid, España
|
|
|
|
|
| Lo de la cosa rara es porque no había visto nunca antes lo del bucle while vacío. |
|
Vie Oct 19, 2007 3:35 pm
|
 |
hugo11ab
Perlero Nuevo

|
Registrado: 22 Jul 2006
Mensajes: 31
|
|
|
|
|
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. |
|

Sab Oct 20, 2007 8:30 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
| hugo11ab escribió: | | 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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|