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


How to manage multiple tabs with PHP

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

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

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

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

想法一:使用哈希值来识别不同的页面加载,并将哈希作为隐藏字段发送

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

问题:会话过载。此方法将在每次加载表单时生成一个新的会话值,以唯一标识表单提交。我可以在提交时取消设置值,但如果加载了表单页面却从未提交,或者刷新了页面,该怎么办。我希望会议尽量轻一些。

想法二:点击提交后使用AJAX设置$_SESSION['form']

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

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

问题:PHP无法区分浏览器选项卡。这将是迄今为止最理想的。

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

问题:不方便,但如果这个想法被证明是处理这个问题的唯一真正方法,我愿意接受。不过,这将需要相当多的重组。

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

这只是我的观点,但我会使用想法#1——每次加载表单时,给它一个随机哈希(只需时间的md5()+随机数就足够了),然后像使用唯一的窗口标识符一样使用这些哈希。

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

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

但老实说,如果是我,我会把他们留在会议上,不用担心

只有我的2美分,Richard