navegar de volta com o envio do formulário PHP

Então, é o seguinte., Estou usando formulários HTML para transferir variáveis de página para página e script PHP para criar páginas com base em valores submetidos. Em geral, parece-se com isto: a partir do catálogo de itens que você seleciona o que você quer e a página seguinte mostra detalhes para este item específico. Tudo funciona perfeitamente, excepto uma coisa:

sempre que uso o botão de trás do navegador, recebo sempre o erro: ERR_CACHE_MISS e preciso de actualizar a página e depois confirmar que realmente quero voltar a apresentar os dados.

Há alguma maneira de resolver isto, para que os meus clientes possam usar o botão de volta como deviam.

Aqui está o texto completo que o navegador me fornece:

Esta página web necessita de dados que introduziu anteriormente para ser devidamente exibido. Você pode enviar esses dados novamente, mas ao fazê-lo você vai repetir qualquer ação esta página realizada anteriormente. Reler isto pagina. Carregue no botão Recarregar para voltar a apresentar os dados necessários para carregar pagina. Código de erro: ERR_CACHE_MISS

Author: Maxim Ershov, 2013-10-07

5 answers

Quando você publicar formulários com php, ou qualquer outro tipo de dados, você pode voltar para a página e encontrar uma mensagem no navegador, como o "Documento Expirado" ou "Confirmar Formulário de Reapresentação Com o google Chrome". Estas mensagens são uma precaução de segurança que o navegador usa com dados sensíveis, como variáveis de post. O navegador não lhe dará automaticamente a página Nova novamente. Você deve recarregar a página clicando em tentar de novo ou com uma atualização da página. Então, funciona como seria de esperar.

No entanto, o programador php pode trabalhar em torno da mensagem irritante do navegador, adicionando um pequeno código no script. O exemplo mostra um par de linhas de código que pode ser adicionado acima session_start (), a fim de ser capaz de ir e voltar para a página quando você postar sem qualquer interrupção.O modo "private_no_expire" significa que o cliente não receberá o cabeçalho expirado em primeiro lugar.

header('Cache-Control: no cache'); //no cache
session_cache_limiter('private_no_expire'); // works
//session_cache_limiter('public'); // works too
session_start();
 21
Author: user3877861, 2014-11-29 06:20:43
Alguns antecedentes: o crédito vai para bruce (sqlwork.com) por sua excelente explicação.

esta página web necessita de dados que você introduziu mais cedo, a fim de ser exibido corretamente. Você pode enviar esses dados novamente, mas ao fazê-lo você vai repetir qualquer ação esta página realizada anteriormente. Carregue em Recarregar para reenviar os dados e mostrar esta página.

Por causa das práticas de codificação desleixadas dos navegadores de desenvolvedores web foram forçados a adicionar esta mensagem. o cenário é como segue:

1) o utilizador preenche o formulário e apresenta (formulário de mensagens) 2) o servidor processa os dados post e responde com uma nova página (Confirmar) marcada como não cacheável 3) o usuário navega para uma nova página. 4) o utilizador Pressione de volta:

Para o navegador mostrar a Página no Passo 2, porque a sua marcação no-cache, ele deve requisitá-lo a partir do servidor, em outras palavras fazer o repost dos dados (Fazer Passo 1). aqui está o código desleixado chegou, se este era um cartão de crédito, e repost a detecção não estava no servidor, o cartão é cobrado duas vezes. este era (is) um problema tão comum, que os navegadores tinham que detectar isso e avisar os usuários.

A melhor correção é no passo dois, o servidor envia um redirecionamento para a página de confirmação. em seguida, quando o usuário acessa a confirmação através do histórico ou de volta, é um pedido get, não um pedido de post e não vai mostrar o aviso.

Nota: O modelo postback da webform presta - se a este problema. também evite transferências de servidores.

Minha solução

$_SESSION ['home'] Usado para guardar quaisquer erros na página inicial.

$_SESSION ['tempEmail'] usado para ecoar o valor na forma php.

Nota: Use uma variável de sessão única para cada página que tenha um formulário HTML para o tratamento de erros e também qualquer variável de sessão para cada valor que seja ecoado no formulário HTML.

<?php
session_start(); 

//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}

Opcional - se estiver ligado, atribuir o endereço de E-mail à variável $_SESSION['tempEmail'] (se não tiver sido feito anteriormente) para pré-preencher o formulário HTML.

if(isset($_POST['Submit'])){

---your code---


    //Error message(s) examples
    $_SESSION['home'] = "Email and Password do not match, please try again.";
    header("Location: " . $_SERVER['REQUEST_URI']);

    $_SESSION['home'] = "Email address format is invalid.  Please recheck.";
    header("Location: " . $_SERVER['REQUEST_URI']);

    //success
    unset ($_SESSION['home']); //optional, unset to clear form values.
    header ("location: nextpage.php"); 
             ---or---
    header("Location: " . $_SERVER['REQUEST_URI']);  //re-post to same page with the $_SESSION['home'] success message.   
}
?>



<body>

Margem de Erro

<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>

HTML form

<form action="#" name="loginform" method="post" >
    <input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/>
    <input type="submit" name="Submit" value="Submit">
</form>

</body>

Não se recomenda a sua utilização na página de pagamento, Ver discussão acima. Testada em Firefox, Cromo, Safari e IE9. As mensagens irritantes desaparecem quando se usa o botão de trás. Certifique-se de que o buffer de saída Está ligado no seu programa php ou php.ini para evitar avisos de cabeçalho. Podes verificar o teu php.processo ini para o seguinte;

output_buffering=On
 8
Author: Medeno, 2013-11-09 21:41:51

Encontrei isto usando apenas:

header('Cache-Control: no cache'); //disable validation of form by the browser

Resolva o problema

 4
Author: Mimouni, 2016-05-05 09:42:44
Tentei esta resposta e está tudo bem. Você tem que colocar este código antes: session_start():
session_cache_limiter('private, must-revalidate');
session_cache_expire(60);
Boa sorte.
 2
Author: user5497991, 2015-10-28 11:51:54
<?php
if(isset($_POST['submit']))
{
 //submission goes here
}
?>
Era isto que estavas a pensar?

Editar-SQL é realmente uma coisa bonita para trabalhar, vejo que foi adicionado como uma recomendação em um comentário, e concordo em usar SQL se você puder, seu rápido, intuitivo e eficiente.

 0
Author: Craig Travis, 2013-10-07 00:57:40