使用unset()和浏览器后退按钮的会话问题

时间:2010-12-20 19:52:18

标签: php caching session back-button

我正在使用SESSION变量来设置Postgres的预分配记录ID(获取记录ID序列)使用PEAR的DB nextId()。我将I id设置为会话变量,因为我正在使用的遗留代码中存在范围问题。 INSERT发生后,我使用unset()删除SESSION变量(这是为了清除使用的记录ID)。会话中还有更多信息保持不变,它只是被删除的next_id元素。

伪代码:

// Get the next Id and set to SESSION
$_SESSION['next_id'] = $db->nextId();

... more code here

// After insert
unset($_SESSION['next_id']);

我的问题是,点击浏览器上的后退按钮会以某种方式重置SESSION变量$_SESSION['next_id']吗?可能导致它为NULL?在删除元素但用户已返回到先前状态后,CACHE如何处理SESSION?

编辑: 问题的原因是生产中的代码是随机的(由任何用户)尝试INSERT与NULL记录ID(这是来自SESSION的next_id)。只是尝试调试过程,因为代码非常小,由我的同行审查并且刚刚困扰我们???

编辑2: 哇,我想我是如何使用SESSION变量的。 好吧,我会尽可能多地解释为什么我选择这种方法。 首先,代码正在从PHP 4重写,但是当前的生产版本大多是PHP 4,并且在PHP 5中添加了一些新添加的模块代码。 我选择SESSION变量的原因是因为需要在几百页遗留代码或一页上硬编码的范围问题并将值转换为所有页面都可以访问的SESSION。 (好吧,我的老板像我选择的那样支付我的工资)。 最初的问题是他们(我的老板)想在插入信息之前向最终用户显示id。因此PEAR DB调用nextId()。我们使用PostgreSQL并且我正在使用记录id序列来确保下一个id是唯一的并且仅分配给最终用户(没有重复,因为Postgres处理在序列中锁定它)。 因此,最终用户也可以在此过程中导航到多个页面,这也是另一个范围问题。 现在使用SESSION并通过一些验证和检查来检索下一个Id,整个过程大约有50行代码,而不是为了正确的方式而编写的数千行代码。 首先不是我的代码,只是以最低的成本制定最佳解决方案。

如果您有其他更好,更好,更容易,更便宜的解决方案,请随时发布。但是如果你要对我如何编码的决定感到厌烦,那么请支付我的账单,我将完全同意遵循更好的编码标准,实践和解决方案。

4 个答案:

答案 0 :(得分:1)

无法想象您需要在会话中存储nextId()以在下一页上使用的场景。

正如webbiedave指出的那样 - $ _SESSION存储在服务器上,所以没有按下后退按钮就不会“重置”会话变量。

但是,如果用户在第二页(清除_SESSION变量的页面)上点击刷新,则会再次启动脚本,并将next_id设置为null(因为它在前一页上设置为nextId())

如果用户点击后退按钮并且前一页将从浏览器缓存加载,则会发生同样的情况 - 没有请求服务器,_SESSION中没有next_id变量。


但是,如果将nextId()存储在_SESSION中,那么确实存在一些问题。

答案 1 :(得分:1)

如果$ _SESSION ['next_id']出现NULL,只需绕过插入所有的NULL,即使这意味着在你到达你不想触摸的遗留代码之前调用die()。

答案 2 :(得分:1)

您确定会话本身没有在服务器端刷新吗?我遇到了共享托管环境中的情况,其中服务器设置导致我的会话消失。我不得不在我的应用程序中添加本地设置来克服这个问题(私有而非常见的会话存储)。

这些是我在.htaccess文件中为会话设置的设置,让他们在磁盘上有合理的时间

php_value session.gc_probability 1
php_value session.gc_divisor 100
php_value session.gc_maxlifetime 3600

答案 3 :(得分:0)

找到问题的原因。最终用户在他们的浏览器中打开多个选项卡,导致SESSION数据跨越任何打开的选项卡,因为他们都会调用同一个会话。因此,在一个选项卡中提交一个请求,在所有选项卡中取消设置会话。因此,当他们在第二个选项卡中提交请求时,会话缺少next_id值,从而导致所有问题。用户培训目前将解决这个问题,但希望尽快以新的方式实施。

感谢所有的努力