2008-12-29 69 views
0

是否有可能检测到页面是否在2个不同的浏览器中打开?检测当前标签

我已经构建了一个小应用程序,它将一些数据存储在$ _SESSION中,问题是当打开多个选项卡时,会话变量被覆盖(搜索表单中的搜索过滤器),因此选项卡可能会显示对于明显不同的搜索,结果相同。

这个应用程序使用的主要浏览器是IE浏览器,所以它需要一段时间来打这个问题,应用程序得到..更大,更难以修改。

,直到我解决这个搜索到所有的引用,我愿做一个“快速&脏的修复”,并拒绝打开两个卡口与同一个页面,或至少显示警告..

编辑: @arjun:是的,我知道,但是当用户返回到搜索页面时,我必须恢复搜索过滤器:)所以$ SESSION是这样的方式。另外,这些过滤器通过AJAX发送,当你有很多过滤器(GET的大小有限,所以我使用POST)时,它很难调试。

@tomhaigh:thx..but这就是我试图做现在,但这将需要一段时间,因为这个标签“东西”影响整个应用程序,我必须改变所有模块中的过滤器...我一直在寻找快速&脏东西。提示:我不想使用time()和rand(),因为这些函数可以(并最终会)生成重复的数字。在新的“重写”中,我使用PHP中的microtime和JS中的Date.getTime(),并将它们连接起来以生成一个真正唯一的ID。此外,我写了一个函数来解析SESSION不时并清理超过2小时的存储过滤器,所以它不会变得太大。

@Gortok:我知道..但是是设计与IE6在脑海里和大多数用户(如90%)仍然使用IE6登录到这个应用程序...所以我从来没有看到需要考虑多个打开标签。

回答

1

那么这是一个应尽快解决的设计问题。尽管如此,处理这个问题的一个快速且非常肮脏的方法是将客户端的IP地址存储在$ _SESSION($ip=$_SERVER['REMOTE_ADDR'];)中。然后检查并且不创建新会话,或者如果从该地址发出多个请求,则显示警告。这会对通过LAN共享相同IP地址的访问者造成问题。我不能想更多..快速(或肮脏)

0

永远不要拒绝用户的基本可用性。

0

两个问题我看到:

  1. 你拒绝用户打开多个标签网页的能力 - 这几乎是对网络应用的需求。
  2. 此问题引发设计问题。

您可能需要考虑将您的$_SESSION变量更改为singleton,并且不允许它被多个页面视图覆盖。

+0

他已经表示他想要一个快速和肮脏的临时解决方案。无论如何,我无法理解单身模式在这种情况下的帮助。 Singleton $ _Session?在PHP中没有应用程序,所以不能有单身人士。响应结束时,每个对象都会死亡 – Diadistis 2008-12-29 01:52:54

6

我建议避免使用$ _SESSION来存储搜索过滤器,而是将它们编码在搜索查询字符串(即/search.php?filter1 = val & filter2 = val等)。这样,每个窗口都有一个唯一的URL并避免打开另一个窗口。

1

我同意arjun的回答,但如果您必须使用会话,那么您可以创建一个包含PHP会话内每个搜索信息的数组。

例如每一个表单提交

$key = md5(rand(time(), 1)); 
if (!isset($_SESSION['search_filters'])) { 
    $_SESSION['search_filters'] = array(); 
} 

$filters = & $_SESSION['search_filters'][$key]; 

//store stuff 
$filters = array('something' => true); 

,那么你可以构建像results.php一个网址的时间?关键= $键,然后通过

$filters = &$_SESSION['search_filters'][$_GET['key']]; 
if (!isset($filters)) die('cannot find search'); 

//do stuff with data 
print_r($filters); 

,你将有一个问题检索数据是会话会随着用户执行更多搜索而变得越来越大,我会再次用arjun的回答,但我想我会添加另一种可能的方法