Download presentation
Presentation is loading. Please wait.
1
PHP +MySQL快速入門 Lesson 4
2
四、cookie 與 session 認識cookie 1 session 2 session實作『會員登入系統』 3
3
什麼是 cookie 與 session ? 在程式設計中,經常會需要在短暫時間內紀錄一些使用者的資料,如帳號、密碼…等等,使用資料庫來紀錄又不是很方便,也會佔用伺服器資源,這時候,使用cookie或session來記錄這些資料是最好不過的選擇。
4
4-1 認識cookie cookie是用來記錄網站運作所需要的資訊,這些資訊是放在一個檔案裡面,而這個檔案呢,就是存放在使用者端(Client)的硬碟裡。當使用者打開瀏覽器後,cookie參數會自動將網站需要的資訊存在電腦中,當使用者再次開啟瀏覽器時,程式只要讀取使用者電腦中的cookie,就能取得相關資訊了。
5
4-1.1 cookie的限制 cookie在使用上有一些限制: 1.每個瀏覽器最多只能存取300個cookie,也就是說同一台電腦最多只能存放300個 cookie檔案。 2.cookie的檔案最大只能到4K Bytes容量。 3.使用者若將瀏覽器的cookie功能關閉(或者瀏覽器版本太舊,不支援cookie),則無法使用cookie功能。 4-1.2認識 setcookie( )函數 PHP是使用setcookie()函數來建立cookie的,其語法為: setcookie ( 名稱,值,[有效期限],[路徑],[網域],[安全模式] ) setcookie函數最多可以設定六個,比較常使用到的是前面三個參數,PHP會將cookie的名稱視為變數,cookie的值則視為變數的值。上面setcookie函數,中括號的參數表示可省略。 範例:註冊一個cookie變數,名稱為A,值為123
6
有個需要特別注意的是,在使用setcookie函數之前,不可輸出任何資料,否則將造成程式運作錯誤,因此建議將setcookie函數放在程式的最前面。
有了存入(註冊)cookie的功能,那該怎麼讀出cookie的內容呢?我們可以使用以下程式碼來取得電腦中cookie變數資料。 $_COOKIE["變數名稱" ] 範例:建立cookie程式碼與讀出cookie內容程式碼 執行畫面:
7
4-1.3 cookie的有效時間 cookie利用設定有效時間,就可以不會因為關閉瀏覽器,而喪失效力,其設定方式如下:
time( )+秒數 如設定cookie A的有效時間為10分鐘( 60 × 10 = 600 秒 ),範例如下: time函數會自動抓取目前時間的timestamp (單位為秒),再加上600秒就是cookie的有效時間,當600秒的時間到了,cookie就會自動失效。 當然,除了使用time函數設定cookie的有效時間外,還有另一個函數也可以用來設定cookie的有效時間,那就是 mktime函數,其設定語法如下: mktime(時,分,秒,月,日,年) 想要設定cookie存活到2010年7月1日,範例如下:
8
4-1.4 刪除cookie setcookie函數除了可以建立cookie外,也可以用來刪除cookie,很特別吧! 那該如何使用呢?很簡單,只要設定第一個參數就好,就表示要刪除cookie了。 範例: 4-1.5 實做簡易cookie計數器 利用cookie製作一個簡易計數器 以下範例程式分為四個部份: £ 讀取cookie變數counter的值。 £ If條件式判斷。 £ 註冊cookie。 £ 將計數值輸出至畫面上。
9
範例: 程式運作解析: £ 程式執行第一次:因為我們並沒有設定cookie的值,所以讀取的$counter值為 『空值』,因此if條件式成立,將0指派給$counter;於註冊cookie後,將目前 $counter的值輸出至畫面上。 £ 程式執行第二次﹝含之後﹞:讀取的$counter的值就是上次執行時所註冊的值 ,因為$counter 的值存在,if條件式不成立,因此執行$counter的值會加1;於 註冊cookie後,將目前$counter的值輸出至畫面上。
10
第一次執行結果: 我們在瀏覽器上重複按『重新整理』,看看執行後的畫面會是如何。 執行結果: 簡單的計數器已經完成,你是否也會使用cookie了呢?
11
4-2 session session和cookie其實是滿類似的,也是用來記錄網站運作所需要的資訊,只不過cookie是存放於客戶端(Client),而session是放在伺服器端(Server)。cookie存放在使用者端的硬碟,使用者可以任意的修改,安全性較差,session存放於伺服器端的硬碟,使用者無法任意修改,因此,session的安全性比cookie來的佳。但相對的,因為session存放在伺服器端的硬碟,當然會造成伺服器一點點的負擔,不過對於目前的伺服器等級來說,這一點點負擔是幾乎感受不到的唷。所以,目前常見的購物網站、會員制網站…等,都有運用到session的技術喔。
12
4-2.1 session以何種形式存在? Session會將資料存放在一個檔案裡面,而這個檔案的命名規則有幾個特性: £ 以『sess_』做為檔案名稱的開頭。 £ 『sess_』後面接著是32位元的數字和字母組合而成的檔案名稱。 £ 若有啟動session,每個瀏覽器將會對應到一個獨立的session檔案,而且它的檔 案名稱都是獨一無二的。
13
4-2.2 session_id( ) session id是什麼?剛剛有提到,每個瀏覽器將會對應到一個獨立的session檔案,而且它的檔案名稱都是獨一無二的。這個檔案名稱也就是當下這個瀏覽器所對應到的session id。 範例:註冊一個session變數,以產生一個session檔案。 使用session_id( )函數將session的id輸出在畫面上:
14
接著來比對看看,session的檔案名稱與使用程式所輸出在畫面上的session id是不是相同呢?
15
4-2.3 啟動session 不管是要對session做讀取或寫入的動作,都必須宣告,其語法為: session_start(); 值得注意的是,session_start函數之前不能有任何資料的輸出,否則將會造成錯誤,因此若有使用到session_statr函數,都建議要寫在網頁的最前端。 程式碼: 執行結果:
16
session.save_path = "儲存路徑"
第一種方法: 1. 開啟『C:\WINDOWS』目錄,尋找一個『php.ini』的檔案,並以純文字文件 開啟。 2. 開啟『php.ini』後,尋找『session.save_path』這個設定值。找到一個前面沒有 分號『;』的地方,這項才是真正的設定(參考下圖)。因為『;』是php.ini之中的 註解,他只是個範例,並不會真正去執行的喔。session.save_path的值,必須輸 入要存放session檔案的路徑,其方式如下: session.save_path = "儲存路徑"
17
AppServ預設將session的檔案存放在Windows的暫存目錄中,當然我們也可以自行修改設定值,在此我們設定session檔案儲存於『C:\AppServ\session』這個目錄裡面。
18
若你有自行設定儲存路徑,必須要重新啟動Apache Server,設定值才會生效喔。
19
修改設定值之後,你可以嘗試寫一隻註冊session的程式,看看產生出來的檔案會不會在你所設定的目錄裡面。
20
第二種方法: 我們可以直接利用PHP所提供的函數,去找出我們的儲存路徑。 函數名稱:『session_save_path( )』 範例: 執行結果: 由於我們已經將儲存路徑修改過了,所以出現的儲存路徑為『C:\AppServ\session』。
21
▲執行結果 4-2.5讀出session 讀出session資料的語法與cookie很類似,其語法如下: $_SESSION["變數名稱"]
範例:註冊一個session變數,名稱為id 讀取session程式碼: ▲執行結果
22
4-2.6刪除sesion 刪除session有兩種作法,這兩種方式都非常的實用,也很常用到,請務必了解兩者的差異。 1.session_unregister("變數名稱"); 2.session_destroy( ) ; 第一種作法: 『session_unregister("變數名稱");』:此種方式,可指定要刪除session檔案裡的其中一個變數,session檔案並不會被刪除。 範例一:註冊兩個session變數,名稱分別是id與name
23
看看session檔案存放的地方,產生了一個session檔案:
24
範例二:刪除指定的session變數 $mesessionid = $_SESSION[“id”]; 使用完刪除 執行結果:
25
來看看剛剛的記錄檔 有沒有發現,只剩下一個session變數存在這個session檔案裡面,表示指定刪除某個session變數了。 第二種作法: 『session_destroy( )』:此種作法,是直接刪除該瀏覽器所對應的session檔案。 範例: 先註冊兩個session
26
在看看儲存位置的記錄檔: 已經有紀錄檔了,再來我們使用『session_destroy( )』刪除所註冊的session。 ▲執行結果
27
來看看儲存的記錄檔位置 看!記錄檔也一起刪除了,這就是『session_destroy( )』和『session_unregister(“變數名稱”);』之間不同的地方。 4-2.7 session函數 PHP提供了許多session相關的函數,以下是一些函數的列表: 函數名稱 功能說明 session_cache_expire( ) 設定cache可以使用的時間,如果沒指定,則傳回php.ini檔案中session.cache_expire的設定值(預設為180)。 session_cache_limiter( ) 傳回cache限制字串,php.ini檔案的預設值為nocahe,假如指定為public( session_cache_limiter( public) ),則可以使用快取。
28
session_decode( ) 將session資料解碼。 session_destroy( ) 取消所有註冊的session變數,記錄檔也刪除。 session_encode( ) 將session資料編碼。 session_get_cookie_params( ) 傳回cookie的相關資訊,如有效時間、路徑…等。 session_id( ) 傳回目前的session ID。 session_is_registered( ) 檢查session變數是否已註冊,已註冊傳回True,否則傳回False。 session_module_name( ) 傳回或設定session模組。 session_name( ) 傳回目前的session名稱,php.ini檔案預設值為PHPSESSID。 session_readonly( ) 讀取session內容,但不能修該內容。 session_register( ) 註冊session變數。 session_save_path( ) 尋找session的儲存路徑。 session_set_cookie_params( ) 設定php.ini檔案中的cookie參數。 session_set_save_handler( ) 設定session的儲存功能。 session_start( ) 啟動session。 session_unregister( ) 取銷所指定的session變數。記錄檔仍然存在。 session_unset( ) 釋放所有的session變數,但是記錄檔仍然存在。 session_write_close( ) 寫入session資料及結束session。
29
4-3 使用session實作『會員登入系統』
開始製作前,我們先規劃一個很簡單的會員登入系統,大致上會有以下這幾個頁面: £ index.php:會員登入頁面,有一表單可填寫帳號與密碼。 £ login_check.php:驗證會員的帳號與密碼。 £ members_index.php:會員登入成功歡迎頁面。 £ members_loginout.php:會員登出畫面。
30
index.php 會員登入頁面 <? session_start(); session_destroy(); ?> <html> <head> <title>登入頁面</title> </head> <body> <p align="center">請輸入帳號、密碼</p> <form method="POST" action="login_check.php"> <table border="1" width="300" align="center"> <tr> <td>帳號:</td> <td><input type="text" name="id" size="20"></td> </tr> <td>密碼:</td> <td><input type="password" name="pw" size="20"></td> </table> <p align="center"><input type="submit" value="登入"></p> </form> </body></html>
31
此登入頁面,在一開始我們就使用了session_start( )來啟動session,然後利用session_destroy( )來刪除所有session檔案,先清除不該有的session資訊。
執行畫面:
32
login_check.php : 驗證會員身份
<? $news_pw=array("Bill"=>"aaa","Calvin"=>"0000","Andy"=>"1234","David"=>"789"); $news=array_keys($news_pw); //傳回news_pw陣列中所有的索引值 if ( !in_array($id,$news) ) { echo "您非本站會員喔!請離開!!"; exit; } if ( $pw != $news_pw[$id] ) echo "您輸入的密碼錯誤喔!請重新輸入!!"; session_register("id","pw"); header("location:members_index.php "); ?>
33
如果輸入錯誤的帳號、密碼,就會被程式擋下,以下為執行畫面:
如果驗證通過,我們用session_register()將使用者的帳號與密碼儲存在session檔案中,以便其他程式可以隨時讀取出來使用,並將網頁導向至會員登入成功的歡迎頁面" members_index.php"。 會員登入成功的歡迎頁面,我們將儲存在session裡面的id讀出來,並顯示於畫面上。
34
執行畫面: 當然囉,有了登入一定會有登出嘛,否則使用者怎麼樣也無法刪除session,那資料不就都被別人看光光了!! 大功造成!會員已經可以正常登入登出了,但是…這樣的系統安全嗎?請嘗試在登出之後,按瀏覽器的『上一頁』按鈕,你會看到什麼!? members_loginout.php 會員登出程式 <? session_start(); session_destroy(); header("location:index.php"); ?>
35
咦,怎麼沒有顯示id出來呢?因為使用者已經登出了,session檔案已經被刪除,當然讀不到session的id 啦。這樣的程式,就可以稱之為bug(蟲),為什麼呢?因為這一頁是給會員看的,可是在沒有登入的情況之下,任何人只要知道網址都可以進入這個頁面,那不就太危險了嗎!?再來,我們就為這個會員系統,加一個簡單的驗證機制。 在我們寫的程式裡有個規則『會員的帳號密碼驗證正確者,才會註冊session,否則,則不會註冊session』,因此,我們可以判斷讀出來的id是否為空值,若為空值,就表示使用者沒有登入會員囉。
36
members_index.php 會員登入成功歡迎頁面
<? session_start(); $member_id = $_SESSION["id"]; $member_pw = $_SESSION["pw"]; If($member_id=="" OR $member_pw=="" ) { echo "尚未登入喔"; exit; } ?> <html> <head> <title>會員登入成功歡迎頁面</title> </head> <body> <?echo $member_id;?>您好!!! <p><a href="members_loginout.php">登出會員</a></p> </body> </html>
37
我們在沒有登入的情況之下,直接輸入網址『members_index.php』,會看到什麼?
這樣的系統雖然陽春,但卻是『麻雀雖小五臟俱全』;在寫程式的時候,除了讓程式正常運作之外,這樣的bug也要很注意喔。 ※小提示:若會員登入之後所應用的頁面很多,我們也可以將驗證這一段獨立成一個 檔案,在需要驗證會員是否登入的頁面再include進來就可以囉!
Similar presentations