session的使用:
session_start();定義$_SESSION數組變量。
session_start()使用前,不能有任何形式的輸出,包括php中的輸出和html代碼。
$_SESSION數組不可以使用數值下標,只可以使用字符串下標。
php.ini中的session_save_path配置項決定了session的保存位置。
默認情況下,session是保存在文件中。我們可以使用session_set_save_handler()函數來重寫session機制。
設置有效時間
代碼如下 SESSION:說明:好像默認是時間是:20-24分鐘,但是關閉浏覽器session就自動消失了!
刪除session:
刪除某個元素 unset($_SESSION[key]);
刪除所有session $_SESSION=array();
刪除保存session數據的文件 session_destroy();
session_distroy()方法只是刪除了服務器端的session文件,並不會釋放內存中的$_SESSION變量,如果我們在session_distroy()後,立即var_dump($_SESSION),仍然可以看到session輸出。因此如果想完全的釋放session,必須配合使用$_SESSION=array()。
cookie的使用:
設置cookie:setcookie(變量名,變量值,生存時間(時間戳))。
刪除cookie:setcookie(變量名,值,time()-1)。原理:設置cookie的生存時間過期。
讀取cookie:$_COOKIE[變量名]。
$path="/"; //設置cookie存放的路徑;1.默認存放是本目錄,只有本目錄下才能訪問,2.“/”表示存放在根目錄,3.“/foo/”只有foo文件夾下面文件才能訪問
代碼如下
setcookie("cookiename","網易'", time()+intval(24*3600),$path); /* 有效期 1天 */
注意:cookie存放的值只能是string類型的,但是要存放數值怎麼解決呢!
存儲:
代碼如下$array=array('a','b');
//"serialize:"返回值是一個字符串。有的時候為了把一些數據轉為字符串存起來,但是希望保持數據原來有結構和內容。就要用到這個函數。
$res=serialize($array);
setcookie("snsresult",$res,time()+intval(24*3600));
讀取:
代碼如下//恢復serialize對象
$other = StripSlashes($_COOKIE['snsresult']);//必須執行這步
$arr=unserialize($other);//先將加密cookie進行解碼 www.111Cn.net
注意:setcookie在代碼中存取值時前面是不可以輸出任何內容的,空行也不可以,不然cookie是沒有值的。
1、$_COOKIE只可以讀取cookie的值,並不能對cookie進行設置。
2、在使用setcookie之前,不能有任何類型的輸出。
3、在腳本第一次設置cookie後,是不能在當前腳本使用$_COOKIE獲取到的。需刷新頁面或者在其他腳本中獲取。
自動登錄
代碼如下//檢查用戶是否登錄
function checklogin(){
if(empty($_SESSION['user_info'])){ //檢查一下session是不是為空
if(empty($_COOKIE['username']) || empty($_COOKIE['password'])){ //如果session為空,並且用戶沒有選擇記錄登錄狀
header("location:login.php?req_url=".$_SERVER['REQUEST_URI']); //轉到登錄頁面,記錄請求的url,登錄後跳轉過去,用戶體驗好。
}else{ //用戶選擇了記住登錄狀態
$user = getUserInfo($_COOKIE['username'],$_COOKIE['password']); //去取用戶的個人資料
if(empty($user)){ //用戶名密碼不對沒到取到信息,www.111Cn.net 轉到登錄頁面
header("location:login.php?req_url=".$_SERVER['REQUEST_URI']);
}else{
$_SESSION['user_info'] = $user; //用戶名和密碼對了,把用戶的個人資料放到session裡面
}
}
}
}
二,用戶提交登錄信息
username = trim($_POST['username']);
$password = md5(trim($_POST['password']));
$validatecode = $_POST['validateCode'];
$ref_url = $_GET['req_url'];
$remember = $_POST['remember'];
$err_msg = '';
if($validatecode!=$_SESSION['checksum']){
$err_msg = "驗證碼不正確";
}elseif($username=='' || $password==''){
$err_msg = "用戶名和密碼都不能為空";
}else{
$row = getUserInfo($username,$password);
if(empty($row)){
$err_msg = "用戶名和密碼都不正確";
}else{
$_SESSION['user_info'] = $row;
if(!empty($remember)){ //如果用戶選擇了,記錄登錄狀態就把用戶名和加了密的密碼放到cookie裡面
setcookie("username", $username, time()+3600*24*365);
setcookie("password", $password, time()+3600*24*365);
}
if(strpos($ref_url,"login.php") === false){
header("location:".$ref_url);
}else{
header("location:main_user.php");
}
}
}
三,當用戶點退出時,清出記錄登錄狀態
//退出登錄
function logout(){
unset($_SESSION['user_info']);
if(!empty($_COOKIE['username']) || !empty($_COOKIE['password'])){
setcookie("username", null, time()-3600*24*365);
setcookie("password", null, time()-3600*24*365);
}
}
兩者的聯系與區別:
聯系:
兩者都被成為會話技術,用於解決http的無狀態性。
sessionID是保存在cookie中的。默認情況下,session是依賴cookie的,如果浏覽器端完全禁用了cookie,那麼session也就不能用了。但是我們有其他的方法可以讓session繼續有用。比如url重寫,將sessionID放在url中;給表單增加隱藏域,講sessionID存放在隱藏域中,發送至浏覽器。
區別:
cookie保存早浏覽器端,每次訪問服務器的時候,都會講cookie帶過去,保證讓服務器知道兩次請求來自於同一個客戶端。安全性較低。
session保存在服務器,每次請求都會通過cookie帶來的sessionID去服務器匹配。安全性較高。
session的有效期從session_start()開始,到浏覽器關閉結束。
cookie可以設定有效期。默認為浏覽器關閉cookie就失效,sessionID丟失,即使服務器端的session文件還在,也不會被找到。