2008-12-29 68 views
0

是否有可能檢測到頁面是否在2個不同的瀏覽器中打開?檢測當前標籤

我已經構建了一個小應用程序,它將一些數據存儲在$ _SESSION中,問題是當打開多個選項卡時,會話變量被覆蓋(搜索表單中的搜索過濾器),因此選項卡可能會顯示對於明顯不同的搜索,結果相同。

這個應用程序使用的主要瀏覽器是IE瀏覽器,所以它需要一段時間來打這個問題,應用程序得到..更大,更難以修改。

,直到我解決這個搜索到所有的引用,我願做一個「快速&髒的修復」,並拒絕打開兩個卡口與同一個頁面,或至少顯示警告..

編輯: @arjun:是的,我知道,但是當用戶返回到搜索頁面時,我必須恢復搜索過濾器:)所以$ SESSION是這樣的方式。另外,這些過濾器通過AJAX發送,當你有很多過濾器(GET的大小有限,所以我使用POST)時,它很難調試。

@tomhaigh:thx..but這就是我試圖做現在,但這將需要一段時間,因爲這個標籤「東西」影響整個應用程序,我必須改變所有模塊中的過濾器...我一直在尋找快速&髒東西。提示:我不想使用time()和rand(),因爲這些函數可以(並最終會)生成重複的數字。在新的「重寫」中,我使用PHP中的microtime和JS中的Date.getTime(),並將它們連接起來以生成一個真正唯一的ID。此外,我寫了一個函數來解析SESSION不時並清理超過2小時的存儲過濾器,所以它不會變得太大。

@Gortok:我知道..但是是設計與IE6在腦海裏和大多數用戶(如90%)仍然使用IE6登錄到這個應用程序...所以我從來沒有看到需要考慮多個打開標籤。

回答

1

那麼這是一個應儘快解決的設計問題。儘管如此,處理這個問題的一個快速且非常骯髒的方法是將客戶端的IP地址存儲在$ _SESSION($ip=$_SERVER['REMOTE_ADDR'];)中。然後檢查並且不創建新會話,或者如果從該地址發出多個請求,則顯示警告。這會對通過LAN共享相同IP地址的訪問者造成問題。我不能想更多..快速(或骯髒)

0

永遠不要拒絕用戶的基本可用性。

0

兩個問題我看到:

  1. 你拒絕用戶打開多個標籤網頁的能力 - 這幾乎是對網絡應用的需求。
  2. 此問題引發設計問題。

您可能需要考慮將您的$_SESSION變量更改爲singleton,並且不允許它被多個頁面視圖覆蓋。

+0

他已經表示他想要一個快速和骯髒的臨時解決方案。無論如何,我無法理解單身模式在這種情況下的幫助。 Singleton $ _Session?在PHP中沒有應用程序,所以不能有單身人士。響應結束時,每個對象都會死亡 – Diadistis 2008-12-29 01:52:54

6

我建議避免使用$ _SESSION來存儲搜索過濾器,而是將它們編碼在搜索查詢字符串(即/search.php?filter1 = val & filter2 = val等)。這樣,每個窗口都有一個唯一的URL並避免打開另一個窗口。

1

我同意arjun的回答,但如果您必須使用會話,那麼您可以創建一個包含PHP會話內每個搜索信息的數組。

例如每一個表單提交

$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一個網址的時間?關鍵= $鍵,然後通過

$filters = &$_SESSION['search_filters'][$_GET['key']]; 
if (!isset($filters)) die('cannot find search'); 

//do stuff with data 
print_r($filters); 

,你將有一個問題檢索數據是會話會隨着用戶執行更多搜索而變得越來越大,我會再次用arjun的回答,但我想我會添加另一種可能的方法