Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo de Tarso F. M.

Evitar reenvio do e-mail atualizando a página

Recommended Posts

Galera!

 

Nossa, faz muito tempo que eu não perguntava nada aqui no fórum, e agora estou precisando de um apoio. Sei que para a maioria de vocês isso pode parecer ridículo, mas eu não estou conseguindo fazer isso.

 

Como evitar o reenvio de e-mail pelo PHP quando a página é atualizada? Tentei após o envio zerar as variáveis, utilizar o unset também, definir diretamente $_POST["var"] = 0, mas nada ainda.

 

Enfim, como se evita esse tipo de coisa?

 

Obrigado desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera!

 

Nossa, faz muito tempo que eu não perguntava nada aqui no fórum, e agora estou precisando de um apoio. Sei que para a maioria de vocês isso pode parecer ridículo, mas eu não estou conseguindo fazer isso.

 

Como evitar o reenvio de e-mail pelo PHP quando a página é atualizada? Tentei após o envio zerar as variáveis, utilizar o unset também, definir diretamente $_POST["var"] = 0, mas nada ainda.

 

Enfim, como se evita esse tipo de coisa?

 

Obrigado desde já!

 

Olá amigo!

 

Existem diversas maneiras de se evitar o reenvio.

 

O que acontece é que cada vez que o usuário dá um REFRESH (F5) na página, as variáveis POST[] (que são locais do browser) são reenviadas ao servidor que por sua vez às seta. Por isso não adianta atribuir um valor 0 ou NULL à elas pois, são sempre reenviadas pelo browser client-side.

 

Uma das formas mais comuns de se evitar isso é utilizar o redirecionamento pós envio, ou seja, depois que você enviar a mensagem de email utilize a função header("Location: URL"); para redirecionar o usuário à uma outra página.

 

Outra forma é utilizar COOKIES ou SESSÕES para controle disto, mas é um tanto que desnecessário os utilizar visto que o método acima é eficaz 90%

 

Também pode-se armazenar o IP do usuário e a data/hora de envio do email, assim pode-se restringir o reenvio. Este método é utilizado para evitar os ataques FLOOD, onde os LAMMERS enviam vários e vários emails ao servidor tentando congestioná-lo.

 

Espero ter ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele pediu para você dizer como fazer pra evitar isso, não pra você fazer isso aqui! hahahahaha

3x post's :(

 

Cara,

 

você não precisa nada disso que o amigo frederico falou (nao leva a mal aí frederico ;) ). existe uma forma melhor :)

 

você precisa fazer com que a página expire depois de executada, assim ele não pode reenviar os dados usando o refresh.

em cadastros de sites que sabem q isso acontece, como sites grandes, isto é sempre feito.

 

saiba mais em: http://www.php.net/header

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bacana, Fredericomf, obrigado pelo apoio!

 

Eu imaginava que zerando as variáveis elas realmente seriam sobrescritas... :wacko:

 

Vou dar uma pesquisada então sobre uso de IP e outras variáveis para controlar isso...

 

 

[Editado]:

 

Ow, obrigado pelas dicas também, [ GuTo ]. Analisarei essa questão juntamente com a sugerida anteriormente. Mas uma coisa é certa: nunca uma sugestão é dada como inválida, né? Afinal de contas, é assim mesmo que aprendemos, quando debtemos com àqueles que entendem do assunto...

 

Valeu galera!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, testei o uso do header expirado, conforme o [ GuTo ] disse. Não funcionou.

 

Agora, como eu posso controlar exatamente se o cara enviou o e-mail, se não tenho a informação do IP, por exemplo, salva em algum lugar para poder comparar se aquele IP em questão já foi utilizado?

 

Outra coisa, será que controlar o IP é funcional mesmo?

 

O que me dizem?

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, testei o uso do header expirado, conforme o [ GuTo ] disse. Não funcionou.

 

Agora, como eu posso controlar exatamente se o cara enviou o e-mail, se não tenho a informação do IP, por exemplo, salva em algum lugar para poder comparar se aquele IP em questão já foi utilizado?

 

Outra coisa, será que controlar o IP é funcional mesmo?

 

O que me dizem?

 

Abraço!

 

Olá amigo,

 

Acredito que o GuTO não entendeu a minha resposta, mas é assim mesmo.

 

Respondendo a sua pergunta, sobre o IP.

 

getenv("REMOTE_ADDR"); //Pega o IP do visitante.

 

Controlar por IP é funcional até certo ponto e depende da finalidade. Se o visitante estiver navegando sobre ip dinâmico basta ele reiniciar o modem que o ip muda. Porém, como você está apenas controlando o acesso a envio simples de email, que será LOUCO e ESTÚPIDO de ficar reiniciando o modem para tentar enviar vários emails? Visto que cada reinicialização demora mais de 2 minutos.

 

Quando ao header, utilize como eu falei que vai dar certo, eu sempre usei assim e NUNCA tive problemas com reenvios.

 

Depois do envio do email utilize header("location: http://www.seusite.com.br/index.php");

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum...

 

Acho então que não entendi exatamente o que o amigo Paulo quer fazer realmente.

Pensei que fosse algo como alguém submeter um form, daí dar refresh e ser enviado os mesmos dados novamente.

 

Um exemplo: alguém faz o form e a página que recebe os dados do form no mesmo arquivo cadastro.php. Quando é exibido a mensagem de dados enviados com sucesso, o cara resolve dar um refresh e aí é mandado tudo denovo. Daí é usado o troço para expirar a página, daí ele dá refresh e nao é enviado novamente os dados.

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
eu nunca usei isso no php, nao tive necessidade. mas no asp já [response.expires, se nao me engano...]

 

Enfim, se não é isso, então tenta dá uma explicada pra mim, hehe.

 

Se for, já tem mais um problema, sendo ele

- crie uma página cadastroForm.php e outra cadastroSend.php (os nomes são apenas para ilustrar, use os nomes mais semânticos possíveis para sua aplicação), cada uma fazendo sua parte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aconselho a controlar usando session

 

 

exemplo

 

tmp.php

<?php

session_start();

$posted = false;
if( isset( $_POST['act'] ) ){
	$posted = true;
}

if( !$posted ){

	$_SESSION['frmControl']['finished'] = time();

}else{

	if( !isset( $_SESSION['frmControl']['finished']) ){

		echo 'sorry, an error was occurred!'; 

	}else{

		if( $_SESSION['frmControl']['finished'] > 1 ){
	
			echo 'email was sent';
	
			$_SESSION['frmControl']['finished'] = 1;
	
		}else{
	
			echo 'email already sent';
	
		}

	}

	echo '<hr>';

}

if( $_SESSION['frmControl']['finished'] > 1 ){
?>
	<form action=tmp.php method=post>
	<input type=hidden name=act value=1>
	<input type=submit value='send'>
	</form>
<?php }else{?>
	<a href=tmp.php>back to form</a>
<?php }?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.