«PHPando»

Para jugar un poco con php primero hice una especie de contador en mi página web.

Cree una base de datos, añadí una tabla con varios campos: mes de la visita, año de la visita, número de visitas y página visitada. Todo sin problemas y está más o menos funcionando en mi sitio.

Ahora me he puesto a hacer algo más complejo. Estoy poniendo la posibilidad de que la gente añada comentarios a los artículos. Todo está funcionando bien… salvo una pequeño detalle que no consigo resolver.

Si una vez que alguien ha insertado un comentario, pulsa «recargar» en el navegador, vuelve a insetarse el mismo comentario. Aunque el formulario esté vacío, se ve que al recargar todavía se acuerda del contenido de $_POST[] y vuelve a insetar. Así que aquí ando, peleándome con varias posibilidades:

  • Detectar si es recarga de página para no hacer la inserción del comentario.
  • Viendo si hay forma de vaciar $_POST[] después de haber hecho la inserción
  • No me gustaría, pero quizás tenga que hacer una página intermedia que haga la inserción y luego redirija con header() a la original.
  • Y me gustaría todavía menos abrir una sesion con session_start() o similar. Creo que no puedo usar las variables $_SESSION[] si no abro una sesión y la sesión debe abrirse justo antes de enviar nada al navegador, por lo que tendría que volver a tocar TODAS las páginas (ya las cambié de html a php con hoja de estilo). No se me ocurrió hacer un <?php cabecera(); … al principio de todas

A ver si esta tarde lo acabo…

Esta entrada fue publicada en php, web. Guarda el enlace permanente.

5 respuestas a «PHPando»

  1. vilches dijo:

    Prueba a acabar la petición con un
    Header («location: http://blog.chuidang.com«.$PHP_SELF) ;

    o Header («location http://loquesea«);

    Con esto acabas la petición del post con un envío al navegador para que se redirija a la pagina del header. En realidad, el envío del formulario se convierte en 2 peticiones de manera transparente para el usuario:

    1. El usuario hace post con el comentario (petición 1)
    2. Servidor recoge parametros, graba en base de datos y envia Header location
    3. El navegador del usuario recibe el header y solicita dicha página al servidor (petición 2)
    4. Servidor recibe petición y envía el contenido de la página solicitada.

    Si el usuario pulsa F5 y recarga, solo repite la última petición…
    Espero que te sirva! 🙂

  2. Vallekano dijo:

    Buenas,

    Yo para hacer eso, que es un proceso muy común siempre llamo a una página «motor» que es la que me hace la inserción/actualización/borrado, y luego redirijo al origen. Así te evitas ese problema.

    No me parece una opción fea…. no se porque dices que no te gustaría.

    Un saludo.

  3. Chuidiang dijo:

    Muchas gracias a ambos 🙂 . Lo del header() es la opción que más me convence, aunque tengo que hacer la página intermedia, puesto que el header() debe hacerse antes de enviar nada al navegador y donde está el código ya se han enviado cosas.

    Lo de no meter la página intermedia no es por nada. Como dicen por ahí «si hay que hacerla, se hace, pero hacerla por hacerla, es tontería» 😀 . Simplemente saber si era posible no meterla.

    Sed buenos.

  4. Untergang dijo:

    Yo lo que hago para evitarme la página intermedia es verificar si el registro ya existe como tal en la BD… mis aplicaciones no son muy pesadas, así que el motor de MySQL no se queja mucho, por lo que puede ser una opción.

    Ah, por cierto… antes verificaba si era atrás o recarga viendo el referer… pero la verdad no recuerdo por que deje de usarlo (tenía algo en contra, pero no recuerdo que). :p

  5. Chuidiang dijo:

    He estado investigando y hay más opciones.

    Una es comprobar si hay un dato en $_POST y hacer la inserción al principio de la misma página y luego redirigirla a sí misma con header(). En esta segunda ocasión, como no hay dato, no se hace la inserción ni el header() y se muestra la página normal.

    Otra opción más en con una variable de sesión que indique si se ha insertado o no.

    De todas formas descarté ambas porque tanto abrir la sesión como el header() deben hacerse al principio del todo, antes del <head>. Eso me obligaba a rehacer todas mis páginas, puesto que no tengo código php antes del head.

    Se bueno.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.