PHP中的cookie 基礎和應用

1、原理

cookies和session是web開發中比較重要的知識點,在編程中都是貫穿始終的。php

會話能夠簡單理解爲,用戶打開一個瀏覽器,點擊多個超連接,訪問服務器多個web資源,而後關閉瀏覽器,整個過程稱之爲一個會話html

每一個用戶在使用瀏覽器與服務器進行和會話的過程當中。都會產生一些數據。好比購物車,每一個用戶查看購物車的時候,都能看到本身的選擇,可是他們用的都是一套系統(簡單的說都是訪問的後臺的相同php文件),那麼如何才能讓不一樣的人看到本身的購物車裏面的內容呢。前端

思路:保存在數據庫裏面, 這是一個不錯的方案,它的優缺點咱們在後面再討論。還有那麼一些視頻網站,能夠保存你上次看過電影(在你尚未登錄的時候),如何解決?linux

2、基礎知識

這裏先講解一些會話技術的相關基礎知識。web

1 會話技術

  • cookies
  • session

這兩個東西是有千絲萬縷的聯繫的,咱們先講cookies而後講session.sql

session與http協議有着莫大的關係,若是你以前瞭解http協議的話,你會有一個深刻的瞭解,若是沒有基礎也不要緊。數據庫

好比https://www.baidu.com 前面爲何要加https?是由於在網絡傳輸中有着各類各樣的協議,就像雙方(發送方和接受方)達成約定。咱們開始吧。apache

2 分析

你們在訪問某個網站的時候,是否能看到提示你上次登錄網站的時間,好比一些銀行,郵箱,或者qq,都會提示你曾經在何時登錄過。如何實現的? 還有在瀏覽好比淘寶京東的時候,提示你上次瀏覽的商品有哪些,不一樣用戶瀏覽過的商品確定不同,這是怎麼實現的呢?編程

如何提示用戶上次登陸網站的時間。如何保存上次用戶瀏覽的信息,如何保證用戶在必定時間內,不用反覆登錄。後端

3 cookie

在英文中是小甜餅的意思,它是一種客戶端技術,服務器把每一個用戶的數據以cookies的形式寫給用戶各自的瀏覽器。哈哈~平時是否是常常在瀏覽器中看見清除(cookies)之類的提示啊。當用戶經過一個瀏覽器再去訪問服務器中的web資源時,就會帶着各自的數據區,這樣!web處理的就是用戶各自的數據了!

服務器在客戶端保存用戶的信息,這些信息就像是小甜餅同樣,數據量並不大,服務器端在須要的時候能夠從客戶端讀取,保存在客戶端的瀏覽器緩存目錄下,都很小!!通常在2~3k以內。經過set-cookie的HTTP協議獲取。

4 cookie 的做用

保存上次登錄時間信息等等,保存用戶名,密碼,在必定時間不用從新登錄,記錄用戶訪問網站的喜歡,好比google打開首頁,自定義首頁。

3、實驗步驟

1 cookies 在瀏覽器的保存

cookie 在客戶機的某一個目錄,根據你的瀏覽器,會有不一樣的保存方式,保存的路徑還與操做系統有關。

這裏咱們以實驗樓 linux系統 火狐瀏覽器爲例子。(Windows下自行搜索)進入 firefox 的目錄(須要先打開一次瀏覽器)。

cd ~/.mozilla/firefox #而後進入第二個文件夾(不一樣環境可能有所區別)

能夠看到裏面有個 cookie.sqlite 文件,這個是一個數據庫格式文件,可見Firefox 將 cookie 數據存入了數據庫。 咱們能夠開打火狐瀏覽器查看具體的 cookie 信息:

能夠看見裏面有各類站點顯示的文件。其實就是鍵值對的字符串。

接下來咱們來寫一個用 PHP 操做 cookie 的示例,能夠在 

php手冊http://php.net/manual/zh/features.cookies.php中查看更多關於cookie的講解和用法。

2 PHP 操做cookie

2.1 cookie的存取

一、開啓Apache服務器

service apache2 start

二、進入Web根目錄

cd /var/www/html

三、修改讀寫權限

sudo chmod -R 777 /var/www/html

四、新建cookie1.php,寫入如下代碼

<?php  
//演示如何建立cookies信息
//把用戶名和密碼保存在客戶端的cookies
//這個函數用來保存cookie
//key--value的形式保存
setcookie("name","shiyanlou",time()+3600);
echo "success!";
?>

五、瀏覽器測試

打開 Firefox 瀏覽器,輸入地址:localhost/cookie1.php。

輸出 success!,說明咱們的cookie 信息已經被成功寫入。按照上面的流程,查看此時瀏覽器中所有cookie信息,就會發現了多個一條記錄:

由於咱們這裏只有一個請求,因此還能夠經過另一種方式查看cookie 信息:

這是它的一個初步使用.

注意保存多少時間是 time()+3600,time() 是當前的Unix時間戳。

代碼說明:

  • 當瀏覽器訪問cookie1.php頁面的時候,咱們的服務器就會以Set-Cookie:name=xxx;expires=xxxx 回送http響應,當瀏覽器獲取到該信息後,就會保存該cookie到新的xxx文件
  • 若是咱們沒有時間參數 cookie不會保存到客戶端,當瀏覽器的會話結束,咱們的cookie就會失效;
  • cookie保存的信息形式:鍵值對形式,客戶端能夠保存多個鍵值對;
  • cookie能夠保存中文,可是會進行 urlencode 編碼;
  • cookie能夠有多個鍵值對(而session是統一的),還能夠給不一樣的鍵值對指定不一樣的有效時間。

把cookie取出來 (超時以後就取不出來了)

新建 cookie2.php:

//cookie2.php
<?php
//獲取cookie信息
echo "<pre>";
print_r($_COOKIE);
echo "<pre>";
$name=$_COOKIE['name'];
echo "name".$name;
?>

由於在 cookie1.php 中,咱們將cookie的有效時間設置爲當前時間+3600s,即有效期爲一小時。因此如今是可以取到的,爲了方便測試,這裏講 cookie1.php 中cookie的有效期設置爲5s。固然,若是你願意等一個小時的話,也是能夠的。修改以後,執行 cookie1.php,等待5s以後,再執行 cookie2.php:

cookie 能夠分別設置各個鍵值對保存的時間,如:

setcookie('name','shiyahlou',time()+100)
setcookie('age',10,time()+200).

2.2 cookie過時

上面的代碼說明了 cookie 過了有效期以後,就會失效,爲何呢?其實這個跟http協議有關,它發包的時候沒有帶 cookie 了(由於超時過時了),http協議規定要攜帶網站cookie,全部web開發都遵循此規範。

這個機制是http協議規定的。

能夠保存多個數據,使用明文方式!!因此若是用cookie來保存密碼是很是危險的。

setcookie("name","passwd",time()+3600);
setcookies("name","shiyanlou1",time()+60); //這個值在一分鐘後會過時setcookies("name","shiyanlou2",time()+3600);
setcookies("name","shiyanlou3",time()+3600);
setcookies("name","shiyanlou4",time()+3600);

2.3 cookie的更新與刪除

更新

如何更新 cookie 信息?首先必須是是針對一個用戶,setcookie 會覆蓋以前的記錄,在 /var/www/html 目錄下建立文件 cookie3.php ,編輯以下:

<?php
setcookie("name","shiyanlou",time()+300);
echo "name is shiyanlou! <br>";
//更新
setcookie("name","chengdu",time()+300);
echo "update record, name is chengdu";;
?>

本身能夠試試哦,打開瀏覽器,輸入 localhost/cookie3.php,再次查看cookie信息,發現果真變化了。

刪除

其實刪除數據是經過修改cookie的有效時間來實現的。

  • 刪除指定鍵值
  • 刪除全部鍵值對 指定刪除某一個
    • key<==>val
    • 說白了其實就是減小它存在的時間,讓保存時間過時,時間減小多少均可以

在/var/www/html 目錄下建立 cookie4.php ,編輯以下:

<?php
//刪除指定鍵名cookie
setcookie("key","",time()-200);
//刪除全部,當所有刪掉的時候,文件夾也會被刪掉
foreach($_COOKIES as $key => $val)
{
  setcookie($key, "", time()-1);
}
?>

3 項目實戰

需求:登陸頁面信息展現

  • 顯示上次登陸的時間
  • 自動填寫用戶名和密碼

具體分析:

  • 若是用戶是第一次訪問該頁面,則提示「您是第一次訪問」
  • 若是不是第一次訪問,則顯示上一次登錄時間
  • 實現打開登錄界面,自動填寫用戶名
  • 首先在前端界面添加一個複選框

3.1 顯示上次登陸時間

實現這個功能須要一個前端界面,一個後端數據處理。

前端頁面:login.php

<html>
<head></head>
<body>
    <h1>Login In</h1>
    <form action="loginProcess.php" method="post">
        <table>
            <tr>
                <td>User id</td>
                <td><input type="text" name="id"/></td>
            </tr>
            <tr>
                <td>password</td>
                <td><input type="passwd" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" value="login"/></td>
                <td><input type="reset" value="reset"/></td>
            </tr>
        </table>
    </form>
</body>
</html>

後端邏輯:loginProcess.php

這段代碼的做用就是檢驗 cookie 是否爲空,爲空則說明是第一次登錄,不爲空則說明不是第一次登錄,就把上次登錄的時間打印出來。而後這一段代碼能夠封裝成爲一個函數,用的時候再require一次。

<?php
echo "welcome,  ".$_POST['id'].", login success!!";
echo "<br/><a href='login.php'>Back to login</a>";
if(!empty($_COOKIE['lastVist'])){
    echo "your last login time:".$_COOKIE['lastVist'];
    //更新時間
    setcookie("lastVist",date("Y-m-d H:i:s"),time()+24*3600*30); 
}else{
    //用戶第一次登錄
    echo "you first login time:";
    setcookie("lastVist",date("Y-m-d H:i:s"),time()+24*3600*30);
}
?>

打開瀏覽器,輸入地址:localhost/login.php。輸入登陸信息,就能夠看到效果了。測試過程當中,別忘了看看瀏覽器中cookie的變化。

4、實驗總結

本次實驗主要向你們介紹與cookie相關的基礎知識,並使用PHP對cookie進行寫入,讀取,更新和刪除操做,同時還了解了cookie的有效期的概念,經過實際的項目實踐PHP對cookie的操做。更多關於cookie的知識和用法請查閱PHP手冊。

5、最後

文章所有內容截選自實驗樓教程【PHP會話控制】,該教程總共4節內容,文章屬於第一節內容,主要講的是PHP中的cookie 基礎和應用;後面三節分別是:cookie 的實戰應用、session基礎與實戰、session的實戰應用,若是想要查看所有內容,點擊【PHP會話控制】便可~

相關文章
相關標籤/搜索