2011-08-31 100 views
1

我很困惑,爲什麼這是工作;爲什麼cookies和session的組合使用起作用?困惑

setcookie("user", $user_id, time()+604800); 
session_start(); 
$_SESSION['user_id'] = "string"; 

即使setcookie()沒有提及$_SESSION['user_id'],當我回聲$_SESSION['user_id']從代碼另一頁:

session_start(); 
echo $_SESSION['user_id']; 

它打印string

我的印象是,setcookie()必須引用$_SESSION鍵才能從任何頁面調用它?

也許我的基地很好,但我只是想確保我明白爲什麼在我實施它之前這是行得通的,因爲我寧願它不會因爲錯誤的使用而發生故障。

任何幫助,意見,建議和解釋將不勝感激!

回答

0

setcookie()向瀏覽器發送通用cookie,而session_start()初始化會話向瀏覽器發送會話cookie。通過setcookie(),您可以發送任何您想要的cookie,例如用戶的用戶名和密碼以便在訪問之間記住,或任意文本。請注意,所有這些都存儲在cookie本身中,可以由用戶操作,因此不應該被信任。

session_start(),另一方面,一切都是服務器端處理。在cookie中發送的唯一東西是會話標識符。會話數據不能由瀏覽器直接操作。 PHP還處理碰撞預防,數據存儲(默認情況下是純文本文件,只能由root用戶查看並存儲在/ tmp中)和失效日期(即使cookie由瀏覽器操作)。

本質上,即使這些功能類似,因爲它們都向瀏覽器發送cookie,它們都服務於完全不同的目的。

0

只有會話ID存儲在cookie中;用於將來自同一用戶的多個請求鏈接爲一個會話。在發送來自客戶端的請求時,來自cookie的會話ID在請求中被髮送,並且服務器使用該ID來識別客戶端並檢索會話的內容。存儲在會話中的實際變量存儲在服務器上。

+0

我認爲它是默認存儲或其他東西?因爲我實際上沒有要求手動存儲'$ _SESSION ['id]'。 –

+1

PHP在您開始會話時會自動處理該事件。 HTTP通過設計是一種無狀態協議,並且使會話起作用的唯一一個會話是包含會話ID的cookie。會話的_contents_由您​​控制,並存儲在服務器端。 – Rijk

+0

所以這是一個不同於由'setcookie()'創建的cookie,與我的OP一樣。我也發現這個我認爲可能是你在說什麼 - http://uk3.php.net/manual/en/function.session-set-cookie-params.php –

0

餅乾和會話是兩個完全不同的系統。

PHP的會話確實在cookie中使用唯一的會話ID來跟蹤會話,但其他任何cookie設置都不會影響會話,會話不會存儲在cookie中(它們存儲在服務器端的內存或文件中,具體取決於您的PHP配置)。

session_start()創建唯一的會話ID並將其存儲在cookie中。

$ _SESSION ['user_id'] ='string'設置服務器端的變量。

在下一頁刷新它從唯一會話ID抓取會話並填充$ _SESSION變量以及在其他請求中設置的所有內容。

+0

那麼這是如何工作呢?我認爲'SID'必須被聲明爲要傳遞的會話的url參數 - http://uk3.php.net/manual/en/session.idpassing.php(它還提到了有關會話cookie的內容?) –

+0

它通常首先默認爲cookie,在您的Cookie中查找PHPSESSID,這通常是您爲您生成的會話PHP。 – StrangeWill