Php 检测当前选项卡

Php 检测当前选项卡,php,javascript,html,Php,Javascript,Html,是否可以检测一个页面是否在两个不同的浏览器中打开 我开发了一个小应用程序,它在$_SESSION中存储一些数据,问题是当打开多个选项卡时,会话变量会被覆盖(搜索表单中的搜索过滤器),因此这些选项卡可能会为明显不同的搜索显示相同的结果 此应用程序使用的主浏览器是IE,因此解决此问题花了一段时间,应用程序变得更大,更难修改 在修复此搜索的所有引用之前,我希望执行“快速修复”并拒绝打开同一页面的两个选项卡,或者至少显示警告 编辑: @阿琼:是的,我知道,但是当用户返回到搜索页面时,我必须恢复搜索过滤器

是否可以检测一个页面是否在两个不同的浏览器中打开

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

此应用程序使用的主浏览器是IE,因此解决此问题花了一段时间,应用程序变得更大,更难修改

在修复此搜索的所有引用之前,我希望执行“快速修复”并拒绝打开同一页面的两个选项卡,或者至少显示警告

编辑: @阿琼:是的,我知道,但是当用户返回到搜索页面时,我必须恢复搜索过滤器:)所以$SESSION是解决这个问题的方法。此外,过滤器是由AJAX发送的,当您有很多过滤器时,很难进行调试(GET的大小有限,所以我使用POST)

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


@戈托克:我知道..但它的设计考虑到了IE6,大多数用户(大约90%)在登录这个应用程序时仍然使用IE6。。。所以我从来没有看到过需要考虑多个开放选项卡。

从不拒绝用户的基本可用性。

< P> >我看到两个问题:

  • 您拒绝用户在多个选项卡中打开网页,这几乎是web应用程序的一项要求
  • 这个问题带来了一个设计问题

  • 您可能想考虑将您的<代码> $ySale变量更改为A,而不允许它被多个页面视图覆盖。

    < P>这是一个应该尽快解决的设计问题。不过,一种快速且肯定肮脏的处理方法是将客户端的IP地址存储在$_会话中(
    $IP=$_服务器['REMOTE\u ADDR'];
    ),然后检查,如果从该地址发出多个请求,则不创建新会话或显示警告。这将给通过共享相同IP地址的LAN的访问者带来问题。我再也想不到了。。快速(或脏)

    我建议避免使用$\u会话来存储搜索筛选器,而是将它们编码到搜索查询字符串中(即/search.php?filter1=val和filter2=val等)。这样,每个窗口都有一个唯一的URL,避免了对另一个窗口的冲击。

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

    e、 g.每次提交表格时

    $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?key=$key的url,然后通过

    $filters = &$_SESSION['search_filters'][$_GET['key']];
    if (!isset($filters)) die('cannot find search');
    
    //do stuff with data
    print_r($filters);
    

    你会遇到的一个问题是,随着用户执行更多的搜索,会话将变得越来越大,我还是同意arjun的回答,但我想我会添加另一种可能的方法

    他已经说过他想要一个快速而肮脏的临时解决方案。无论如何,我不明白单例模式在这种情况下有什么帮助。单件$U会话?php中没有应用程序,因此也不可能有单例。响应结束时,每个对象都会死亡。