您現(xiàn)在的位置是:首頁(yè) >php教程 >php初級(jí)教程五 Cookie和Session網(wǎng)站首頁(yè)php教程
php初級(jí)教程五 Cookie和Session
PHP Cookie
cookie 常用于識(shí)別用戶(hù)。
Cookie 是什么?
cookie 常用于識(shí)別用戶(hù)。cookie 是一種服務(wù)器留在用戶(hù)計(jì)算機(jī)上的小文件。每當(dāng)同一臺(tái)計(jì)算機(jī)通過(guò)瀏覽器請(qǐng)求頁(yè)面時(shí),這臺(tái)計(jì)算機(jī)將會(huì)發(fā)送 cookie。通過(guò) PHP,您能夠創(chuàng)建并取回 cookie 的值。
如何創(chuàng)建 Cookie?
setcookie() 函數(shù)用于設(shè)置 cookie。
注釋?zhuān)簊etcookie() 函數(shù)必須位于 標(biāo)簽之前。
語(yǔ)法
setcookie(name, value, expire, path, domain);
實(shí)例 1
在下面的例子中,我們將創(chuàng)建名為 "user" 的 cookie,并為它賦值 "dyf"。我們也規(guī)定了此 cookie 在一小時(shí)后過(guò)期:
<?php
setcookie("user", "dyf", time()+3600);
?>
<html>
.....
注釋:在發(fā)送 cookie 時(shí),cookie 的值會(huì)自動(dòng)進(jìn)行 URL 編碼,在取回時(shí)進(jìn)行自動(dòng)解碼。(為防止 URL 編碼,請(qǐng)使用 setrawcookie() 取而代之。)
實(shí)例 2
您還可以通過(guò)另一種方式設(shè)置 cookie 的過(guò)期時(shí)間。這也許比使用秒表示的方式簡(jiǎn)單。
<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
?>
<html>
.....
在上面的實(shí)例中,過(guò)期時(shí)間被設(shè)置為一個(gè)月(60 秒 * 60 分 * 24 小時(shí) * 30 天)。
如何取回 Cookie 的值?
PHP 的 $_COOKIE 變量用于取回 cookie 的值。
在下面的實(shí)例中,我們?nèi)』亓嗣麨?"user" 的 cookie 的值,并把它顯示在了頁(yè)面上:
<?php
// 輸出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
在下面的實(shí)例中,我們使用 isset() 函數(shù)來(lái)確認(rèn)是否已設(shè)置了 cookie:
<html>
<head>
<meta charset="utf-8">
<title>標(biāo)題</title>
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "歡迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通訪客!<br>";
?>
</body>
</html>
如何刪除 Cookie?
當(dāng)刪除 cookie 時(shí),您應(yīng)當(dāng)使過(guò)期日期變更為過(guò)去的時(shí)間點(diǎn)。
刪除的實(shí)例:
<?php
// 設(shè)置 cookie 過(guò)期時(shí)間為過(guò)去 1 小時(shí)
setcookie("user", "", time()-3600);
?>
如果瀏覽器不支持 Cookie 該怎么辦?
如果您的應(yīng)用程序需要與不支持 cookie 的瀏覽器打交道,那么您不得不使用其他的辦法在您的應(yīng)用程序中的頁(yè)面之間傳遞信息。一種方式是通過(guò)表單傳遞數(shù)據(jù)。
下面的表單在用戶(hù)單點(diǎn)擊 "Submit" 按鈕時(shí),向 "welcome.php" 提交了用戶(hù)輸入:
<html>
<head>
<meta charset="utf-8">
<title>標(biāo)題</title>
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="name">
年齡: <input type="text" name="age">
<input type="submit">
</form>
</body>
</html>
取回 "welcome.php" 文件中的值,如下所示:
<html>
<head>
<meta charset="utf-8">
<title>標(biāo)題</title>
</head>
<body>
歡迎 <?php echo $_POST["name"]; ?>.<br>
你 <?php echo $_POST["age"]; ?> 歲了。
</body>
</html>
PHP Session
PHP session 變量用于存儲(chǔ)關(guān)于用戶(hù)會(huì)話(session)的信息,或者更改用戶(hù)會(huì)話(session)的設(shè)置。Session 變量存儲(chǔ)單一用戶(hù)的信息,并且對(duì)于應(yīng)用程序中的所有頁(yè)面都是可用的。
PHP Session 變量
您在計(jì)算機(jī)上操作某個(gè)應(yīng)用程序時(shí),您打開(kāi)它,做些更改,然后關(guān)閉它。這很像一次對(duì)話(Session)。計(jì)算機(jī)知道您是誰(shuí)。它清楚您在何時(shí)打開(kāi)和關(guān)閉應(yīng)用程序。然而,在因特網(wǎng)上問(wèn)題出現(xiàn)了:由于 HTTP 地址無(wú)法保持狀態(tài),Web 服務(wù)器并不知道您是誰(shuí)以及您做了什么。
PHP session 解決了這個(gè)問(wèn)題,它通過(guò)在服務(wù)器上存儲(chǔ)用戶(hù)信息以便隨后使用(比如用戶(hù)名稱(chēng)、購(gòu)買(mǎi)商品等)。然而,會(huì)話信息是臨時(shí)的,在用戶(hù)離開(kāi)網(wǎng)站后將被刪除。如果您需要永久存儲(chǔ)信息,可以把數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中。
Session 的工作機(jī)制是:為每個(gè)訪客創(chuàng)建一個(gè)唯一的 id (UID),并基于這個(gè) UID 來(lái)存儲(chǔ)變量。UID 存儲(chǔ)在 cookie 中,或者通過(guò) URL 進(jìn)行傳導(dǎo)。
開(kāi)始 PHP Session
在您把用戶(hù)信息存儲(chǔ)到 PHP session 中之前,首先必須啟動(dòng)會(huì)話。
注釋?zhuān)簊ession_start() 函數(shù)必須位于 標(biāo)簽之前:
<?php session_start(); ?>
<html>
<body>
</body>
</html>
上面的代碼會(huì)向服務(wù)器注冊(cè)用戶(hù)的會(huì)話,以便您可以開(kāi)始保存用戶(hù)信息,同時(shí)會(huì)為用戶(hù)會(huì)話分配一個(gè) UID。
存儲(chǔ) Session 變量
存儲(chǔ)和取回 session 變量的正確方法是使用 PHP $_SESSION 變量:
<?php
session_start();
// 存儲(chǔ) session 數(shù)據(jù)
$_SESSION['views']=1;
?>
<html>
<head>
<meta charset="utf-8">
<title>title</title>
</head>
<body>
<?php
// 檢索 session 數(shù)據(jù)
echo "瀏覽量:". $_SESSION['views'];
?>
</body>
</html>
輸出:
瀏覽量:1
在下面的實(shí)例中,我們創(chuàng)建了一個(gè)簡(jiǎn)單的 page-view 計(jì)數(shù)器。isset() 函數(shù)檢測(cè)是否已設(shè)置 "views" 變量。如果已設(shè)置 "views" 變量,我們累加計(jì)數(shù)器。如果 "views" 不存在,則創(chuàng)建 "views" 變量,并把它設(shè)置為 1:
<?php
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1;
}
else
{
$_SESSION['views']=1;
}
echo "瀏覽量:". $_SESSION['views'];
?>
銷(xiāo)毀 Session
如果您希望刪除某些 session 數(shù)據(jù),可以使用 unset() 或 session_destroy() 函數(shù)。
unset() 函數(shù)用于釋放指定的 session 變量:
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
您也可以通過(guò)調(diào)用 session_destroy() 函數(shù)徹底銷(xiāo)毀 session:
<?php
session_destroy();
?>
注釋?zhuān)簊ession_destroy() 將重置 session,您將失去所有已存儲(chǔ)的 session 數(shù)據(jù)。