[英]Problem with my implementation of the Post/Redirect/Get pattern
我总是在表单上使用Post / Redirect / Get方法。 我的表格通常总是提交给自己。 但是,当我在表单中有错误时,我不会发送任何新的标题。 这样我就可以轻松地做这样的事情
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
PHP只是一个处理2个参数的库函数,$ _ POST键和一个默认值(如果不存在)。
这意味着,如果有人在表格中输入错误,则不必再次填写表格。 缺点是重新加载页面会在浏览器中向其发出POST警告。
无论如何,有没有避免这种情况的状态,而不使用某些状态(即cookie,会话,数据库等)
我发现最好的方法是使用标头函数。 您可以将文件发布到所需的任何文件,甚至文件本身也可以进行验证,然后在失败时使用标头重定向返回到表单。 将张贴的值存储在会话中或其他可访问的变量中,因此您可以访问先前输入的数据。
当使用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>
编辑:我刚刚注意到您编辑了问题以避免使用会话。
您可以序列化要返回的后变量,并将其放入查询字符串中(通过header()发送
如果不在会话中保存状态,则无法避免这种情况。 遇到错误时,您可能会执行以下操作:
$_POST
变量复制到以上面的唯一ID为键的会话中 $_POST
变量,如果在请求中未传递唯一ID或您要查找的名称不存在,请使用默认值值 我认为您的意思是这样的:
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', ''); ?>" />
您可能还需要阅读本教程 。
您基本上做对了。 没有特别好的方法来避免“重新发布”警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.