3 formas de impedir o reenvio de formulários PHP

3 formas de impedir o reenvio de formulários PHP

: Rafael Marques        27 de Dez de 2017    (0)

Artifícios utilizados para impedir que o formulário seja novamente enviado ao atualizar o browser ou mesmo submetido pelo usuário


Fala Dev!

Sabemos que o PHP é uma linguagem server side e por isso, ao trabalhar com formulários muitas vezes corremos o risco do usuário atualizar a página ou mesmo clicar novamente no SUBMIT e assim temos dados enviados multiplas vezes repetidos.

Há também diversas formas de prevenir esse problema e eu resolvi listar 3 delas que julgo mais práticas e que resolvem o problema.

 

1. Guardar SESSION no primeiro envio

Podemos criar uma SESION para o formulário contendo apenas uma flag como o valor TRUE por exemplo. Partindo daí, testaremos com um IF se a session existe e caso essa condição seja satisfeita, o formulário não será enviado.

Vamos exemplificar:

<?php
if($_POST){
$_SESSION['form'] = 1;

if($_SESSION['form']){
echo 'Já enviado';
}else{
echo $_POST['firstname'];
}
}
?>


<form method="POST">
<input type="text" name="firstname">
<input type="submit">
</form>

 

2. Envio de formulário com intermédio do AJAX

Neste caso toda lógica do formulário fica com o arquivo PHP porém o formulário é submetido pelo javascript que faz a chamada do PHP. Aí toda camada de validação será retornada em formato jSON para o Javascript

No exemplo seria algo mais ou menos assim (lembrando que você precisará do jquery instanciado):

 

formulario.php

<script src="jquery.js"></script>
<script src="scripts.js"></script>
<form method="POST" id="meuForm">
<div class="callback_message" style="display:none"></div>
<input type="hidden" name="callback" value="handler">
<input type="text" name="firstname">
<input type="submit">
<div class="load" style="display:none;">
<img src="http://www.musicvilla.com/Content/img/loader.GIF">
</div>
</form>

 

scripts.js

$(document).ready(function () {
$('#meuForm').submit(function (e) {
e.preventDefault();

var Form = $(this);
var Action = Form.find('input[name="callback"]').val();
var Data = Form.serialize();

//Ajax realiza o POST no arquivo informado

$.ajax({
type: 'POST',
url: Action + '.ajax.php',
data: Data,
dataType: 'json',
beforeSend: function () {
// Busca a Div com a CLASS LOAD para exibir o GIF de carregamento enquando não abtem o retorno

Form.find(".load").fadeIn();
},
success: function (data) {

if (data.trigger) {
// Procura a DIV callback_message e revela adicionando HTML dentro contendo a mensagem de sucesso

Form.find(".callback_message").fadeOut(400, function () {
$(this).html(data.trigger).fadeIn();
});
}

//Limpa os INPUTS

if (data.clear) {
Form.find('input').val('');
}
}
});
});

});

 

handler.ajax.php

//Instancia um Array que será utilizado de retorno dos dados
$jSON = array();

//Recebe e armazena em um array os dados vindos do POST do seu formulário
$getPost = filter_input_array(INPUT_POST, FILTER_DEFAULT);


//Aqui basta trabalhar toda a lógica do envio do seu form!
//Se der certo o índice CLEAR do ARRAY $jSON será TRUE e o índice TRIGGER receberá a mensagem de sucesso
//Caso contrário, CLEAR recebe FALSE e TRIGGER recebe a mensagem de ERRO

$jSON['clear'] = true;
$jSON['trigger'] = "Formulário enviado com sucesso";

echo json_encode($jSON);

 

3. Redirecionar para a mesma ou para outra página

Nesse caso é mais simples que todos os outros, basta usar a instrução HEADER do PHP para redirecionar o acesso para outra ou para a mesma página e dessa forma os dados do formulário que estavam no servidor serão removido.

//Após sucesso no formulário basta redirecionar para a página desejada
header("Location: index.php");

 

Coforme mencionei, há mais formas de fazer isso e optei por mostrar aqui as mais comuns e funcionais em minha opinião e experiência.

Se você gostou, deixa aquele comentário e compartilhar pra alcançar mais Devs!

Valeu Dev, um forte abraço!

 

  • Compartilhe esse post
  • Compartilhar no Facebook00
  • Compartilhar no Google Plus00
  • Compartilhar no Twitter

Entre para a Lista VIP

Acesse conteúdo EXCLUSIVO e NOVIDADES sobre os cursos em primeira mão!

Também Odiamos Spam!

Rafael Marques

Desenvolvedor Web há quase 10 anos e especialista em Opencart E-Commerce CMS. Trabalho com HTML5 / CSS3 / JS / PHP / MySql.

        
Enviando Comentário Fechar :/