php - 覆盖php超全局数组可以吗?
问题描述
这基本上就是我想要完成的事情。我有一个由 PHP 处理的 HTML 表单。用户需要经过身份验证才能提交此表单。但是,如果用户在填写时会话超时,我不希望用户丢失他们的工作。
我的想法是,当我执行身份验证检查时,如果失败,身份验证模块可以将$_POST
数据存储在$_SESSION
数组中,并将用户重定向到登录页面。一旦用户登录,登录页面可以将用户重定向回提交页面,然后认证模块会看到数组中有保存$_POST
的数据,并将$_SESSION
数组设置$_POST
回存储在$_SESSION
. 然后提交页面就可以正常处理表单数据了。
我已经完成了测试并验证了它实际上(至少在我使用的 PHP 版本中)可以覆盖$_POST
PHP 中超全局的值。而且,在这种特殊情况下,这样做似乎很有意义。使用这种方法,除了身份验证模块之外,无需为整个站点上的每个表单修改任何其他站点代码,以利用“保存的帖子数据”功能。
所以,我问自己是否可以做到这一点,答案是肯定的。但我应该吗?或者使用这种方法是否存在潜在问题?我的一部分说这很有意义,但我的另一部分担心这可能是糟糕的代码设计。如果我不应该这样做,那么正确的方法是什么?
解决方案
感谢所有的评论。我最终使用以下代码放置在所有页面使用的公共库文件中。唯一的缺点是您必须记住在global $post
使用特殊 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
以便以后可以通过上述代码恢复。
推荐阅读
- flutter - 如何删除文本字段的标签?
- vue.js - 离开页面时,我得到:未处理的 GraphQL 订阅错误错误:GraphQL 错误:未提供所需类型 xxx 的变量 xx
- android - 谷歌通过条纹支付
- python - 如何使用 Python 和 Pandas 查找具有单个字符的句子
- angular - 如果外部 observable 返回错误,则强制调用 switchMap 的内部 observable
- amazon-web-services - 使用 Ansible 的动态清单 (ec2.py) 的 Rundeck 作业
- python - 可靠地将数据帧从 EST(夏令时)转换为日本标准时间(无夏令时)
- android - 应用操作未使用应用操作测试工具运行
- javascript - 如何做 AjaxControlToolkit ComboBox 客户端事件
- android - 防止 VideoView Activity 中的视频屏幕截图 - Android