Tonga 1 Denunciar post Postado Junho 14, 2011 Bom dia a todos. Eu sou novo em programação web e ainda estou em fase de aprendizado. Eu pesquisei por esta dúvida aqui no forum e em outros, mas não achei nada a respeito. Eu fiz uma página chamada index.php que recebia informações através do $_GET e do $_POST (como mostra o exemplo abaixo). <?php if(isset($_GET['listaopcoes'])) { if(isset($_POST['opcao1'])) { AlterarBancoDeDados(); ExibirPaginaAlteracaoRealizadaSucesso(); } else { ExibirPaginaListaOpcoes(); } } else { ExibirPaginaPadrao(); } ?> As funções Exibir... simplesmente montam a página html, ou seja, não há nenhum redirecionamento. Como podem ver, caso existam as variáveis $_GET['listaopcoes'] e $_POST['opcao1'], eu realizo um alteração no Banco de Dados. Mas caso existam as variáveis $_GET['listaopcoes'] e $_POST['opcao1'] e o usuário de um refresh na página, a função AlterarBancoDeDados() será executada novamente e isto não podria acontecer. Eu já tentei utilizar o comando unset($_POST) mas isto não funciona. Alguém tem idéia de como eu posso resolver isto ? Evitar que a função AlterarBancoDeDados() seja executada novamente ao se recarregar a página. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Junho 14, 2011 Eu já tentei utilizar o comando unset($_POST) mas isto não funciona. Certo, por quê 'não' funciona ? você remove as variáveis antes de mandar o REFRESH na página. Compartilhar este post Link para o post Compartilhar em outros sites
Tonga 1 Denunciar post Postado Junho 14, 2011 Obrigado por ter respondido, mas não entendi a sua resposta. Você poderia ser mais claro ? Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Junho 14, 2011 Ok, vamos deixar mais claro pra você ! vamos supor que eu seja um internauta, acabei de acessar seu site, vou alterar meus dados ou fazer meu cadastro na sua página, então preencho todos os campos, confirmo meus dados, é clico no botão para cadastrar ou alterar meus dados, quando o usuário clica no botão, você está enviando o POST com toda informação do formulário certo ? essa informação vai ser enviada para o servidor manipular, no caso o 'teu' script o seu problema, é que no caso de atualizar a página, esses dados que foram enviados anteriormente, sejam enviados novamente para a página que os manipula, ou seja, alterando ou cadastrando novamente os dados, agora a solução que vejo quanto á isso, já da qual você falou que não funciona, e você fazer um 'unset' da variável global $_POST porque 'antes' de atualizar a pagina ( isso após o servidor ter processado toda informação recebida ) 'no caso' ter alterado ou cadastrado as informações no banco de dados, você removendo todos os valores guardados em $_POST. não vai ter problema ao atualizar a página, desses dados serem processados novamente. porque não vai existir nenhum índice setado em $_POST, entendeu amigo ? Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Junho 15, 2011 você removendo todos os valores guardados em $_POST. não vai ter problema ao atualizar a página na verdade não é assim que funciona amigo @Andrey Knupp. Okay, se você mandar um unset( $_POST ); você apaga da memória do servidor, porém não podemos esquecer que quem envia é o navegador, e para ele, o F5 reenvia os dados. Nesse caso, a forma mais simples, é que você redirecione o usuário para uma outra página de sucesso|falha após o processamento do post. Compartilhar este post Link para o post Compartilhar em outros sites
Tonga 1 Denunciar post Postado Junho 15, 2011 Exatamente Willian. Me desculpe Andrey, acho que não fui claro na minha primeira explicação . . . if(isset($_POST['opcao1'])) { AlterarBancoDeDados(); ExibirPaginaAlteracaoRealizadaSucesso(); unset($_POST); } Mesmo colocando o unset após a atualização do banco de dados, como mostrado no exemplo acima, ao dar o refresh o $_POST é recarregado (na verdade é dada ao usuário a opção de recarregar estas informações) e re-executa a função AlterarBancoDeDados(). Quanto ao reencaminhar o usuário para uma página de "sucesso", eu já faço isso com javascript, mas eu sempre achei isto um pouco POG mas solucionava o meu problema. Até que foi necessário criar a função ExibirPaginaAlteracaoRealizadaSucesso(). . . Eis abaixo a estrutura de código do arquivo index.php <?php if(isset($_GET['listaopcoes'])) { if(isset($_POST['opcao1'])) { AlterarBancoDeDados(); ExibirPaginaAlteracaoRealizadaSucesso(); echo "<script language= \"Javascript\">location.href=\"" . DOMINIO . "index.php"\"</script>"; } else { ExibirPaginaListaOpcoes(); } } else { ExibirPaginaPadrao(); } ?> Após realizar as alterações eu já chamo uma função que mostra a mensagem de "sucesso", só que ao re-encaminhar o usuário, esta mensagem é perdida. A possibilidade de criar um arquivo diferente é inexistemte, tudo deve ser feito pelo index.php o usuário não deve ter acesso a nenhuma outra página. A forma mais "fácil, rápida e simples" de solucionar este problema seria apagar as informações do $_POST, o que eu naõ consegui fazer. Existe alguma forma de se apagar as informações de $_POST que são enviadas durante um refresh ? Ou mesmo detectar quando há um refresh ? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Junho 15, 2011 @Tonga, leia novamente oque eu disse. não adianta e nem dá para 'apagar o post' da forma que você disse. o refresh do navegador não será apenas um refresh, se não um if( $_SERVER['REQUEST_METHOD']=='POST' ) resolveria. porém, não é o caso. a minha dica, é que você grave uma $_SESSION na primeira vez que o form for enviado. antes de gravar as informações, verifique se essa session existe, se existir, não faça o insert. Entendeu ? Compartilhar este post Link para o post Compartilhar em outros sites
Tonga 1 Denunciar post Postado Junho 15, 2011 Sim, eu já havia entendido. Eu só queria saber se da mesma forma que podemos apagar as informações do $_POST no servidor, temos como apagar as informações do "$_POST" no cliente. Pois assim seria fácil solucionar o meu problema. Utilizar $_SESSIONS não é uma alternativa pelo seguinte . . . vamos supor uma página de uma rede social, a página a onde você digita as informações sobre a sua pessoa. Ao pressionar o botão "alterar dados", você é encaminhado para a mesma página da qual você veio, só que com os seus dados alterados. Dar um refresh na página não altera o banco de dados, mas apertar o botão "alterar dados" altera o banco de dados. Ao criar um campo em $_SESSIONS eu vou bloquear a alteração dos dados após a primeira interação do usuário, ou seja, o botão não vai mais funcionar pois o campo em $_SESSIONS vai existir. O usuário precisará ir para alguma outra página (a qual zeraria o $_SESSIONS) e voltar a página de alteração de dados. Eu não quero bloquear a função do botão, somente a do refresh. Não sei se consegui exemplificar bem a idéia. Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Junho 15, 2011 Okay, nesse caso eu não estava tão longe assim da solução... :lol: dei uma pesquisada, e: <?php session_start(); if( $_SERVER['REQUEST_METHOD']=='POST' ) { $request = md5( implode( $_POST ) ); if( isset( $_SESSION['last_request'] ) && $_SESSION['last_request']== md5( implode( $_POST ) ) ) { echo 'refresh'; } else { $_SESSION['last_request'] = md5( implode( $_POST ) ); echo 'post'; } } ?> <form action="" method="post"> <input type="text" name="ae" value="ae" /> <input type="submit" name="enviar" value="enviar" /> </form> =) referência http://pt.w3support.net/index.php?db=so&id=456841 Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Junho 15, 2011 Tonga, o meio mais prático é conforme post #7 do William Ao criar um campo em $_SESSIONS eu vou bloquear a alteração dos dados após a primeira interação do usuário.. sim, se não houver um controle da sessão como criar um "controle de sessão".. é outro assunto, é questão de usar o raciocínio lógico crie flags, controle pelo tempo de atividade, etc.. Compartilhar este post Link para o post Compartilhar em outros sites
Tonga 1 Denunciar post Postado Junho 15, 2011 GREAT ! :joia: PERFECT ! :clap: Era exatamente isso que eu precisava ! A única coisa que precisei alterar, foi incluir um campo invisível no form. Neste campo eu coloquei como valor o timestamp, pois da forma que estava se você acionasse o botão e o valor do "text" fosse o mesmo ele não processaria a informação e eu preciso que a informação seja processada toda vez que o botão for acionado independente do valor de "text". Colocando o timestamp, toda vez que o botão é pressionado é gerado o timestamp atual o que resulta em um "$request" diferente e portanto a informação é processada. Mas ela é ignorada quando se usa o REFRESH pois durante o refresh o valor repassado como $_POST será sempre o mesmo. <?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'; } } $codigo_html = "<form action=\"\" method=\"post\">"; $codigo_html .= " <input type=\"hidden\" name=\"hangar\" value=\"" . time() . "\">"; $codigo_html .= " <input type=\"text\" name=\"ae\" value=\"ae\" />"; $codigo_html .= " <input type=\"submit\" name=\"enviar\" value=\"enviar\" />"; $codigo_html .= "</form>"; echo $codigo_html; ?> Muito Obrigado Willian :worship: E a todos que tentaram me ajudar. Compartilhar este post Link para o post Compartilhar em outros sites