290 likes | 508 Views
Cookie And Session. Cookies. Cookies เป็นวิธีการฝังหรือเก็บข้อมูลขนาดเล็กๆ ไว้ในเครื่องไคลเอนต์ของผู้ใช้งาน Cookies เป็น ตัว แปรใน การดำรงค่าไว้ในเครื่องคอมพิวเตอร์ของผู้ใช้ เพื่อแลกเปลี่ยนข้อมูลข้ามสคริปต์กันได้
E N D
Cookies • Cookies เป็นวิธีการฝังหรือเก็บข้อมูลขนาดเล็กๆ ไว้ในเครื่องไคลเอนต์ของผู้ใช้งาน • Cookies เป็นตัวแปรในการดำรงค่าไว้ในเครื่องคอมพิวเตอร์ของผู้ใช้ เพื่อแลกเปลี่ยนข้อมูลข้ามสคริปต์กันได้ • Cookies โดยทั่วไปจะใช้สำหรับระบุตัวตนและความมีอยู่ของ users ช่วยให้ users ไม่จำเป็นต้อง login ซ้ำซ้อน • Cookies เป็นไฟล์ขนาดเล็กที่ถูกสร้างโดยสคริปต์ทางฝั่ง Server แล้วฝังตัวอยู่บนคอมพิวเตอร์ทางฝั่ง Clients • Cookies เป็นตัวแปรที่สามารถกำหนดอายุได้ หากตัวแปรคุกกี้ถูกประกาศขึ้นมาในสคริปต์ใดๆ กำหนดให้มีอายุ 1 ชั่วโมง แม้ว่าสคริปต์ที่สร้างตัวแปรคุกกี้จะสิ้นสุดการทำงาน แต่หากยังไม่ครบกำหนดเวลา ตัวแปรคุกกี้ก็ยังคงสถานะอยู่ ไม่ถูกทำลาย • ตัวอย่างการใช้งาน เช่น ระบบ Login อัตโนมัติ
Cookies (ต่อ) • Cookies เป็นรูปแบบของการเก็บรักษาข้อมูลบางอย่างไว้บนเครื่องของผู้ใช้ เพื่อจะนำข้อมูลนี้กลับมาใช้ใหม่ในภายหลัง โดยข้อมูลจะเก็บไว้ในรูปแบบของ Text File ธรรมดา • Cookies จะเก็บข้อมูลผู้ใช้งานในเครื่อง ไคลเอนต์ ดังนั้นการจัดเก็บข้อมูลไม่ควรเก็บข้อมูลที่ต้องการเป็นความลับ เช่น รหัสผ่าน ระดับความปลอดภัยของ Cookies จึงค่อนข้างต่ำ • Cookies เป็นการล่วงละเมิดสิทธิของผู้ใช้ ดังนั้นโปรแกรมเว็บเบราเซอร์จึงมีตัวเลือกสำหรับผู้ใช้ สามารถปฏิเสธการบันทึก Cookies จากเว็บไซต์ที่ไม่ต้องการได้
การสร้าง Cookies setcookie(); รูปแบบ setcookie(ชื่อ,ค่าของ cookie) โดยที่ • ชื่อ คือ ชื่อตัวแปร Cookie • ค่าของ cookie คือ ค่าที่กำหนดให้กับชื่อตัวแปร Cookie • ผลจากการสร้าง Cookies จะคืนค่าเป็น true หรือ false • หากมีการกำหนดชื่อคุกกี้ซ้ำกับชื่อที่มีอยู่แล้ว จะเป็นการแทนที่ข้อมูลเดิม
ตัวอย่างการสร้าง Cookie <? $cookie_name="book"; $cookie_value="PHP"; if(setcookie($cookie_name,$cookie_value)){ echo "cookie_name=".$cookie_value; } else { echo "ไม่สามารถบันทึกข้อมูลคุกกี้ได้"; } ?>
การอ่านข้อมูลจาก Cookie การอ่านข้อมูลคุกกี้ จะใช้ตัวแปร $_COOKIE ซึ่งเป็นตัวแปรอาร์เรย์ โดยระบุชื่อของคุกกี้เป็นค่าคีย์ ค่าของคุกกี้จะได้เป็นค่า value ของคีย์ หากคุกกี้นั้นไม่มีอยู่จริง หรือหมดอายุไปแล้ว การอ่านคุกกี้นั้นโดยไม่ตรวจสอบก่อนจะเกิดข้อผิดพลาดขึ้น ดังนั้น เพื่อให้แน่ใจว่ามีคุกกี้นั้นอยู่หรือไม่ ควรตรวจสอบด้วยฟังกช์น isset() ก่อนอ่านเสมอ ตัวอย่างเช่น <? if(isset($_COOKIE['book'])) { echo $_COOKIE['book']; } ?>
ปัญหาของคุกกี้กับเฮดเดอร์ปัญหาของคุกกี้กับเฮดเดอร์ • เนื่องจาก คุกกี้ ถูกจัดเก็บไว้ที่เครื่องของผู้ใช้ ไม่ใช่เก็บที่เซิร์ฟเวอร์ ถึงแม้จะสร้างตัวแปรที่เซิร์ฟเวอร์ หากไม่มีผู้ใช้เรียกข้อมูลเพจนั้นเข้ามา ตัวแปรคุกกี้นั้นก็ยังคงไม่สามารถเรียกใช้ได้ หากเรียกใช้ค่าที่ได้จะเป็น null • การส่งคุกกี้ ไปยังเบราเซอร์จะส่งแบบเฮดเดอร์ ดั งนั้นหากจุสร้างคุกกี้ต้องทำก่อนที่จะส่งข้อมูลอื่นๆไปยังเบราเซอร์ ตัวอย่างเช่น echo “hello”; setcookie(“test”,”abcde”); • Code นี้จะเกิดข้อผิดพลาดเช่นเดียวกับกรณีส่งข้อมูลไปก่อน header สำหรับวิธีการแก้ปัญหาคือหลีกเลี่ยงการส่งข้อมูลใดๆก่อนที่จะสร้าง cookie
การกำหนดอายุและลบคุกกี้การกำหนดอายุและลบคุกกี้ • หากการสร้างคุกกี้ ไม่ได้กำหนดอายุ Cookie จะหมดอายุทันทีที่ปิดเบราเซอร์ แต่โดยทั่วไปมักจะเก็บข้อมูล Cookie ไว้ใช้ในคราวต่อๆไป การกำหนดอายุของคุกกี้ รูปแบบ setcookie(ชื่อ,ค่าของคุกกี้,อายุเป็นวินาที)
การกำหนดอายุคุกกี้ • การกำหนดเวลาของ cookie จะกำหนดเป็นเวลาในหน่วยวินาที เทียบกับเวลาปัจจุบัน โดยอ้างอิงเวลาด้วยฟังก์ชั่น time() ซึ่งจะคืนค่า timestamp ของเวลาปัจจุบัน ดังนั้นสามารถนำอายุของคุกกี้มาบวกเพิ่มเข้าไป • เช่น time()+30 หมายความว่า คุกกี้จะหมดอายุภายใน 30 วินาทีหลังจากนี้ หรือ $expire=time()+(7*24*60*60) // จำนวนวินาทีใน 1 สัปดาห์ Setcookie(“mycookie”,”abcde”,$expire);
การลบคุกกี้ • จากวิธีการกำหนดอายุคุกกี้สามารถนำมาใช้กับการลบคุกกี้ได้ เพราะ PHP ไม่มีฟังก์ชั่นในการลบคุกกี้โดยตรง จึงกำหนดเวลาหมดอายเป็นเวลาที่ผ่านมาแล้ว รูปแบบ setcookie(“ชื่อคุกกี้ที่ต้องการลบ”, “กำหนดค่าอะไรก็ได้”,เวลาที่ผ่านมาแล้ว) เช่น $expire=time()-3600; setcookie(“mycookie”, “”,$expire);
การกำหนดพาธและโดเมน • การกำหนดพาธ หมายถึงจะให้พาธใดที่สามารถใช้งานคุกกี้ได้ หากไม่กำหนดพาธจะใช้คุกกี้ได้เฉพาะพาธที่สร้างคุกกี้เท่านั้น • หากต้องการให้ใช้ได้จากทุกพาธในเว็บให้กำหนดเป็น / • หากต้องการให้พาธอื่นๆ ใช้ได้ด้วยให้ระบุชื่อพาธลงไป เช่น /member/ จะทำให้ใช้คุกกี้ได้จากไดเรกทอรี่ member และไดเรกทอรี่ย่อย เช่น /member/info เป็นต้น • โดเมน หมายถึง โดเมนที่มีสิทธิใช้คุกกี้ ซึ่งปกติแล้วโดเมนที่สร้างคุกกี้จะมีสิทธิใช้คุกกี้นั้นโดยอัตโนมัติ พารามิเตอร์นี้เป็นการอนุญาตให้โดเมนอื่นสามารถใช้คุกกี้ได้ รูปแบบ setcookie(ชื่อ,ค่า,เวลาหมดอายุ,พาธ,โดเมน)
การกำหนดพาธและโดเมน (ต่อ) เช่น $expire=time()+(30*24*60*60); setcookie(“mycookie”, “abcde”,$expire,“/”,“.cru.in.th”); “.cru.in.th” หมายถึง ทุก Subdomain ของ cru.in.th สามารถใช้งานคุกกี้ได้ เช่น http://reg.cru.in.th หรือ www.cru.in.th หรือ www.scit.cru.in.th เป็นต้น
Session • เป็นการจัดเก็บข้อมูลบางอย่างไว้ชั่วคราวที่เซิร์ฟเวอร์ เพื่อให้สามารถนำข้อมูลนั้นมาใช้งานใหม่หลังจากเพจนั้นสิ้นสุดการทำงานไปแล้วและสามารถนำข้อมูลนั้นมาใช้งานที่เพจอื่นๆได้สำหรับลักษณะทั่วไปของเซสชั่นมีดังนี้ • เมื่อผู้ใช้เชื่อมต่อไปยังเว็บไซต์ เซิร์ฟเวอร์จะสร้างรหัสสำหรับการอ้างอิงถึงผู้ใช้ โดยรหัสนี้เรียกว่า Session ID หรือ SID ซึ่งประกอบด้วยตัวเลข 0 ถึง 9 และตัวอักษร a-z จำนวน 32 • ค่า SID จะถูกนำไปใช้ในการอ้างอิงถึงผู้ใช้คนนั้นตลอดการเชื่อมต่อ เมื่อผู้ใช้เลิกการเชื่อมต่อ เช่นการปิดเบราเซอร์จะส่งผลให้ค่า SID ของผู้ใช้คนนั้นยกเลิกไป หากผู้ใช้คนเดิมทำการเชื่อมต่อไปยังเว็บไซต์นั้นใหม่ ค่า SID จะถูกสร้างขึ้นมาใหม่ทุกครั้งเช่นกัน
Session(ต่อ) • เมื่อสร้างข้อมูลแบบเซสชั่น สำหรับผู้ใช้คนใด ก็จะมีผลหรือใช้งานได้เฉพาะกับผู้ใช้คนนั้น ส่วนคนอื่นๆ ไม่สามารถเรียกใช้งานได้ • ข้อมูลแบบเซสวั่นจากเพจหนึ่งจะสามารถนำไปใช้งานที่เพจอื่นๆ ที่ถูกเรียกใช้โดยผู้ใช้ที่เป็นผู้สร้างเซสชั่นนั้นได้ เช่น รูปต่อไปนี้เซสชั่นถูกสร้างขึ้นที่ Page1.php PAGE1.PHP PAGE2.PHP PAGE3.PHP $x=$_SESSION[‘X’] echo $_SESSION[‘X’] $_SESSION[‘X’]=10
Session(ต่อ) • ข้อมูลเซสชั่นที่ถูกสร้างขึ้นจะสามารถใช้งานได้ชั่วระยะเวลาที่เปิดใช้เบราเซอร์อยู่ แต่ไม่เกิน 180 นาที ถ้าปิดเบราเซอร์หรือเวลาเกินกว่า 180 นาที ข้อมูลจะถูกยกเลิกไป หรือนอกจากนี้สามารถสั่งลบขอมูลเซสชั่นเมื่อไม่ต้องการใช้งานต่อไปได้ • เซสชั่นจะมีความเกี่ยวข้องกับคุกกี้โดยเซสชั่นจะใช้การเก็บข้อมูลรหัสแบบคุกกี้ไว้ที่เครื่องของผู้ใช้ แต่ละคน และเมื่อเชื่อมต่อไปยังเซิร์ฟเวอร์ ข้อมูลนี้จะถูกนำไปใช้ในการตรวจสอบว่าเป็นผู้ใช้คนใด ดังนั้นหากเครื่องของผู้ใช้คนใดปฏิเสธการใช้คุกกี้ ก็จะส่งผลถึงเซสชั่นด้วย แต่ปัจจุบันนี้มีการใช้เทคนิค URL Rewriting หรือ นำรหัสเซสชั่นไปต่อท้าย URL ในแบบ Query String ในชื่อตัวแปร PHPSESSID • แม้เซสชั่นจะเป็นการพักเก็บข้อมูลไว้ชั่วคราวคล้ายกับคุกกี้ แต่ทั้งคุกกี้ และเซสชั่นก็มีแนวทางการนำไปใช้งานที่แตกต่างกันไป
การเริ่มการทำงานของเซสชั่นการเริ่มการทำงานของเซสชั่น • ต้องเริ่มด้วยการสั่งให้เซสชั่นเริ่มทำงานด้วยคำสั่ง session_start() โดยต้องกำหนดไว้บนสุดของเพจ เช่น <?phpsession_start(); ?> ข้อควรระวัง คือเนื่องจากเซสชั่นต้องอาศัยคุกกี้เป็นกลไกร่วมด้วย และคุกกี้จะอาศัยการส่งข้อมูลแบบเฮดเดอร์ ทำให้เซสชั่นมีความเกี่ยวพันกับเฮดเดอร์ด้วย ดังนั้นการใช้ฟังก์ชั่น session_start() ต้องทำก่อนการส่งข้อมูลใดๆ ไปที่เบราเซอร์เช่นเดียวกันกับเฮดเดอร์และคุกกี้ มิฉะนั้นจะเกิดข้อผิดพลาดได้
การเก็บข้อมูลด้วยตัวแปร $_SESSION ตัวแปร $_SESSION เป็นตัวแปรอาร์เรย์สำหรับจัดเก็บข้อมูลแบบเซสชั่น ซึ่งตัวแปรนี้จะมีลักษณะเป็น Key/Value โดยที่ Key คือชื่อของเซสชั่น และ Value คือค่าของเซสชั่น การสร้างตัวแปร $_SESSION สามารถสร้างกี่ตัวก็ได้ ตัวอย่างเช่น <? session_start(); $_SESSION['login']="someone"; $_SESSION['password']=$_POST['password']; $_SESSION['userid']=123456; ?>
การนำค่า SESSION ไปใช้ การนำค่าเซสชั่นไปใช้งานต้องระบุผ่านตัวแปร $_SESSION พร้อมระบุชื่อเซสชั่นที่ต้องการ แต่ต้องทำหลังจากที่สั่งเซสชั่นเริ่มทำงานด้วยคำสั่ง session_start(); แต่เนื่องจากตัวแปรเซสชั่นสามารถถูกลบ หรือหมดอายุได้ จึงต้องมีการตรวจสอบว่าเซสชั่นนั้นมีอยู่จริง ด้วยฟังก์ชั่น isset() ก่อนอ่านค่า ตัวอย่างเช่น <? session_start(); if(isset($_SESSION['login'])){ $login=$_SESSION['login']; } echo $login; ?>
การเก็บข้อมูล SESSION (ต่อ) ตัวแปรเซสชั่นสามารถจัดเก็บข้อมูลชนิดอื่นๆ ได้ เช่น อาร์เรย์ ออบเจ็กต์ เป็นต้น สำหรับการจัดเก็บข้อมูลอาร์เรย์ในเซสชั่นนั้น สามารถทำได้เหมือนกับข้อมูลสตริงทุกประการ ตัวอย่างเช่น <? session_start(); $arr=array("cat","dog","mouse","bird","cow"); $_SESSION['animals']=$arr; //เก็บอาร์เรย์ไว้ในเซสชั่น // การนำข้อมูลไปใช้ foreach($_SESSION['animals'] as $value){ echo $value."<BR>"; } // หรือใช้วิธีอื่น เช่น echo "<h4>วิธีใช้ LOOP for</h4>"; for($i=0;$i<count($_SESSION['animals']);$i++){ echo $_SESSION['animals'][$i]."<BR>";}?>
ค่า ID ของ SESSION ค่า Session ID หรือ SID เป็นรหัสที่ถูกกำหนดให้กับผู้ใช้แต่ละคนที่เชื่อมต่อเข้ามายังเว็บไซต์แห่งนั้น ซึ่งค่า SID จะใช้ในการแยกแยะผู้ใช้แต่ละคนออกจากกัน ดังนั้นค่านี้จึงจะไม่ซ้ำกันเลย บางครั้งในการตรวจสอบผู้ใชล้อาจดูจากค่า SID นี้ได้ ถึงแม้ว่า PHP จะกำหนดค่า SID นี้ให้แล้ว แต่ก็สามารถเปลี่ยนเป็นอย่างอื่นได้ ฟังกชั่นเกี่ยวกับ SID คือ session_id() ฟังก์ชั่นนี้ใช้ทั้งในการอ่านค่า SID และการกำหนดค่า ID ให้แก่เซสชั่น รูปแบบคือ $sid=session_id() // อ่านค่า SID session_id(SID) // กรณีต้องการกำหนด SID เช่น echo “Your Curren SID:”.session_id(); session_id(“1234567890abcd”);
การลบข้อมูลเซสชั่น • ปกติเมื่อเบราเซอร์ที่เปิดไว้ถูกปิดทั้งหมด หรือระยะเวลาที่สร้างเซสชั่นเอาไว้นานเกินกว่า 180 นาที (3 ชั่วโมง)ค่าตัวแปรเซสชั่นที่ถูกสร้างขึ้นจะถูกยกเลิกไปเองโดยอัตโนมัติอยู่แล้ว แต่บางครั้งหากต้องการยกเลิกข้อมูลเซสชั่นที่เวลาใดเวลาหนึ่งขณะที่ยังใช้งานเว็บไซต์อยู่ เช่น การ Logout ออกจากระบบเป็นต้น
การลบข้อมูลเซสชั่น (ต่อ) • unset($_SESSION[ชื่อเซสชั่น]) ซึ่งฟังก์ชั่นนี้สามารถนำไปใช้ยกเลิกตัวแปรทั่วๆไปของ PHP ได้ด้วย ตัวอย่างการใช้งาน เช่น $_SESSION[‘login’]=“admin”; unset($_SESSION[‘login’]); echo $_SESSION[‘login’]; //null
การลบข้อมูลเซสชั่น (ต่อ) • session_destroy() เป็นฟังก์ชั่นที่ใช้ในการยกเลิกข้อมูลเซสชั่นทั้งหมดที่ได้สร้างขึ้นให้กับผู้ใช้คนนั้น ตัวอย่างเช่น $_SESSION[‘a’]=“A”; $_SESSION[‘b’]=“B”; echo count($_SESSION); //2 session_destroy(); echo count($_SESSION); //0
WorkShopใช้เชสชั่นกับระบบ Login • ระบบสมาชิกส่วนใหญ่ จะต้องให้สมาชิกล็อกอินเข้าสู่ระบบก่อนที่จะใช้บริการบางอย่างได้ แต่บริการต่าง ๆ อาจถูกจัดไว้คนละเพจ แต่การล็อกอินเข้าสู่ระบบจะทำเพียงครั้งเดียว และอยู่เพจใดเพจหนึ่ง ดังนั้นการที่เพจอื่น ๆ จะได้ทราบได้ว่า ผู้ใช้คนนนั้นได้ล็อกอินเข้าสู่ระบบหรือยัง ต้องใช้การจัดเก็บข้อมูลการล็อกอินไว้ในเซสชั่น โดยมีหลักการดังนี้ • หลังผู้ใช้ล็อกอินเข้าสู่ระบบสำเร็จ ให้จัดเก็บข้อมูลบางอย่างเอาไว้ เช่น เก็บชื่อล็อกอินไว้แบบเซสชั่น • เพจอื่นๆ ที่มีข้อกำหนดว่า ต้องล็อกอินเข้าสู่ระบบจึงจะใช้งานได้ เพจนั้นต้องมีขั้นตอนการตรวจสอบล็อกอินจากเซสชั่นก่อน หากมีข้อมูลแสดงว่าเข้าสู่ระบบแล้ว แต่หากไม่มีก็อาจยกเลิกการใช้งานเพจนั้น • เมื่อมีการเข้าสู่ระบบ ก็ต้องมีการออกจากระบบ หรือการล็อกเอาต์ (Logout) ทั้งนี้การล็อกเอาต์ก็คือการลบข้อมูลการล็อกอินที่เก็บไว้ในเซสชั่นทิ้งไปนั่นเอง
ขั้นตอนการออกแบบและเขียนโค้ดขั้นตอนการออกแบบและเขียนโค้ด • index.phpเพจหลักของการทำงาน • login.phpสำหรับการล็อกอินเข้าสู่ระบบ • logout.phpสำหรับล็อกเอาต์ออกจากระบบ
Index.php <?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Content-Type" content="text/html; charset=windows-874" /> <title>หน้าหลัก</title></head> <body> <?php if(!isset($_SESSION['login'])) { echo "<h3><font color=red>ท่านยังไม่ได้ Login เข้าสู่ระบบ</font></h3><a href=login.php>คลิกที่นี่เพื่อเข้าสู่ระบบ</a>"; }else { echo "<h3>ยินดีต้อนรับ: {$_SESSION['login']}</h3><a href=logout.php>ออกจากระบบ</a>";}?> </body></html>
login.php <?php session_start(); if(!empty($_POST['login'])) { $_SESSION['login'] = $_POST['login']; header("Refresh: 5; url=index.php"); echo "<h3>ท่านเข้าสู่ระบบแล้ว จะกลับสู่หน้าหลักใน 5 วินาที</h3>"; exit;}?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Content-Type" content="text/html; charset=windows-874" /> <title>Login</title></head> <body> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="form1" id="form1"> Login: <input type="text" name="login"> <input type="submit" value="เข้าสู่ระบบ"><br> </form> </body> </html>
logout.php <?php session_start(); if(isset($_SESSION['login'])) { unset($_SESSION['login']); header("Refresh: 5; url=index.php"); echo "<h3>ท่านออกจากระบบแล้ว จะกลับสู่หน้าหลักใน 5 วินาที</h3>"; exit;}?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-874" /> <title>Logout</title> </head> <body> </body> </html>