Cookie與會話在 Web 編程中十分實用:Cookie 能實現一周免登錄,還能記住用戶的主題偏好;會話可保存當前用戶信息,也能臨時存儲購物車數據。本篇文章將記錄Cookie與會話的學習過程。
一、Cookie
cookie 常用于識別用戶。cookie 是服務器在用戶的計算機上嵌入的一個小文件。每當同一臺計算機使用瀏覽器請求頁面時,它也會發送該 cookie。
1、創建/檢索 cookie
setcookie()?函數用于創建 cookie。
setcookie(string $name,string $value = "",int $expires_or_options = 0,string $path = "",string $domain = "",bool $secure = false,bool $httponly = false
): bool
setcookie() 定義了 Cookie,會和剩下的消息頭一起發送給客戶端。必須在腳本產生任意輸出之前發送 Cookie(由于協議的限制)。請在產生任何輸出之前(包括<html>和<head>或者空格)調用本函數。
一旦設置 Cookie 后,下次打開頁面時可以使用 $_COOKIE 讀取。
參數
name | 必需。Cookie 名稱。 |
value | 可選。Cookie 值。這個值儲存于用戶的電腦里,不要儲存敏感信息。比如 name 是 'cookiename',可通過 $_COOKIE['cookiename'] 獲取它的值。 |
expires_or_options | 可選。Cookie 的過期時間。這是 Unix 時間戳,即紀元以來的秒數。一種設置此值的方式是將 cookie 過期前的秒數與調用 time() 的結果相加。例如,time()+60*60*24*30 就是設置 Cookie 30 天后過期。還有一種選擇就是使用 mktime() 函數。如果設置為 0 或者忽略,Cookie 會在會話結束時過期(關掉瀏覽器時)。 |
path | 可選。Cookie 有效的服務器路徑。設置成 '/' 時,Cookie 對整個域名 domain 有效。如果設置成 '/foo/',Cookie 僅僅對 domain 中 /foo/ 目錄及其子目錄有效(比如 /foo/bar/)。默認值是設置 Cookie 時的當前目錄。 |
domain | 可選。Cookie 的有效域名/子域名。設置成子域名(例如 'www.example.com'),會使 Cookie 對這個子域名和它的三級域名有效(例如 w2.www.example.com)。要讓 Cookie 對整個域名有效(包括它的全部子域名),只要設置成域名就可以了(這個示例里是 'example.com')。 |
secure | 可選。設置這個 Cookie 是否僅僅通過安全的 HTTPS 連接傳給客戶端。設置成 true 時,只有安全連接存在時才會設置 Cookie。如果是在服務器端處理這個需求,程序員需要僅僅在安全連接上發送此類 Cookie(通過 $_SERVER["HTTPS"] 判斷)。 |
httponly | 可選。設置成 true,Cookie 僅可通過 HTTP 協議訪問。這意思就是 Cookie 無法通過類似 JavaScript 這樣的腳本語言訪問。要有效減少 XSS 攻擊時的身份竊取行為,可建議用此設置(雖然不是所有瀏覽器都支持)。 |
返回值?
如果 setcookie() 成功運行,返回 true。
通過 $_COOKIE 可以獲取 cookie 中設置的內容。
$_COOKIE['cookie名稱']
示例
<?php
$cookie_name = "user";
$cookie_value = "張三";
setcookie($cookie_name, $cookie_value, time() + 3600); // 1小時過期
?>
<html><body><?phpecho "<h1>歡迎您:" . $_COOKIE[$cookie_name] . "</h1>";?></body>
</html>
注意:setcookie()?函數必須出現在 <html> 標簽之前。
2、修改 cookie 值?
要修改 Cookie,只需再次使用 setcookie() 函數設置 cookie 即可:
<?php
$cookie_name = "user";
$cookie_value = "李四"; // 將 "張三" 更改為了 "李四"
setcookie($cookie_name, $cookie_value, time() + 3600); // 1小時過期
?>
<html><body><?phpecho "<h1>歡迎您:" . $_COOKIE[$cookie_name] . "</h1>";?></body>
</html>
3、刪除 cookie
要刪除一個 Cookie,應該設置過期時間為過去,以觸發瀏覽器的刪除機制。
<?php
// 設置過期時間為一小時前
setcookie("user", "", time() - 3600);
?>
二、會話
會話(session)是一種(在變量中)存儲信息以供跨多個頁面使用的方法。與 cookie 不同,這些信息不會存儲在用戶的計算機上。默認情況下,會話變量在用戶關閉瀏覽器之前一直存在。換句話說,瀏覽器關閉后,會話變量將被銷毀。
1、開始 PHP 會話
會話通過?session_start()?函數開始。
session_start(array $options = []): bool
session_start() 會創建新會話或者重用現有會話。如果通過 GET 或者 POST 方式,或者使用 cookie 提交了會話 ID,則會重用現有會話。
參數
options | 此參數是一個關聯數組,如果提供,那么會用其中的項目覆蓋 會話配置指示 中的配置項。此數組中的鍵無需包含 session. 前綴。 |
?返回值
成功開始會話返回 true ,反之返回 false
會話變量通過 PHP 全局變量:$_SESSION?設置。
現在,創建一個名為 "demo_session1.php" 的新頁面。在該頁面中,啟動一個新的 PHP 會話并設置一些會話變量:
<?php
// 開始會話
session_start();
// 設置會話變量
$_SESSION["username"] = "張三";
$_SESSION["age"] = "18";
注意:session_start() 函數必須是您文檔中的第一個內容。在任何 HTML 標簽之前。
2、獲取 PHP 會話變量值?
通過 $_SESSION 可以獲取 session 中設置的內容。
$_SESSION['session名稱']
現在,我們來創建另一個名為 "demo_session2.php" 的頁面。從該頁面,我們將訪問在第一頁("demo_session1.php")上設置的會話信息。
需要注意的是,會話變量不是單獨傳遞給每個新頁面的,而是從我們在每個頁面開始時打開的會話(session_start())中檢索的。
<?php
// 開始會話
session_start();
?>
<html><body><?php// 輸出上一頁面設置的會話變量echo "姓名: " . $_SESSION["username"] . "<br>";echo "年齡: " . $_SESSION["age"];?></body>
</html>
3、修改 PHP 會話變量
要更改會話變量,只需重寫它:
<?php
// 開始會話
session_start();
// 要更改會話變量,只需重寫它
$_SESSION["username"] = "李四";
$_SESSION["age"] = "25";
4、銷毀 PHP 會話
要刪除所有全局會話變量并銷毀會話,需使用?session_unset()?和?session_destroy()。
session_unset:釋放所有的會話變量。
session_unset(): bool
session_unset() 會釋放當前會話注冊的所有會話變量。
返回值
成功時返回 true, 或者在失敗時返回 false。
session_destroy:銷毀一個會話中的全部數據。
session_destroy(): bool
返回值
成功時返回 true, 或者在失敗時返回 false。
示例
<?php
// 開始會話
session_start();
?>
<html><body><?php// 釋放所有會話變量session_unset();// 銷毀會話session_destroy();?></body>
</html>