Php 检测当前选项卡
是否可以检测一个页面是否在两个不同的浏览器中打开 我开发了一个小应用程序,它在$_SESSION中存储一些数据,问题是当打开多个选项卡时,会话变量会被覆盖(搜索表单中的搜索过滤器),因此这些选项卡可能会为明显不同的搜索显示相同的结果 此应用程序使用的主浏览器是IE,因此解决此问题花了一段时间,应用程序变得更大,更难修改 在修复此搜索的所有引用之前,我希望执行“快速修复”并拒绝打开同一页面的两个选项卡,或者至少显示警告 编辑: @阿琼:是的,我知道,但是当用户返回到搜索页面时,我必须恢复搜索过滤器:)所以$SESSION是解决这个问题的方法。此外,过滤器是由AJAX发送的,当您有很多过滤器时,很难进行调试(GET的大小有限,所以我使用POST) @tomhaigh:thx..但这正是我现在要做的,但这需要一段时间,因为这个标签“东西”会影响整个应用程序,我必须更改所有模块中的过滤器。。。我现在正在找一些又快又脏的东西。提示:我不想使用time()和rand(),因为这些函数可以(并且最终会)生成重复的数字。在新的“重写”中,我使用PHP中的microtime和JS中的Date.getTime(),并将See 2连接起来生成一个真正唯一的id。此外,我还编写了一个函数来不时解析会话,并清理存储在2小时以上的过滤器,这样它就不会变得太大Php 检测当前选项卡,php,javascript,html,Php,Javascript,Html,是否可以检测一个页面是否在两个不同的浏览器中打开 我开发了一个小应用程序,它在$_SESSION中存储一些数据,问题是当打开多个选项卡时,会话变量会被覆盖(搜索表单中的搜索过滤器),因此这些选项卡可能会为明显不同的搜索显示相同的结果 此应用程序使用的主浏览器是IE,因此解决此问题花了一段时间,应用程序变得更大,更难修改 在修复此搜索的所有引用之前,我希望执行“快速修复”并拒绝打开同一页面的两个选项卡,或者至少显示警告 编辑: @阿琼:是的,我知道,但是当用户返回到搜索页面时,我必须恢复搜索过滤器
@戈托克:我知道..但它的设计考虑到了IE6,大多数用户(大约90%)在登录这个应用程序时仍然使用IE6。。。所以我从来没有看到过需要考虑多个开放选项卡。
从不拒绝用户的基本可用性。
< P> >我看到两个问题:您可能想考虑将您的<代码> $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中没有应用程序,因此也不可能有单例。响应结束时,每个对象都会死亡。