El problema que plantean más bien se suele resolver NO dejando el proceso en el script siguiente que recibie los datos del formulario y que envia datos a este en metodo POST.
formulario.php -> procesa.php -> resultados.php
Formulario.php tendría nuestro formulario, .. procesa.php el código de validación etc .. y de ahí redireccionar a los resultados.
Esto es válido para un sistema de lógin (en la validación) .. esos procesos que envian un e-mail o meten datos en una BBDD .. etc.
El caso es NO hacer cosas como:
formulario.php
el formulario > "action" a resultados.php
resultados.php
Código PHP:
<?
echo $_POST['alguna_variable'];
// enviamos un e-mail po rejemplo .. u otro proceso ...
mail( ...);
if (todo OK){
// presentamos un mensaje de exito.
} else{
// presentamos un mensaje de error.
}
?>
Si en nuestro "resultados.php" recargamos la página .. ahí veremos como se ejecuta nuevamente el proceso de esta, el navegador intentará enviar nuevamente las variables que tenemos en POST y el proceso se ejecutará tantas veces como nos cansemos de recargar la página.
Es importante "redireccionar" .. así "perdemos" todo lo que nuestro cliente almacenó en POST.
formulario.php
el formulario > "action" a procesa.php
procesa.php
Código PHP:
<?
echo $_POST['alguna_variable'];
// enviamos un e-mail po rejemplo .. u otro proceso ...
mail( ...);
if (todo OK){
// Redireccionamos con un código de mensaje para procesarlo donde llegamos.
header ("Location: resultados.php?cod=exito");
exit;
} else{
// Redireccionamos con un código de mensaje para procesarlo donde llegamos.
header ("Location: resultados.php?cod=error");
exit;
}
?>
resultados.php
Código PHP:
<?
echo "El mensaje fué: ".$_GET['cod'];
?>
En este caso, nuestro "proceso.php" sea como sea su resultado, redirecciona hacia una página anexa antes de que el "HTML" pueda llegar a esta pues se hace por cabeceras HTTP. Si recargamos la página .. recargamos la del mensaje de error/exito y no la que realiza el proceso.
Acabo de exponer el ejemplo usando "tres" scripts .. esto no quiere decir que todo no se pueda hacer en un mismo -script- eso sí, tratado cada "fase" del mismo como un proceso individual recargando vía cabeceras HTTP ante cada "acción" a realizar: ver formulario, procesar y ver mensajes de error/exito.
Por otro lado ....
Creo que con cabeceras tipo "Private" además de las de "nocache" se solventa también el problema. No obstante este problema con este procedimento se soluciona de raiz.
Un saludo,