2015-11-16 81 views
0

我登录到我的网站(在本地主机上运行),并存储用户ID在会话变量为什么我的系统会自动注销?

$_SESSION['user_id'] = $user_id; 

主要页面加载,所有的罚款。我在主页上显示用户标识,所以我确信它的价值。当我加载另一页时,使用

php = 'some_php_file.php'; 
window.open(php,php); 

第二页打开确定。但是,如果我尝试再次打开同一页面,单击主页面上的相同按钮,系统将注销。如果我在window.open()中省略第二个php(使用''代替),我可能会有同一窗口的多个副本(我不想要的),但没有自动注销的问题。

任何想法可能发生什么?

编辑:如果我关闭第二个窗口并重复该过程,我没有注销问题。我可以根据需要多次关闭并重新打开第二个窗口。只有当我尝试打开第二个窗口时,问题才会发生,但它已经打开。我也可以打开不同的'第二个窗口'(不同的php文件)。如果我尝试在同一个窗口打开TWICE,我只会被注销。

编辑2:似乎我找到了它。之前我叫window.open(),我测试的PHP文件是否存在,使用此功能:

function fileExists(url){ 
    var http = new XMLHttpRequest(); 
    http.open('HEAD',url,true); 
    http.send(); 
    return http.status != 404; 
} 

如果我改变http.open()行

http.open('HEAD',url,false); 

有用!但manual告诉我们在第三个参数中使用'true'...我该怎么办?

+4

你有一个'在session_start()'在每个PHP入口点的开始? –

+0

是的,我有。如果我没有,自动注销的问题不会因为我省略窗口标题(php变量)而消失,是吗?其实,它第一次不会打开,是吗? – Rodrigo

回答

1

在我看来,你的fileExists函数总是返回true,因为它不会等待XHR完成。除非您指定async = false

时间可能是How to return the response from an asynchronous call?

我不知道这总是成立的结果是什么,因为你不完全分享你对这个结果做了什么。

现在,如果您想“坚持使用手册”并保留async = true(您确实应该),那么只需在回调中包装您的以下代码即可。例如: -

function fileExistsAsync(url, callback){ 
    var http = new XMLHttpRequest(); 
    http.open('HEAD',url,true); 
    http.send(); 
    http.onreadystatechange = function() { 
     if (http.readyState === 4) { 
      callback(http.status != 404); 
     } 
    } 
} 

fileExistsAsync(url, function (exists) { 
    console.log("async " + exists); 
}); 

演示:http://jsfiddle.net/52xqLfow/