Php 未设置()和浏览器后退按钮的会话问题

Php 未设置()和浏览器后退按钮的会话问题,php,caching,session,back-button,Php,Caching,Session,Back Button,我使用一个SESSION变量来设置Postgres中预先分配的记录id(获取记录id序列),使用PEAR的DB。我将I id设置为会话变量,因为我正在处理的遗留代码中存在范围问题。插入发生后,我使用删除会话变量(这是为了清除已使用的记录id)。会话中还有更多信息保持不变,它只是下一个被删除的\u id元素 伪代码: // Get the next Id and set to SESSION $_SESSION['next_id'] = $db->nextId(); ... more co

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

伪代码:

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

... more code here

// After insert
unset($_SESSION['next_id']);
我的问题是,单击浏览器上的后退按钮是否会以某种方式重置会话变量
$\u SESSION['next\u id']
?可能导致它为空?删除元素但用户返回到以前的状态后,缓存如何处理会话

编辑: 产生此问题的原因是,生产中的代码(由任何用户)随机尝试使用空记录id(会话中的下一个\u id)插入。只是试着调试这个过程,因为代码非常少,被我的同行审查过,并且刚刚难住了我们

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


如果您有另一个更好、更大、更简单、更便宜的解决方案,请随时发布。但如果你对我关于如何编码的决定感到不满,那么请支付我的账单,我完全同意遵循更好的编码标准、实践和解决方案

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

正如webbiedave所指出的-$\会话存储在服务器上,因此不返回按钮不会“重置”会话变量

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

如果用户点击“上一步”按钮,上一页将从浏览器缓存加载,则会发生同样的情况-没有对服务器的请求,在会话中没有下一个\u id变量



但是,如果将nextId()存储在一个_会话中,仍然会出现一些问题

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

正如webbiedave所指出的-$\会话存储在服务器上,因此不返回按钮不会“重置”会话变量

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

如果用户点击“上一步”按钮,上一页将从浏览器缓存加载,则会发生同样的情况-没有对服务器的请求,在会话中没有下一个\u id变量



但是,如果将nextId()存储在一个_会话中,仍然会出现一些问题

如果$\u SESSION['next\u id']为空,则跳过所有插入操作,即使这意味着在到达不想接触的遗留代码之前调用die()。

如果$\u SESSION['next\u id']为空,则跳过所有插入操作,即使这意味着调用die())在到达旧代码之前,您不想触摸。

您确定会话本身没有在服务器端刷新吗?在共享主机环境中,服务器设置导致会话消失。我不得不在我的应用程序中添加本地设置来克服这一问题(私人而非公共会话存储)

这些是我在
.htaccess
文件中为会话所做的设置,为会话在磁盘上留出了合理的时间

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

您确定会话本身没有在服务器端刷新吗?在共享主机环境中,服务器设置导致会话消失。我不得不在我的应用程序中添加本地设置来克服这一问题(私人而非公共会话存储)

这些是我在
.htaccess
文件中为会话所做的设置,为会话在磁盘上留出了合理的时间

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

找到问题的原因。最终用户在浏览器中打开多个选项卡,导致会话数据跨到任何打开的选项卡,因为他们都会调用同一个会话。因此,在一个选项卡中提交一个请求,将取消所有选项卡中的会话。因此,当他们在第二个选项卡中提交请求时,会话缺少下一个_id值,导致了所有问题。用户培训将暂时解决这个问题,但很快就会以新的方式实现


感谢所有的努力

找到了问题的原因。最终用户在浏览器中打开多个选项卡,导致会话数据跨越