簡體   English   中英

在PHP中區分兩個會話

[英]Distinguish between two sessions in PHP

我試着通過以下方式為本地主機上的一個網站編碼。 說localhost / abc:

<?php
session_start();
$_SESSION['name']=$row['name']
?>

產量很好。 但是當同一個代碼用於同一個本地主機上的另一個網頁時,請說localhost / xyz。 然后名字之間存在歧義。 好像我需要區分xyz和abc的會話。

所以我嘗試了這個:

<?php
session_id(226);
session_name(veer);
session_start();
.
.
.//connection with database and all
.
$_SESSION['name']=$row['name'];
echo($_SESSION['name']);
?>

當另一台計算機通過同一服務器登錄時,我創建的會話可由該計算機訪問同一網頁。

有什么解決方案嗎? 或者如何區分兩個會話。

換句話說,當您使用相同的瀏覽器實例訪問同一Web服務器上的兩個不同站點時,您正在訪問服務器的相同內存區域。 從而

http://localhost/xyzhttp://localhost/abc指的是同一站點localhost,因此你不會通過session_start()啟動另一個會話,而是恢復它。 你也可以像Jon說的那樣創建虛擬主機,但是為了測試我猜你是哪個,只需使用不同的瀏覽器。

此外,您無法正常在不同的計算機上共享會話,因此我認為這是您的邏輯錯誤。 或者嘗試

session_start();
echo (session_id());

在頁面頂部,看看你是否正在開始或恢復我認為你不是的同一個會話。 我認為你的頁面在不同的會話中存儲相同的數據,你被誤認為是同一個會話。

使用session_regenerate_id(); 第二個文件中的方法(xyz)。

這個?

<?php
session_start();
if (!isset($_SESSION['xyz'])) { $_SESSION['xyz'] = array(); }
$_SESSION['xyz']['name'] = $row['name'];
?>

有時而不是做上面的我只是前綴我的會話鍵示例:$ _SESSION ['xyz_name']; 在我意識到我的CPanel已經使用了自己的一些會話導致我的沖突后,我就這樣做了。

來自同一用戶代理到同一Web服務器的請求將共享同一會話,禁止顯式配置,具體取決於您的確切服務器設置。

通常這個問題是可以避免的,因為“其他網頁”實際上完全在另一個域上,因此會話cookie(以及擴展會話數據)將不會被共享。 如果要在localhost獨立運行單獨的應用程序,也應該執行此操作:在單獨的內部域上設置單獨的虛擬主機。

您也可以通過不直接使用$_SESSION來存儲數據,而是使用基於某些差異因素(如$_SESSION['SCRIPT_NAME']的子鍵來完全解決問題。 一個非常簡單的例子:

$sessionKey = "default";
if (strpos($_SESSION['SCRIPT_NAME'], "dir1/")) {
    $sessionKey = "dir1";
}
else if (strpos($_SESSION['SCRIPT_NAME'], "dir2/")) {
    $sessionKey = "dir2";
}

$_SESSION[$sessionKey]['mydata'] = 'foo';

然而,最后一個是一個非常不優雅的解決方案,我不建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM