Problema com a minha implementação do Post / Redirect / Get padrão
-
16-09-2019 - |
Pergunta
Eu sempre uso o href="http://en.wikipedia.org/wiki/Post/Redirect/Get" rel="nofollow noreferrer"> Publicar Redirect / Get método /
O PHP é apenas uma função de biblioteca que lida com 2 argumentos, a chave $ _POST e um valor padrão se não está presente. Isto significa que se alguém comete um erro na forma, eles não têm para reabastecer o formulário uma segunda vez. A desvantagem é que recarregar a página dá-lhes o aviso POST no seu browser. Existe uma maneira de evitar isso, sem o uso de algo para o estado (isto é, biscoitos, sessão, banco de dados etc) <input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
Solução
Acho que a melhor maneira de fazer isso é usar a função de cabeçalho. Você pode enviar ao que nunca arquivo que você precisa até mesmo a própria fazer a validação, em seguida, usar o redirecionamento de cabeçalho para voltar à forma, se ele falhou. Armazenar os valores post'd na sessão ou outra variável acessível, portanto, você pode acessar os dados inseridos anteriormente.
Ao usar cabeçalho ( "local: myscript.php"); certifique-se de incluir uma saída (); depois de outra maneira você ainda vai receber o aviso POST em uma atualização.
myscript.php
if($_POST['submit'])
{
//check for errrors
if ($error)
{
$_SESSION['myPostVars'] = $_POST;
header("location: myscript.php");
exit();
}
}
<form>
// your form code
</form>
Edit:. Eu notei que você editou sua pergunta para evitar o uso de sessões
Você pode serializar o pós vars você quiser voltar e colocá-los na cadeia de consulta (enviada através do header ()
Outras dicas
Não há nenhuma maneira de evitar isso sem salvar o estado da sessão. Quando você encontrar um erro que você provavelmente poderia fazer algo como o seguinte:
- gerar uma identificação única
- copiar a variável
$_POST
na sessão introduzidos pela id único acima - redirecionamento como você faz agora, mas passar o id exclusivo como parte da string de consulta ??li>
- atualizar sua biblioteca para olhar para este id único na sessão (situações de erro) em vez de acessar a variável
$_POST
directamente, se o id único não foi repassado o pedido ou o nome que você está procurando não existe uso o valor padrão - no final do pedido remover a entrada id único da sessão. isso poupa poluindo a sessão com muito lixo. Você também pode fazer isso no início do pedido, dependendo da sua biblioteca
Eu acho que você quer dizer algo como isto:
function Value($array, $key, $default = false)
{
if (is_array($array) === true)
{
settype($key, 'array');
foreach ($key as $value)
{
if (array_key_exists($value, $array) === false)
{
return $default;
}
$array = $array[$value];
}
return htmlspecialchars($array);
}
return $default;
}
<input type="text" name="email" value="<?= Value($_POST, 'email', ''); ?>" />
Você também pode querer ler este tutorial .
Você está fazendo basicamente certo. Não há nenhuma maneira particularmente bom evitar os avisos "Repost".