Diferenciar refresh (f5) de post(submit)
Salve salve!
Este é um problema que assombra diversos desenvolvedores.
Temos um formulário, que será submetido para mesma página, em que ele se encontra:
<form action="" method="post">
<input type="text" name="ae" value="ae" />
<input type="submit" name="enviar" value="enviar" />
</form>
Até ai tudo bem. Se pudessemos redirecionar o usuário para outra página, não teríamos o ‘problema do F5’.
Mas se não pudermos fazer isso, o form está na index.php, essa mesma processa os dados enviados, e ela mesma vai mostrar o sucesso ou falha da requisição.
Logo, precisamos notar que não adianta apenas tentar apagar o post enviado:
unset( $_POST );
O unset(), apenas vai liberar memória do servidor, pois quando o usuário apertar F5, quem vai enviar o POST novamente, é o navegador.
Poderíamos ter uma SESSION simples, do tipo: $_SESSION[‘ja_enviado’];
Se ela tivesse com o valor ‘true’, poderíamos desconsiderar a requisição.
Mas, numa situação em que o usuário pode querer realmente enviar novamente o formulário(via submit), essa ‘ja_enviou’ não resolve a questão. Não existe nenhuma diferença nos cabeçalhos da requisição, entre um submit via form, e um refresh que reenvia um submit.
Então, precisamos criar essa diferença, ou seja, distinguir, se a requisição atual, é a mesma da vez passada ou não.
<?php
session_start();
if( $_SERVER['REQUEST_METHOD']=='POST' )
{
$request = md5( implode( $_POST ) );
if( isset( $_SESSION['last_request'] ) && $_SESSION['last_request']== $request )
{
echo 'refresh';
}
else
{
$_SESSION['last_request'] = $request;
echo 'post';
}
}
?>
<form action="" method="post">
<input type="text" name="ae" value="ae" />
<input type="submit" name="enviar" value="enviar" />
</form>
=) Feito.
Nossa string guardada na session, vai impedir também que requisições iguais sejam enviadas(mesmo que ambas via submit).
O que não chega a ser ruim pois, se o cara já enviou uma vez, e sei lá, gravamos no banco, não tem sentido reescrevermos o mesmo dado de novo no banco, sendo que ele já está lá.
É isso galera.
A referência que pesquisei qndo precisei resolver essa situação está aqui:
http://pt.w3support.net/index.php?db=so&id=456841
Afinal, muito dificilmente seremos os primeiros a nos deparar com uma ‘situação problema’. E já que é assim, provavelmente alguém já o tenha solucionado. Fica a dica: pesquisem! =)