如何在PHP中保持浏览器选项卡的独立性



在阅读了大量与我想做的事情相关的帖子后,我很确定这是不可能的,但我还是会问这个问题,希望有人之前已经解决了这个问题,或者能为我指明正确的解决方向。

我有一个复杂的PHP/MySQLWeb应用程序,我希望在其中保持浏览器选项卡/窗口的独立性。例如,用户可以在一个选项卡中对数据库进行搜索,并且在另一选项卡中进行另一搜索,并且当进行搜索时设置和存储的各种参数仅链接到相关的浏览器选项卡。重新加载选项卡或在搜索中进一步移动(分页系统限制存储的结果数量)不会干扰其他搜索选项卡,并且仅使用与当前选项卡标识的参数。

我的想法是将与浏览器选项卡相关的搜索和其他参数存储在一个数据库表中,该表由与选项卡相关的一些唯一标识符键入

我不能使用PHP会话,因为这些会话在各个选项卡中都很常见。PHP作为服务器端,不知道请求来自哪个选项卡/窗口。Cookie和会话一样,在各个选项卡中都很常见。

跟踪不同选项卡/窗口的解决方案似乎是javascript的sessionStorage,乍一看似乎很理想——我可以设置一个浏览器选项卡唯一的js会话,并将其回显到PHP脚本,在每个选项卡中,我可以设置并保持一个独立的值。然而,我需要将js会话值分配给一个PHP变量,这需要在PHP脚本的搜索部分运行之前可用。除了加载URL之外,用户没有任何交互(即没有表单提交等)。

我遇到过一些建议AJAX/JQuery的解决方案,但这些都需要一个表单和一些类型的用户交互,在PHP脚本运行后,我看到的大多数例子都是在div的innerHtml中编写的。

最近,我一直在考虑通过网关URL解析应用程序的每个页面,该URL只需加载一个javascript脚本,创建js会话(如果尚未创建),然后重定向到具有唯一标识符的实际PHP脚本,作为查询字符串的一部分。但这似乎涉及不必要的开销。

我们将竭诚接受任何建议甚至解决方案。

–––>

针对ADyson(因为评论框太短):

应用程序在这里:https://testdrive.wikindx.com/

它是为学者/研究生管理参考资料。它们都以不同的方式工作,包括有些人喜欢打开多个选项卡进行不同的搜索,这就是问题所在。例如,每次搜索都会产生显示在网页上的结果,但也会产生其他信息,如搜索参数(供参考)。分页系统(例如,显示10个结果/页)的设计是为了进入下一页使用更快、更高效的SQL调用——所有繁重的工作都是在初始搜索中完成的。搜索参数和摘要结果/总计是在第一次调用时完成的,这些参数和摘要和摘要必须与核心SQL子查询一起保存在某个位置。基本上,有一些数据在搜索的不同页面上是常见的,必须存储在某个地方,并且对于浏览器选项卡中的搜索是唯一的

选项卡的URL需要具有唯一性。互联网是无状态的,所以浏览器在刷新后不知道它是标签一还是标签二,除非url告诉它是这样

如果你在标签url中有一个标识符,比如数字或散列,那么你可以使用它来保存并返回会话中的特定信息:

$_SESSION['tabs'][0]

因此,启动新的选项卡/搜索需要您跟踪并增加用户的选项卡ID:

CCD_ 2或使用一些随机散列生成器。

您已经提到使用ajax,这也是一种可能的选择。有了这个,您可以将标识符存储在url#tab-1的哈希中,否则可以使用相同的url。然后,您需要使用javascript从选项卡的哈希中获取标识符,并通过ajax发送一个包括该标识符的请求,要求服务器(PHP)为您生成与之匹配的特定搜索结果/页面,然后您可以使用它来填充页面。

这是我的解决方案。它使用javascript来检查选项卡/窗口是否存在唯一ID,并使用sessionStorage来存储该唯一ID。我还没有测试过,如果用户有一个不使用sessionStorage的旧浏览器,我的应用程序仍然可以工作——这目前在Firefox、Safari和Chrome中都可以工作。

我的index.php的业务端。javascript是完成一些基本环境配置后运行的第二件事(这就是WIKINDX_URL_BASE等的来源):

/**
* Generate/return the unique browser tab/window identifier
*/
$script = WIKINDX_URL_BASE . '/gatekeeper.js?ver=' . WIKINDX_PUBLIC_VERSION;
$qs = $_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : FALSE;
$url = WIKINDX_URL_BASE . '/index.php' . $qs;
if (!array_key_exists('browserTabID', $_GET)) {
// go into gatekeeper for a redirect and addition of a browserTabID to the querystring
print <<< END
<script src="$script"></script>
<script>redirectSet("$url", "$qs")</script>
END;
}
else {
// go into gatekeeper to check if browserTabID is unique to the tab (perhaps user has `opened link with browserTabID in a new tab/window)`
$id = $_GET['browserTabID'];
print <<< END
<script src="$script"></script>
<script>getBrowserTabID("$url", "$qs", "$id")</script>
END;
}

还有我的登机口.js:

// gatekeeper.js
/**
* No browserTabID yet set so generate one and redirect
*/
function redirectSet(url, qs)
{
var browserTabID;
if ((sessionStorage.getItem('browserTabID') == null) || !sessionStorage.getItem('browserTabID')) {
browserTabID = uuidv4();
sessionStorage.setItem('browserTabID', browserTabID);
} else { // This shouldn't be necessary but is here for completeness. Perhaps of use in the future . . .
browserTabID = sessionStorage.getItem('browserTabID');
}
if (qs) {
url = url + '&browserTabID=' + browserTabID;
} else {
url = url + '?browserTabID=' + browserTabID;
}
window.location.href = url;
}
/**
* browserTabID in the URL. 
* If the same as the session, URL is opened in existing tab/window so return doing nothing.
* If not the same as the session (session is null probably), URL is opened in a new tab/window so generate browserTabID and redirect
*/
function getBrowserTabID(url, qs, browserTabID)
{
if (browserTabID == sessionStorage.getItem('browserTabID')) { // Continuing in same tab/window
return;
}
// User has opened a link in a new tab/window – generate a new ID
browserTabID = uuidv4();
sessionStorage.setItem('browserTabID', browserTabID);
if (qs) {
url = url + '&browserTabID=' + browserTabID;
} else {
url = url + '?browserTabID=' + browserTabID;
}
window.location.href = url;
}
/**
* Code from https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid
*/
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}

代码在index.php中运行后,我就可以访问$_GET['browserTabID'],然后我可以使用它来访问数据库表行。

标记

相关内容

  • 没有找到相关文章