1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

PHP - dúvida

Discussão em 'Web Development' iniciada por nurvo0, 10 de Fevereiro de 2008. (Respostas: 10; Visualizações: 1046)

  1. 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?
     
  2. anjo2

    anjo2 Power Member

    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
     
  3. K0mA

    K0mA Power Member

    Boas,

    Depois de inserires os dados no mysql redireccionas para a insere.php ou para outra a dizer os dados foram inseridos.
     
  4. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    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
     
  5. 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.
     
  6. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    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.
     
  7. 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.
     
  8. 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
     
  9. Session

    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: 12 de Fevereiro de 2008
  10. 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.
     
  11. 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
     

Partilhar esta Página