[PHP]當PHP相遇Cookie與Session所擦出的火花

  • 1410
  • 0
  • PHP
  • 2015-08-17

摘要:[PHP]當PHP相遇Cookie與Session所擦出的火花

 
記得在新手村徘徊時,常聽到Session跟Cookie就覺得,哇~好酷啊
但實際自己在用的時候,卻痛哭流涕...因為時常有個問題困惱著我,而現在想起來感覺自己傻傻的
那就是...A頁設定Cookie變數,到B頁卻用Session要去取值,或者相反@@
 
首先,來了解一下Session 與 Cookie 的差異
Cookie:儲存資料於用戶端,伺服器不必負擔紀錄下來檔案的負荷量,但是用戶有可能會關閉Cookie
Session:儲存資料於伺服器端,紀錄下來的檔案量由由伺服器負荷,但好處是不用煩惱用戶會關閉Session的問題
 
而在安全方面,由於Cookie是儲存在用戶端,所以被截取的機率較高
因此較重要的資料應用Session,而比較沒這麼重要的資料可以用Cookie紀錄
 
然而,這種暫存紀錄的方法經常運用於會員系統、購物車等等地方‧‧‧‧‧‧
 
Cookie的使用方法:
(參考資料:
 
啟用Cookie,並設定數值
通常setcookie會常用到的三個參數:setcookie ( $name, $value, $expire)
$name:變數名稱
$value:變數值
$expire:變數存活時間,常與time()配合使用,EX:time()+60*60*24*30 等於 一個月(三十天)後才過期

<?php
    setcookie( "test", "Good_Idea", time()+3600);
   //變數為test,變數值為Good_Idea,存活時間一小時(3600秒)
?>
接著就是要試看看把剛設定好的Cookie給取值出來
(記得,這裡的$_COOKIE["XXX"]的COOKIE一定要大寫,小寫會報錯誤訊息)

<?php
    echo $_COOKIE["test"]; //讀取變數
?>
當用完COOKIE想釋放清除它時,需將變數值設成空
但這樣還不夠的,還記得在設定時我們給他存活時間3600秒嗎
那這樣就算變數值設空值,變數也還是要等到3600秒後
那樣的話,乾脆把存活時間設定為現在時間前3600秒,較為保險安全

<?php
   setcookie( "test", "", time()-3600);
?>

Session的使用方法:
(參考資料:
 
啟用Session

<?php
   session_start();
?>
設定Session數值

<?php
   $_SESSION['test']="Good_Idea";
?>
接著要把變數印出來,以確定我們做法是對的

<?php
   echo $_SESSION['test'];
?>
當用完Session想釋放清除它,可使用session_unset('Session變數')或unset('$_SESSION['變數']')把變數釋放掉

<?php
   session_unset("test");
   //unset($_SESSION['test']);
?>
而以上是清空單一Session,那如果要清空全部呢?!
只要在session_unset()函數別指定變數就是全部清空了

<?php
   session_unset();
?>
(參考資料:
 
試著做出一個表達Session使用方法的範例,程式碼如下:
「session.php」

<?php
session_start(); //啟動Session
$_SESSION['test']="Good_Idea"; //設置Session變數

echo "\$_SESSION['test']變數值:".$_SESSION['test'];

echo "<hr />";

//使用isset()函數檢查變數是否有被設置
echo("清空Session變數前:");
if(isset($_SESSION['test'])){
        echo("有設置變數");
    }else{
        echo("未設置變數");
    }
   
echo "<hr />";

session_unset("test");
//unset($_SESSION['test']);

echo("清空Session變數後:");
if(isset($_SESSION['test'])){
        echo("有設置變數");
    }else{
        echo("未設置變數");
    }
?>