问题与我的执行情况的后/重新定向/获得的图案
-
16-09-2019 - |
题
我总是用的 后/重新定向/Get 方法上我的形式。我的形式一般总是提交给自己。然而,当我们中的一个错误形成的,我不要发送任何新的标题。这是这样我就可以很容易地做到这样的东西
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
PHP仅仅是一个图书馆功能处理2参数,$_POST关键和默认的价值,如果它不存在。
这意味着如果有人犯一个错误的形式,他们没有补充表格第二次。缺点是,重新载入页面给他们的后的警告在他们的浏览器。
反正是有为了避免这一点,而无需使用的东西用于国家(即饼干、会议、数据库等)
解决方案
我觉得要做到这一点的最好办法是用头功能。您可以张贴到什么都文件,你甚至需要自行完成验证,然后用头重定向到回去的形式,如果它失败了。在会话或其他可访问变量存储post'd值,因此可以访问先前输入的数据。
当使用标题( “位置:myscript.php”);确保包括出口();事后否则你仍然会得到一个刷新POST警告。
myscript.php
if($_POST['submit'])
{
//check for errrors
if ($error)
{
$_SESSION['myPostVars'] = $_POST;
header("location: myscript.php");
exit();
}
}
<form>
// your form code
</form>
编辑:我刚才注意到您编辑您的问题,以避免使用会话
您可以序列后瓦尔要返回,并把它们在查询字符串(通过头发送()
其他提示
如果不在会话中保存状态,就无法避免这种情况。当您遇到错误时,您可能可以执行以下操作:
- 生成一个唯一的id
- 复制
$_POST
变量放入由上面的唯一 id 键入的会话中 - 像现在一样重定向,但将唯一 ID 作为查询字符串的一部分传递
- 更新您的库以在会话中查找此唯一 ID(错误情况),而不是访问
$_POST
直接变量,如果请求中未传递唯一 id 或您要查找的名称不存在,则使用默认值 - 在请求结束时从会话中删除唯一的 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', ''); ?>" />
你也可能想要 阅读本教程.
你基本上做的是正确的。有没有特别好的办法避免“重新发布”的警告。
不隶属于 StackOverflow