25 de Agosto, 2004

Errores procesando formularios

El principal enemigo del desarrollador es el usuario de sus productos, siempre.

Da igual que no tenga sentido realizar una acción, y probablemente nosotros nunca lo haríamos, está demostrado que el usuario es una criatura que escapa a toda lógica :).

Concretamente hablando de aplicaciones basadas en web, nos encontramos que con frecuencia es necesario recoger datos empleando formularios. Esos datos recogidos son procesados para el funcionamiento de la aplicación.

Proceso de toma de datos
Proceso de toma de datos

Una vez que el usuario tiene su respuesta, continuará con la aplicación, en muchos casos de forma dependiente de la información recibida del servidor.

Pongamos por ejemplo que dejamos un comentario en una bitácora. En ese caso, después de enviar nuestro texto empleando el formulario, puede que queramos ver si alguien ha comentado algo mientras escribíamos (suena tonto, pero no sé como piensa un usuario :P). Lo más fácil: recargar la página.

¡Cuidadin!
Advertencia de Mozilla

Entonces nuestro navegador nos avisa de que es necesario reenviar datos para recargar esa página. Admito que el texto que muestra Mozilla es muy claro, no se si otros navegadores serán tan explícitos.

¿La reacción habitual del usuario? Aceptar. Siempre es aceptar, dan igual las consecuencias (nadie va a leer el texto del diálogo a fin de cuentas).

Y el resultado puede ser un comentario duplicado. En este caso no es nada demasiado grave, aunque en aplicaciones más delicadas sí puede ser un verdadero problema.

Aunque resulte difícil de creer, esto pasa con mucha frecuencia. Es cierto que hay aplicaciones y aplicaciones, y que en determinados casos la lógica del proceso que se está llevando a cabo minimiza que el usuario muñón recargue la página y haga caso omiso de la advertencia del diálogo.

La solución es sencilla, aunque no siempre se puede poner en práctica. En lugar de dar la respuesta al proceso en la misma página que se encarga de tratar la información recogida del formulario, se hace una redirección a una página distinta habilitada para tal efecto.

Proceso con redirección
Proceso con redirección

De esta forma la página que procesa los datos (comenta.php?a=new en el ejemplo) no tiene ninguna salida si no hay errores en el proceso. En caso de haberlos no habrá redirección para facilitar al usuario que vuelva atrás y corrija.

Cuando el comentario se almacena en la base de datos, entonces se muestra la página encargada de dar el resultado (comenta.php en el ejemplo).

Así conseguimos que el envío de datos que nos produciría el error al recargar (y reenviar en consecuencia) se hace hacia comenta.php?a=new, y no hacia comenta.php, que es la página que ve el usuario al final y que puede recargar las veces que desee.

¿Cuándo no podremos hacer esto? En los casos en los que el proceso se realiza a medio enviar la respuesta. Puede ser una condición de diseño, y aun así, si la lógica de la aplicación puede conllevar una recarga peligrosa, tendremos que evitar estas situaciones en la medida de lo posible. Será más fácil que enseñar a leer al usuario los diálogos de advertencia de su navegador.

Anotación por Juan J. Martínez.

Hay 3 comentarios

Gravatar

Justo eso es lo que me pasa a mí con los comentarios... a que lo arreglo ahora? xDDDD

por Chavalina, en 2004-08-25 22:17:13

Gravatar

Yo en ese tipo de consultas hago como dices, por ejemplo, en los comentarios de mi blog, el comentario se envía al "comments.php", que lo guarda y redirige al permalink de nuevo (que se puede recargar si problema).

por Toad, en 2004-08-26 11:45:43

Gravatar

La sugerencia me parece buenna pero me gustaria saber si puedes poner un codigo de ejemplo ya que tengo algunas dudas GRACIAS

por un visitante, en 2004-09-22 21:49:21

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.