2014年3月8日 星期六

超全域變數—$_Cookie 和 $_Session


  Session有別於Cookie是Cookie Data存放在Client端。Session 的功能簡單的說就是將變數儲存在伺服器端。php.ini 中有一個設定session.save_path = "" 即是存放Session的地方。

  但其是Session也運用Cookie的技術。當Session_start()的時候會有一組Session id 存放在Client端。存放Client端就是Cookie的技術。當Client端禁用Cookie時,session_id將無法傳遞,此時Session失效。不過php5在Linux/UNIX平台可以自動檢查Cookie狀態,如果客戶端設置了禁用,則係統自動把Session_id附加到url上傳遞。 windows主機則無此功能。

  使用Session_start()之前瀏覽器不能有任何輸出,否則會發生以下錯誤: Warning: Cannot send session cache limiter - headers already sent. 所以像 echo() 和 Html tag要在Session_start() 之後。

  Session到底有什麼用處呢?網上購物時的購物車,你可以隨時把你選購的商品加入到購物車中,其實還未存入資料庫。結帳後才存入資料庫。在整個過程中購物車一直扮演著臨時存貯被選商品的角色,它可以用於用戶身份認證,程序狀態記錄,頁面之間參數傳遞等。
 

  php5下不再使用Session_register()Session_unregisterSession_is_registered,除非在php.ini裡把register_globals = on,不過出於安全考慮,強烈建議register_globals = off。  

  php5使用$_SESSION['name'] = name註冊Session這個超級全域變數(superglobals)。和$_GET、$_POST、$_COOKIE 、$_SERVER的使用方法相似。



  Session id :


<?php
$sessionId = session_id();
if(empty($sessionId)) session_start();

echo "Session id = ".session_id()."<br \>";
?>

  註冊Session變數name :

<?php
$sessionId = session_id();
if(empty($sessionId)) session_start();

$_SESSION['name'] = 'Jonh';

echo "Session變數name值為:".$_SESSION['name']."<br \>";

?>

  刪除Session

<?php
$sessionId = session_id();
if(empty($sessionId)) session_start();

$_SESSION['name'] = 'Jonh';

unset($_Session['name']);

echo "Session變數name值為:".$_SESSION['name']."<br \>";

?>

$_COOKIE
通過HTTP Cookies 方式傳遞給當前腳本的變數的陣列。

範例
<?php
echo 'Hello ' . htmlspecialchars($_COOKIE["name"]) . '!';
?>
假設之前發送了 "name" Cookie

以上例程的輸出類似於:
Hello Hannes!