Eu tenho um formulário simples que envia texto para minha tabela SQL. O problema é que, depois que o usuário envia o texto, ele pode atualizar a página e os dados são enviados novamente sem preencher o formulário novamente. Eu poderia redirecionar o usuário para outra página após o envio do texto, mas quero que os usuários permaneçam na mesma página.
Lembro-me de ler algo sobre dar a cada usuário um ID de sessão exclusivo e compará-lo com outro valor que resolveu o problema que estou tendo, mas esqueci onde ele está.
POST
do pedidoPOST
dados. Nesse caso, você precisaSELECT
do DB. Por exemplo, quando você cria a fatura você será redirecionado para/invoices/53
o qual exibir toda a factura em vez de apenas 'sucesso'Respostas:
Use o padrão Publicar / Redirecionar / Obter. http://en.wikipedia.org/wiki/Post/Redirect/Get
Com o meu site, vou armazenar uma mensagem em um cookie ou sessão, redirecionar após a postagem, ler o cookie / sessão e limpar o valor dessa sessão ou variável de cookie.
fonte
Gostaria também de salientar que você pode usar uma abordagem de javascript,
window.history.replaceState
para impedir o reenvio no botão Atualizar e Voltar.Prova de conceito aqui: https://dtbaker.net/files/prevent-post-resubmit.php
Eu ainda recomendaria uma abordagem Post / Redirect / Get, mas esta é uma nova solução JS.
fonte
Você realmente deve usar um padrão Post Redirect Get para lidar com isso, mas se de alguma forma acabou em uma posição em que o PRG não é viável (por exemplo, o próprio formulário está em uma inclusão, impedindo redirecionamentos), você pode usar alguns dos parâmetros de solicitação para criar uma sequência com base no conteúdo e verifique se você ainda não a enviou.
fonte
session_start();
no início do arquivo. w3schools.com/php/php_sessions.asp diz Nota: A função session_start () deve ser a primeira coisa em seu documento. Antes de qualquer tag HTML.Eu uso essa linha javascript para bloquear o pop-up solicitando o reenvio do formulário na atualização depois que o formulário é enviado.
Basta colocar esta linha no rodapé do seu arquivo e ver a mágica
fonte
Você pode impedir o reenvio de formulário por meio de uma variável de sessão.
Primeiro você precisa definir
rand()
em uma caixa de texto e$_SESSION['rand']
na página do formulário:Depois disso, verifique
$_SESSION['rand']
com o$_POST['randcheck']
valor da caixa de texto como este:fonte
<input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />
em vez$_POST
os dados do formulário, a mesma página seja recarregada, redefinindo a sessão e postando variáveis. Também a criação de variáveis deve ocorrer após verificar se as variáveis coincidem. Portanto,unset
não é necessário.Quando o formulário é processado, você redireciona para outra página:
você também pode redirecionar para a mesma página.
se você estiver fazendo algo como comentários e quiser que o usuário permaneça na mesma página, use o Ajax para lidar com o envio do formulário
fonte
Encontrei a próxima solução alternativa. Você pode escapar do redirecionamento após processar a
POST
solicitação manipulandohistory
objeto.Então você tem o formulário HTML:
Quando você processa este formulário no servidor, em vez de redirecionar o usuário
/the/result/page
, configure oLocation
cabeçalho da seguinte maneira:Após o processamento dos
POST
dados editados, você torna pequeno<script>
e o resultado/the/result/page
O
<script>
que você deve render:O resultado é:
como você pode ver, os dados do formulário são
POST
editados noprocess.php
script.Este script processou
POST
dados e renderização de/the/result/page
uma só vez com:POST
dados quando você atualiza a página (F5)POST
quando você navega para a página anterior / seguinte através do histórico do navegadorUPD
Como outra solução, peço que o recurso solicite à equipe do Mozilla FireFox que permita aos usuários configurar o
NextPage
cabeçalho que funcionará comoLocation
cabeçalho e farápost/redirect/get
padrão obsoleto.Em resumo. Quando o processo do servidor forma
POST
dados com êxito, ele:NextPage
cabeçalho em vez deLocation
POST
dados do formulário como renderizaria paraGET
solicitação nopost/redirect/get
padrãoO navegador, por sua vez, quando vê o
NextPage
cabeçalho:window.location
comNextPage
valorGET
solicitação emNextPage
vez de reformular osPOST
dadosEu acho que isso seria excelente se implementado, não seria?
=)
fonte
Use o cabeçalho e redirecione a página.
header("Location:your_page.php");
Você pode redirecionar para a mesma página ou página diferente.Desmarque $ _POST depois de inseri-lo no banco de dados.
unset($_POST);
fonte
unset
? Por favor, adicione alguma explicação à sua resposta para que outras pessoas possam aprender com elaUma maneira bastante segura é implementar um ID exclusivo na postagem e armazená-lo em cache no
Então, no seu código, faça o seguinte:
fonte
Esse método funciona bem para mim e acho que é o mais simples de fazer esse trabalho.
A idéia geral é redirecionar o usuário para algumas outras páginas após o envio do formulário, o que interromperia o reenvio do formulário na atualização da página. Ainda assim, se você precisar manter o usuário na mesma página após o envio do formulário, poderá fazê-lo de várias maneiras, mas aqui estou descrevendo o método javascript.
Método Javascript
Esse método é bastante fácil e bloqueia o pop-up solicitando o reenvio do formulário na atualização assim que o formulário é enviado. Basta colocar esta linha de código javascript no rodapé do seu arquivo e ver a mágica.
fonte
Javascript
Esse método é bastante fácil e bloqueia o pop-up solicitando o reenvio do formulário na atualização assim que o formulário é enviado. Basta colocar esta linha de código javascript no rodapé do seu arquivo e ver a mágica.
fonte
Basta redirecioná-lo para a mesma página depois de usar os dados do formulário, e ele funciona. Eu tentei.
fonte
Uma versão refinada da postagem de Moob. Crie um hash do POST, salve-o como um cookie de sessão e compare os hashes a cada sessão.
fonte
Basicamente, você precisa redirecionar para fora dessa página, mas isso ainda pode causar problemas enquanto a Internet está lenta (Redirecionar cabeçalho do lado do servidor)
Exemplo de cenário básico:
Clique no botão enviar duas vezes
Maneira de resolver
Lado do cliente
Lado do servidor
fonte
Como evitar o reenvio de formulários php sem redirecionar. Se você estiver usando $ _SESSION (após o session_start) e um formulário $ _POST, poderá fazer algo assim:
No seu formulário html, coloque isto:
Portanto, toda vez que o formulário é enviado, um novo ato é gerado, armazenado em sessão e comparado com o ato posterior.
Ps: se você estiver usando um formulário Get, poderá alterar facilmente todo o POST com GET e também funcionará.
fonte
Depois de inseri-lo no banco de dados, chame o método unset () para limpar os dados.
não definido ($ _ POST);
Para impedir a inserção de dados de atualização, faça um redirecionamento de página para a mesma página ou página diferente após a inserção do registro.
cabeçalho ('Localização:'. $ _ SERVER ['PHP_SELF']);
fonte
unset
ligação é necessária? O que aconteceria se você a ignorasse?Usar o padrão Post / Redirect / Get da resposta do Keverw é uma boa idéia. No entanto, você não consegue permanecer na sua página (e acho que era isso que estava pedindo?) Além disso, às vezes, pode falhar :
Outra opção seria armazenar em uma sessão se o texto deveria ser gravado no seu banco de dados SQL como este:
fonte
Como já foi dito, não é possível deixar de usar o post / redirecionar / get. Mas, ao mesmo tempo, é muito fácil fazer o que você deseja fazer no lado do servidor.
Na sua página POST, você simplesmente valida a entrada do usuário, mas não age sobre ela; em vez disso, você a copia para uma matriz SESSION. Você então redireciona de volta à página principal de envio novamente. Sua página principal de envio começa verificando se a matriz SESSION que você está usando existe e, em caso afirmativo, copie-a para uma matriz local e desative-a. A partir daí você pode agir sobre isso.
Dessa forma, você realiza todo o seu trabalho principal apenas uma vez, alcançando o que deseja fazer.
fonte
Procurei uma solução para evitar o reenvio em um grande projeto posteriormente. O código funciona muito com $ _GET e $ _POST e não posso alterar o comportamento dos elementos do formulário sem o risco de erros imprevistos. Então, aqui está o meu código:
Funciona apenas para evitar o reenvio de $ _POST, não de $ _GET. Mas esse é o comportamento que eu preciso. O problema de reenvio não funciona com uploads de arquivos!
fonte
O que funciona para mim é:
E no seu formulário
fonte
Este
form.php
exemplo mostra como usar o PRG correto (quando o formulário é válido ou não).fonte
fonte
$everything_fine
vem?Por que não usar a
$_POST['submit']
variável como uma declaração lógica para salvar o que estiver no formulário. Você sempre pode redirecionar para a mesma página (caso atualizem e quando acessaremgo back
o navegador, a variável de envio não será mais definida. Verifique se o botão de envio tem umname
eid
desubmit
.fonte