以下是我想要实现的目标。我有一个HTML表单,它是由PHP处理的。用户需要经过身份验证才能提交此表单。但是,如果用户在填写表单时会话超时,我不希望用户丢失工作。
我的想法是,当我执行身份验证检查时,如果失败,身份验证模块可以将$_POST
数据存储在$_SESSION
数组中,并将用户重定向到登录页面。一旦用户登录,登录页面可以将用户重定向回提交页面,然后验证模块会看到$_SESSION
数组中有保存的$_POST
数据,并将$_POST
数组设置回存储在$_SESSION
中的值。然后提交页面可以正常处理表单数据。
我已经做了测试并验证了事实上(至少在我使用的PHP版本中(,在PHP中覆盖$_POST
superglobal的值是可能的。而且,在这种特殊的情况下,这样做似乎很有意义。使用这种方法,除了身份验证模块之外,任何地方的其他站点代码都不必针对整个站点上的每个表单进行修改,以利用";保存的帖子数据";特色
所以,我问自己是否可以这样做,答案是肯定的。但是我应该吗?或者使用这种方法是否存在潜在的问题?我的一部分说这很有道理,但另一部分担心这可能是糟糕的代码设计。如果我不应该这样做,正确的方法是什么?
感谢所有的评论。我最终使用了以下代码,这些代码放在所有页面使用的公共库文件中。唯一的缺点是必须记住在任何使用特殊POST数据的函数或方法中使用global $post
。但它的优点是不像我以前的想法那样粗鲁。
if (isset($_SESSION['authSavedPost'])){
$post = $_SESSION['authSavedPost'];
unset($_SESSION['authSavedPost']); // So we don't try to re-post the same data twice
}
else{
$post = $_POST;
}
如果此表单和其他表单上使用的身份验证检查功能失败,则会将当前POST数据保存为$_SESSION['authSavedPost'] = $_POST
,以便稍后通过上述代码进行恢复。