如何使用PHP管理多个选项卡

时间:2013-07-07 19:21:36

标签: php forms session tabs

我有一个应用程序,它使用几种不同的表单来执行各种操作。某些表单以其他形式从提交中访问数据。

例如:用户在一个表单上放置一个新订单,并在另一个表单中添加一个新项目,这些项目可以添加到订单中。

因此,这导致用户可能正在添加订单并意识到必须首先添加项目。因此,自然会打开一个新标签,而不是丢失添加到订单中的信息。

目前我有一个$_SESSION['form']变量,让表单处理脚本知道在表单提交后要使用哪个函数。问题是打开多个选项卡时,最后打开的选项卡将覆盖此值。我对如何处理这个问题有一些想法,但到目前为止还没有理想的。

创意:使用哈希值识别不同的网页加载并将哈希值作为隐藏字段发送

$hash = $_POST['hash'];
$form = $_SESSION[$hash]['form'];

问题:会话重载。每次加载表单时,此方法都会生成一个新的会话值,以唯一地标识表单提交。我可以在提交时取消设置值,但如果表单页面已加载但从未提交,或者页面是否刷新,该怎么办?我希望尽可能保持会议的重量。

创意二:点击提交时使用AJAX设置$_SESSION['form']

问题:不使用JS的用户。我希望能够继续为那些喜欢在可能的情况下禁用JS的用户提供支持,尽管这种方法似乎可能会更好一些。但是,我不确定这里是否存在浏览器兼容性问题。

想法三:为每个窗口创建一个哈希ID

问题:PHP无法区分浏览器标签。到目前为止,这将是最理想的。

创意四:将表单处理脚本拆分为多个文件,从而无需使用值来选择要使用的函数。

问题:不方便,但如果它被证明是处理这个问题的唯一真正方法,我对这个想法持开放态度。但这需要相当多的重组。

有关如何在PHP中安全管理不同选项卡和会话信息的任何想法吗?

1 个答案:

答案 0 :(得分:1)

这只是我的观点,但我会使用#1--每次表单加载时,给它一个随机哈希(只需时间()的md5 +随机数即可),然后跟上那些哈希就像它们是唯一的窗口标识符一样。

是的,它会使你的会话膨胀一点,但如果它不会减慢用户的体验,我不会担心它。如果它真的困扰你,你可以跟踪你为用户创建了多少窗口ID(在会话中)并将其限制为100或1000.这将防止恶意用户编写脚本来打开数百万个窗口

请记住,当用户的会话被销毁时(通过注销/关闭浏览器),所有这些哈希也都消失了。如果你真的很勤奋,你可以拥有一个过期的系统。比如,2小时后他们将被从会议中删除。

但老实说 - 如果是我,我会把它们留在会议中而不用担心。

只需2美分, 理查德