【问题标题】:Why the value of $_SESSION gets overwritten when the page is used from a new tab window?为什么从新标签窗口使用页面时 $_SESSION 的值会被覆盖?
【发布时间】:2016-12-05 07:21:33
【问题描述】:

我对 PHP 很陌生,所以请原谅我的无知。我面临的问题是会话变量,如下所示。

$_SESSION["input_file"] = $_REQUEST['selected_file'];

为了测试我制作的网页,我从 Firefox 浏览器的多个选项卡中打开该页面,然后单击每个选项卡上的提交。但是当我这样做时,会话变量在旧提交中被新提交覆盖。为什么每个网页都没有与之关联的唯一会话?

【问题讨论】:

  • 如果会话在页面加载之间是唯一的,那么它们将完全无用。它们存在,因此数据可以在页面加载时持续存在。
  • 那么,我应该为多个用户做些什么呢?如何使它们在不同窗口/浏览器/计算机中打开的页面具有唯一性?
  • 对于多个用户来说没问题。您的问题是因为您正在浏览器的所有浏览器选项卡中查看相同的会话。如果您想测试多个用户,请同时运行不同的浏览器和/或以隐身模式运行。
  • 你的意思是如果我从不同的设备访问该页面,它会是唯一的吗?同一台电脑上的不同浏览器怎么办?
  • 他们将被视为不同的用户。会话在浏览器/服务器连接之间是唯一的

标签: php session


【解决方案1】:

会话由 ID 标识,通常存储在 cookie 中。由于浏览器会话在所有选项卡和窗口上共享 cookie,因此您必须创建多个浏览器配置文件才能测试多用户情况。

【讨论】:

  • 所有窗口的意思是什么。你的意思是如果我打开两个 Firefox 窗口(不是同一个 Firefox 窗口上的选项卡),我也会遇到同样的问题?
【解决方案2】:

那是因为您在分配新值之前没有检查会话变量是否为空。每当执行代码时,您只是为其分配新值。

你需要做这样的事情

if(!empty($_SESSION["input_file"])){
    $_SESSION["input_file"] = $_REQUEST['selected_file'];
}

if(!isset($_SESSION["input_file"])){
    $_SESSION["input_file"] = $_REQUEST['selected_file'];
}

【讨论】:

  • 我不明白这将如何解决问题。会话变量仍将被新选项卡窗口覆盖。不会吗?
  • @pythonic 创建一个会话数组,而不是我在评论中所说的变量
  • @pythonic 不会,也不会测试代码,当页面在新标签页中打开时,旧值仍然存在于会话中。
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 2016-02-25
  • 2012-05-29
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2018-02-26
相关资源
最近更新 更多