2

我开始编写一个将某些用户信息存储在$_SESSION变量中的 Web 应用程序。通常的东西 - user_id,用户名等。

然后我开始使用变量来存储某些导航信息。例如,$_SESSION['organisation_id']无论用户在应用程序中的哪个位置,我都可以轻松地将“organisation_id”添加到任何表中,而无需在每个页面请求中解析“organisation_id”(例如 index.php?organisation_id=456&var2=6 或 anotherpage.php ?organisation_id=456& 等)

直到用户打开一个新选项卡并开始导航到另一个组织之前,所有笨拙的东西,因此$_SESSION['organisation_id']在原始选项卡上创建了一个新值并创建了一个史诗般的失败。

我能想到的唯一解决方案是回到将 organization_id 放入应用程序中的每个表单和导航元素中,但是是的,我认为必须有一个更优雅的解决方案。

通常,我可以在 StackOverflow 上找到我需要的一切,但这个问题的答案仍然让我难以捉摸!

4

6 回答 6

0

也许您可以检查 $_SESSION['organisation_id'] 是否存在,如果存在,您可以在会话中编写具有不同名称的新变量,等等。

于 2013-02-07T12:28:00.223 回答
0

您可以在该用户名的 onblur 期间将值存储到会话中,等等,您可以在单击下一个选项卡之前获取它

(即)使用 Jquery/Javascript 你可以在 onblur 时获取用户名等的值并将其存储在会话中。

于 2013-02-07T12:37:35.030 回答
0

我认为这是一个逻辑问题。会话代表用户的状态。这是因为 HTTP 本质上是一个无状态协议(它不知道谁是谁,只是理解请求和响应)。

所以organization_id是一个状态。如果用户只能登录一个组织,您只需像以前一样将其存储在会话变量中并使用它。如果用户注销并再次使用另一个登录organization_id,则只有最后一个仍然可用是有意义的。

如果您的应用程序必须支持多个organization_id',您应该在会话处理中反映该逻辑,例如保存一组组织 ID(而不仅仅是一个)。但是您必须更改您的应用程序以允许用户从一个组织导航到另一个组织,等等。如果屏幕只显示其中一个,那么让用户同时进入两个组织是没有意义的。

于 2013-02-07T12:33:01.523 回答
0

您可以通过简单地将当前放入$_SESSION数组的数据移动到 内的子数组中来解决此问题$_SESSION,这样您就可以在会话中一次存储多组数据。

它最终看起来有点像这样:

$_SESSION[organisations] = array(
     '456' => array('organisationID'=>456, 'otherdata'=>'blah'),
     '678' => array('organisationID'=>678, 'otherdata'=>'blah'),
     ...etc...
);

这将允许您一次将多个组织的数据保存在会话数据中,因此您不必每次都加载所有数据。

但是,是的,您需要在每个请求中发送相关的组织 ID,以便您的代码知道要使用会话数据的哪个元素。你无法真正解决这个问题。每个请求都需要告诉 PHP 使用哪个 orgID。

这里的缺点是,通过将所有数据存储在会话中,您为会话数据使用了更多内存,因此如果用户有可能在会话期间浏览很多组织,我会建议$_SESSION通过删除一段时间未使用的数据来限制大小。

另一个缺点是,如果这是一个多用户系统,将数据存储在会话中意味着它将不知道其他用户所做的任何更新。如果您要在每次请求时从数据库中加载新数据,是的,它会为数据库创建更多工作,但它会确保提供给用户的数据始终是最新的。

于 2013-02-07T12:41:15.307 回答
0

“我能想到的唯一解决方案是回到将 organization_id 放入应用程序中的每个表单和导航元素中,但是是的,我认为必须有一个更优雅的解决方案。”

不,没有。

于 2013-02-07T12:23:29.367 回答
0

目前没有办法解决这个问题。但是为了避免将来发生类似的任务,我建议将所有文件拆分为不同的包含。因此,即使您必须向整个站点添加几个变量,您也可以修改 1 个文件并完成它,而不是再次执行整个操作。

于 2013-02-07T12:31:06.223 回答