PHP - dúvida

nurvo0

Membro
Estou à alguns dias para tentar resolver o seguinte problema:

eu tenho uma página com o seguinte nome: "insere.php". Dentro desta tenho um botão submit que quando é pressionado redirecciona para outra, "captacao.php".
Na página "captacao.php" faço o seguinte:
if(isset($_POST['btnSubmit']))
{
....insere dados na bd (Mysql)
}

até aqui tudo bem. O problema acontece sempre que eu faço F5 - refresh - à página "captacao.php", esta volta a inserir novos dados na base de dados. Como é que eu faço para evitar que os dados voltem a ser inseridos?
 
PHP:
unset($_POST);
Não tenho a certeza se isto funciona, não cheguei a testar :x Sempre podes fazer um header no final para a outra página
 
Uma possível solução que estou a imaginar seria passares um ID no formulário que envia esses dados, e esse ID é sempre único (a BD fica com um registo, que faz com que ele não possa ser reutilizado. Podes sempre limpar essa parte da BD quando quiseres). Assim, se o utilizador fizer refresh, envia o mesmo ID, e recebe um erro a dizer que está a reenviar os mesmos dados. Isso, ou um cookie, se assim preferires, que também fica com o ID registado.

Por aqui há muitas formas de explicar isto, mas acho que já disse o essencial da minha ideia :x
 
Session

A mesma ideia do angelofwisdom, mas em vez do cookie uma session, visto que os cookies podem não estar ligados no browser do utilizador. Eu sugeriria o unset do anjo2 se isso funcionasse, mas o envio dos dados cabe ao browser (sendo assim client-side, e não server-side). Portanto crias uma $_SESSION["dadosenviados"], por exemplo. Começa com valor false na insere e depois de inseridos na bd os dados o seu valor poderia ficar true. Assim, no início da página captação verificavas o seu valor. Só depois de verificado poderia prosseguir com a introdução dos dados, ou receberia uma mensagem de aviso a dizer que os dados já haviam sido enviados. O redireccionar também é boa ideia.
 
O problema do redireccionar, e sei do que falo :P é que um utilizador odeia não conseguir usar o botão Retroceder do browser, e isso faria com que sempre que ele tentasse retroceder, avançava automaticamente (ou, até, o problema mantinha-se, já que ele reenviou os dados).
Acho que a solução ideal seria o utilizador ficar na mesma página, e caso ele a tente actualizar, o ID "denuncia" a repetição de dados, sem outros efeitos.
 
Obrigado a todos pelas ideias...

Já tinha testado uma ideia com SESSION, mas penso que nunca tentei da forma que aqui explicaram.

Vou testar a do unset, porque penso ser a mais simples e se funcionar eficaz.
Caso não consiga volto à da SESSION.

Obrigado pelas sugestões.
 
a solução do unset ficou sem efeito.
eu já tinha tentado usar o unset para o botão Submit...penso que eu não devo saber usar o unset.
De qualquer forma vou passar à da session
 
Session

O problema do redireccionar, e sei do que falo :P é que um utilizador odeia não conseguir usar o botão Retroceder do browser, e isso faria com que sempre que ele tentasse retroceder, avançava automaticamente (ou, até, o problema mantinha-se, já que ele reenviou os dados).

Sim, o redireccionar só funciona SE o utilizador não carregar em retroceder, obviamente. Portanto realmente tem que ficar fora de questão porque numa situação destas um SE não dá muito jeito. Bem pensado angelofwisdom!

Como te tinha dito, o unset não funciona porque o tipo de dados POST é processado ao nível do browser. Logo o unset não lhe faz nada.

Para usares a session terás que usar na 1ª linha (sim, na 1ª de todas [ok, a seguir ao <?php], tirando algumas excepções que não valem a pena abordar) algo chamado session_start(). Isto permite o acesso às variáveis $_SESSION. Portanto o início do código ficaria
PHP:
<?php
session_start();
//RESTO DO CÓDIGO AQUI
?>
Tem que estar exactamente na primeira linha pois tem que ser chamado antes de qualquer tipo de dados ser enviado para o browser do utilizador.
Como tal tens de ter atenção ao BOM (uma marca que é incorporada em ficheiros editados por editores de texto tipo Notepad). Se o BOM estiver presente nesses ficheiros, como essa marca aparece no início do ficheiro, será enviada antes do dito session_start() pelo que as sessões darão erro.

Solução: Usar um editor hexadecimal para tirar a marca inicial (deixando o início com <?php).
ou
Solução: Usar sempre Dreamweaver para evitar o acrescentar dessa marca. Se tiveres que utilizar o Notepad, recorres outra vez ao dito editor hexadecimal.

Só te alerto disto tudo porque até descobrir o BOM as minhas sessões não funcionavam. Isto deu-me uma dor de cabeça durante semanas, até que por várias tentativas descobri que mudando a codificação dos ficheiros elas funcionavam.

Depois diz qualquer coisa quanto ao teu problema.
 
Última edição:
viva lbribeiro.
Fiz por session como indicaste.
Em relação ao problema do BOM, eu uso o Notepad++ e com este editor penso que não tenho problemas com a marca inicial, pois as sessões funcionam correctamente.

Ah....eu fiz mais uma coisa para além de sessões que foi validar primeiro se o utilizador inseriu dados nas caixas de texto. Só depois de tudo estar correctamente preenchido é que faz a inserção dos dados.
 
Creio que a solução pra isto é simples. Não experimentei, mas deve funcionar:

Utilizando sessoes, colocas no inicio do script:

if ( !isset ($_SESSION['actualizou'] ))
$_SESSION['actualizou'] = false;

e no fim do script:

$_SESSSION['actualizou'] = true;

no meio disso tudo:

if ( !$_SESSION['actualizou'] )
// INSERIR REGISTOS
else
// NÃO INSERIR


Cumprimentos
 
Back
Topo