我总是在表单上使用Post/Redirect/Get方法。我的表格通常都是自己提交的。但是,当我在表单中有错误时,我不会发送任何新标头。这样我就可以轻松做到这样的事情
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
PHP只是一个处理2个参数的库函数,$ _POST键和默认值(如果不存在)。
这意味着如果有人在表单中出错,则他们不必再次填写表单。缺点是重新加载页面会在浏览器中显示POST警告。
无论如何要避免这种情况,不使用状态(即cookie,会话,数据库等)
答案 0 :(得分:2)
我发现最好的方法是使用header函数。您可以发布您需要的文件甚至自己进行验证,然后使用标题重定向返回到表单如果失败。将发布的值存储在会话或其他可访问变量中,因此您可以访问以前输入的数据。
使用header时(“location:myscript.php”);确保包含一个exit();之后否则你仍然会在刷新时收到POST警告。
myscript.php
if($_POST['submit'])
{
//check for errrors
if ($error)
{
$_SESSION['myPostVars'] = $_POST;
header("location: myscript.php");
exit();
}
}
<form>
// your form code
</form>
编辑:我刚刚注意到您编辑了问题以避免使用会话。
您可以序列化要返回的post vars并将它们放入查询字符串中(通过header()发送
答案 1 :(得分:1)
如果不在会话中保存状态,则无法避免这种情况。当您遇到错误时,您可能会执行以下操作:
$_POST
变量复制到由上面的唯一ID键入的会话中$_POST
变量,如果未在请求或您要查找的名称上传递唯一ID不存在使用默认值答案 2 :(得分:0)
我认为你的意思是这样的:
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', ''); ?>" />
您可能还想read this tutorial。
答案 3 :(得分:-2)
你基本上做对了。没有特别好的方法可以避免“重新发布”警告。