Javascript 为什么我的PHP站点在两个cookie值之间交替?

Javascript 为什么我的PHP站点在两个cookie值之间交替?,javascript,php,cookies,Javascript,Php,Cookies,编辑:我最终能够自己解决这个问题。(见下文。) 我目前正在建立一个网上商店,在那里你可以在购买之前配置你的产品。所有配置数据都存储在服务器上的PHP会话中。虽然我们有一个单独的按钮用于启动新配置,但事实证明,在帮助客户时,我们的许多员工只需在Chrome中打开一个新选项卡,然后从那里启动新配置。如果他们继续尝试保存配置数据,则单个选项卡中的所有配置都会混淆,因为它们都保存到$\u会话中的同一数据数组中 在互联网上进行了一些研究(包括SO)之后,我们决定在每次执行脚本时设置应用程序id,如$app

编辑:我最终能够自己解决这个问题。(见下文。)

我目前正在建立一个网上商店,在那里你可以在购买之前配置你的产品。所有配置数据都存储在服务器上的PHP会话中。虽然我们有一个单独的按钮用于启动新配置,但事实证明,在帮助客户时,我们的许多员工只需在Chrome中打开一个新选项卡,然后从那里启动新配置。如果他们继续尝试保存配置数据,则单个选项卡中的所有配置都会混淆,因为它们都保存到
$\u会话中的同一数据数组中

在互联网上进行了一些研究(包括SO)之后,我们决定在每次执行脚本时设置应用程序id,如
$app_id=time()。然后,ID将包含在页面中,并在处理客户端配置的脚本中设置为JavaScript属性。在每个AJAX请求中,ID都会与其他数据一起发送,以便将更改应用于正确的配置

现在配置数据不再混淆,但每次用户重新加载页面时,都会设置一个新ID并加载标准配置。谷歌和其他一家公司再次向我指出了使用cookie来解决问题的方向,比如在这篇文章中:现在我在我的
标签中添加了
onunload=“prepareforefresh()”
,每次卸载时我都会将ID保存到一个名为
APP\u ID
的cookie中。然后我修改了我的PHP脚本以检查是否存在此cookie,如下所示:

if (isset($_COOKIE['APP_ID'])) { // ID has been set on unload

    $app_id = $_COOKIE['APP_ID']; // set ID to previous value
    $cookie = setcookie('APP_ID', '', time() - 4800); // unset cookie
    echo 'refresh';

} else {

    $app_id = time(); // set ID to new value
    echo 'new page';
}

这一切都在某种程度上起作用,JavaScript在卸载页面时正确设置cookie,我的PHP脚本可以访问存储的值。不幸的是,我想我一定错过了什么。我的站点现在在每次刷新时都在两种配置之间切换。使用
$app\u id=time()
通过类似
的JavaScript取消cookie设置不是一个好主意–如果我一次打开多个新选项卡,这些请求也可能在同一秒内到达您的服务器,最后我又得到了两个相同的“id”。改为使用
uniqid
。而具有15秒寿命的cookie也不是一个好主意-客户端的时间可能很容易被这样的值“关闭”,并且由于cookie的过期日期是与客户端的时间进行比较的,这可能会导致cookie比您想要的更早过期。由于您使用的是同一个cookie名称,我甚至不知道如何解决多个选项卡的问题–它们只会覆盖cookie值,您就会回到开始的地方…@CBroe:感谢您提供有关
uniqid()
的提示,我将在我的代码中对此进行更改。关于覆盖:这正是我的想法,取决于客户端的时间顺序或连接速度不是一个好主意。鉴于用户一次只能在一个选项卡中处于活动状态,我只想知道什么是活动选项卡。并且(在重新加载的情况下)我希望保留ID并防止我的脚本通过
$app\u ID=uniqid()
创建新的ID。你有什么想法吗?
if (isset($_COOKIE['APP_ID']) && $_COOKIE['APP_ID'] != '') { // ID has been set on beforeunload

    $app_id = $_COOKIE['APP_ID']; // set ID to previous value

} else {

    $app_id = uniqid(); // set ID to new value
}
function unsetCookie() {

    document.cookie = 'APP_ID=;'; // unset cookie
}

function setCookie() {

    document.cookie = 'APP_ID=' + $('#my-element').data('app-id') + ';';
}