1. 程式人生 > >PHP會話管理和控制

PHP會話管理和控制

分享圖片 n) 驗證 只讀 head htm 數據庫連接 color 關閉

session概述

我們知道Cookie是通過將數據保存在客戶端來實現與服務端保持連接的,而session是通過將數據保存在服務器端來實現保持連接的

我們之前拿開會的例子講了一個小例子:

在幾十年前人們開會的時候,都需要帶上一個參會證。這個參會證上有這個人的職務、姓名、單位、照片等信息。在開會的時候,會議安保人員、組織者只需要檢查相關信息就行了。

這個小例子主要說明一點,人們自己帶著自己的參會證,帶著自己的信息。這種模式就是cookie。

而電腦將這段cookie信息存在了電腦的硬盤裏。

Cookie存在哪兒? Cookie的本質是一小段數據,一小段存儲在你電腦硬盤中的數據。可是它存在哪裏呢?來,我們找一下。

Chrome瀏覽器的Cookie文件的存放路徑是:
C:\Users\你的用戶名\AppData\Local\Google\Chrome\User Data\Default\Cookies

Firefox瀏覽器的Cookies文件存放路徑是:
C:\Users\你的用戶名\AppData\Roaming\Mozilla\Firefox\Profiles\rdgp36vl.default\cookies.sqlite 每個人可能略有不同

用文本編輯器直接打開Cookies文件看到的是亂碼,我們得用工具查看,如下圖:

技術分享圖片

我們來看一下需要關註的幾個列,Domain代表的是cookies所屬的網站,Name代表的是這個Cookie的名字,Value代表的是Cookie的值,Expires代表的是這個Cookie的有效期。

用一個我們熟悉的網站舉例,tudou.com,圖上我們可以看到有4個關於 tudou.com 的Cookie,那麽當我們訪問 tudou.com的時候,瀏覽器會自動把這4個Cookie的 Name 和 Value 發送到 tudou.com 這個網址所指向的服務器(PS:必須在有效期內,超出有效期的話是不會被發送到服務器的,有效期我們可以依據需求來定),如此一來,服務器就可以根據這些信息來保持與客戶端的連接了,通俗點,就是可以通過這些數據來知道你就是你。當服務器收到這些Cookies後,會根據他們的值來做一些處理,做什麽處理?這就取決於開發人員想根據這些信息來幹嘛了!

PHP會話控制之PHP中的Cookie

這節我們通過一個用戶首次登陸網站後,再次訪問不需要重復輸入用戶名和密碼的例子來學習Cookie。

首先介紹一下php中設置cookie的方法。
php中提供了一個函數來讓我們設置cookie,這個函數是:

bool setcookie  (
        string $名字
        [, string $值]
        [, int $過期時間  = 0]
        [, string $路徑]
        [, string $域名]
        [, bool $安全  = false]
        [, bool $http只讀  = false]
    );

參數 描述
$名字 必需。規定 cookie 的名稱。
$值 可選。規定 cookie 的值。
$有效期 可選。規定 cookie 的有效期。
$路徑 可選。規定 cookie 的服務器路徑。
$域名 可選。規定 cookie 的域名。
$安全 可選。規定是否通過安全的 HTTPS 連接來傳輸 cookie。
$http安讀 可選。如果true,那麽js就無法讀取改cookie,增加安全性。

一般來說,我們其實用不到上面那麽多參數,對於這個函數,我們一般這麽用: setcookie(cookie名,cookie值,cookie有效期);

沒錯,就那麽3個。如此一來,我們就可以在服務端通過$_COOKIE[‘name‘] 來讀取cookie了。

以下是示例:
我們將文件名命名為:cookie.php。

我們來模擬我們在互聯網上見到最常見的例子:輸入用戶名和密碼,登陸成功的過程。

我們來建一個數據庫login,其中有表user,有username和password這兩個字段。

<?php
//第一次登陸的時候,通過用戶輸入的信息來確認用戶
if ( ( $_POST[username] != null ) && ( $_POST[password] != null ) ) {
    $userName = $_POST[username];
    $password = $_POST[password];
    //從db獲取用戶信息
    //PS:數據庫連接信息改成自己的 分別為主機 數據庫用戶名 密碼
    $conn = mysqli_connect(localhost,root,root);

    mysqli_select_db($conn,test);

    $sql = "select * from user where `username` = ‘$userName‘ ";
    $res = mysqli_query($conn,$sql);
    $row = mysqli_fetch_assoc($res);
    if ($row[password] == $password) {
        //密碼驗證通過,設置cookies,把用戶名和密碼保存在客戶端
        setcookie(username,$userName,time()+60*60*24*30);//設置時效一個月,一個月後這個cookie失效
        setcookie(password,$password,time()+60*60*24*30);
        //最後跳轉到登錄後的歡迎頁面
        header(Location: welcome.php . "?username=$userName");
    }
}

//再次訪問的時候通過cookie來識別用戶
if ( ($_COOKIE[username] != null)  && ($_COOKIE[password] != null) ) {
    $userName = $_COOKIE[username];
    $password = $_COOKIE[password];

    //從db獲取用戶信息
    //PS:數據庫連接信息改成自己的 分別為主機 數據庫用戶名 密碼
    $conn = mysqli_connect(localhost,root,root,test);
    $res = mysqli_query($conn,"select * from user where `username` =  ‘$userName‘ ");
    $row = mysqli_fetch_assoc($res);
    if ($row[password] == $password) {
        //驗證通過後跳轉到登錄後的歡迎頁面
        header(Location: welcome.php . "?username=$userName");
    }
}

?>
<html>
<head>

</head>
<body>
<form action="" method="POST">
    <div>
        用戶名:<input type="text" name="username" />
        密  碼:<input type="text" name="password" />
        <input type="submit" value="登錄">
    </div>
</form>
</body>
</html>

跳轉到的welcome.php代碼

<?php
$user = $_GET[username];
?>
<html>
<head>

</head>
<body>
   welcome,<?php echo $user;?>
</body>
</html>

這樣,當我第一次訪問cookie.php的時候,我需要輸入用戶名和密碼,輸入完畢後跳轉到了welcome.php。然後我關閉瀏覽器,再次打開cookie.php,這次沒有要求我輸入用戶信息,而是直接跳轉到了welcome.php,因為之前我們存的cookie信息被瀏覽器自動發送到了服務端,服務端做完處理直接跳轉到了welcome.php,服務器認識我們了!知道我是之前那個登陸過的用戶,這樣我們就通過cookie技術讓無狀態的HTTP協議保持了狀態。
照著這個做一遍,我相信你會用cookie了。

只不過!!!只不過!!!只不過!!!重要的事要說3遍,我們一般是不會把用戶名和密碼放到cookie中的,因為這並不安全,容易泄露自己的信息,請不要把重要的信息放到cookie中。我們這個只是一個學習cookie的例子。

PHP會話控制之PHP中使用session

1.開啟session
首先我們要開啟session,那麽第一個要學習的函數就是
bool session_start()了,這個函數沒有參數。在php文件的開始使用

   session_start();

就可以啟用新會話或者重用現有會話了。

2.添加session數據
開啟會話之後,那麽在接下來的處理中,我們就可以使用$_SESSION變量來存取信息了。我們要知道的是$_SESSION變量是個數組。當我們要把信息存入session的時候應該這麽寫:

   $_SESSION[‘userName‘] = ‘wang‘;

3.讀取session數據
讀取很簡單,就像我們使用數組一樣,如下:

   $userName = $_SESSION[‘userName‘];

當然也可以 $_SESSION[‘userName‘] 來用。和數組一樣的使用。
4.銷毀session數據
我們可以使用很多種方式來銷毀session數據。
a) unset函數
我們通過使用類似

   unset($_SESSION[‘XXX‘]);

來銷毀session中的 XXX 變量。PS:請不要!請不要!請不要unset($_SESSION),會導致後續無法使用$_SESSION這個變量!!!
b) 空數組賦值給session變量

   $_SESSION = array();

之前我們說過$_SESSOIN變量是個數組,那麽空數組賦值的話也是相當於將當前會話的$_SESSION變量中的值銷毀。
c) session_destory() 函數
這個函數會銷毀當前會話中的全部數據,並結束當前會話。但是不會重置當前會話所關聯的全局變量, 也不會重置會話 cookie。

5.session的擴展:默認session存儲在哪裏。
在php.ini配置文件中有這麽一行 session.save_handler = files,
files,說明了php默認的是用文件讀寫的方式來保存session的。那麽在哪個目錄呢?繼續看。session.save_path = "/tmp",
這一行前面有個 ; ,說明是被註釋的,不過即便這樣,php默認的
session 也是保存在這裏的,/tmp目錄。

技術分享圖片

我的寫入session的語句是:

$_SESSION[‘as‘] = ‘as‘;

解讀一下,第一個as代表的是$_SESSION[‘as‘]中的as,|後面的s表示的是這是一個字符串類型的數據,2表示的是這個字符串所占的字節數,最後雙引號引起來的是值as。

PHP會話管理和控制