2015-11-16 80 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/