เซสชั่น

Download Report

Transcript เซสชั่น

1
• ในบทนี้จะได้ เรี ยนรู้ วธิ ีการจดจาผู้ใช้ รวมทั้งการส่ งข้ อมูล
จากเพจหนึ่งไปยังอีกเพจหนึ่ง (วิธีการเก็บข้ อมูลทีท่ าให้
เรียกใช้ ได้ จากหลายๆ เพจ) โดยใช้ คุกกี้และเซสชั่น
2
• บรรยายโดยผู้สอนและใช้ เอกสารประกอบการสอนของ
ผู้สอน
• สอนโดยใช้ ส่ือคอมพิวเตอร์ ผ่านเครื่ องฉาย
• อภิปรายในชั้นเรี ยนร่ วมกัน
่ เติมจากตาราและเอกสารทีเ่ กีย่ วข้ อง
• ให้ นิสิตค้ นคว้ าเพิม
• ทาแบบฝึ กหัดท้ ายบท
3
• ประเมินผลจากการตอบคาถามและอภิปรายในชั้นเรี ยน
• ทาแบบฝึ กหัดท้ ายบท
• ทารายงานส่ ง
4
คุกกี้ (Cookie) คือข้ อมูลขนาดเล็กที่เราส่ งไปเก็บไว้ ในเครื่ องผู้ใช้ เพื่อบันทึกข้ อมูล
บางอย่ างเกี่ยวกับผู้ใช้ หลังจากนัน้ โปรแกรมเว็บบราวเซอร์ ในเครื่ องผู้ใช้ จะส่ งคุกกีก้ ลับมา
ให้ โดยอัตโนมัตใิ นแต่ ละครัง้ ที่เรียกมายังเพจต่ างๆ ของเรา เราจึงนาข้ อมูลมาใช้ ในเพจได้
นอกจากการจดจาผู้ใช้ แล้ ว เราอาจใช้ คุกกีเ้ ก็บ
ข้ อมูลเอาไว้ ใช้ งานร่ วมกันในหลายๆ เพจ
ซึ่งจะทาให้ ผ้ ูใช้ ร้ ูสึกว่ าเพจต่ างๆ เหล่ านัน้
มีการทางานที่ประสานกันอย่ างกลมกลืน
5
ฟั งก์ ช่ ันที่ใช้ กาหนดคุกกีค้ ือ setcookie ซึ่งมีรูปแบบดังนี ้
รู ปแบบ
bool setcookie (string ชื่อ [, string ค่า [,int เวลาหมดอายุ
[,string พาธ]])
เวลาหมดอายุของคุกกีจ้ ะกาหนดเป็ นค่ า Timestamp เช่ น ถ้ าระบุว่า time() +3600 จะ
หมายถึงให้ คุกกีห้ มดอายุในอีก 1 ชั่วโมงข้ างหน้ า (ฟั งก์ ช่ ัน time จะให้ ค่า Timestamp ของ
วัน/เวลาปั จจุบัน)
6
set_cookie.php
<?
/*กำหนดคุ๊กกี ้ชื่อ username ให้ ค่ำ "SANYA" และมีอำยุ 1 สัปดำห์ (หมดอำยุ
ในอีก 7วัน ข้ ำงหน้ ำ)*/
setcookie("username","SANYA",time()+(3600*24*7));
echo "กำหนดคุกกี ้แล้ ว";
?>
7
คุกกีท้ งั ้ หมดที่เว็บบราวเซอร์ ส่งมาให้ เมื่อเรี ยกมายังเพจหนึ่งๆ จะถูกรวบรวมเก็บไว้ ในตัวแปรชื่อ
$_COOKIE ซึ่งเป็ นอาร์ เรย์ แบบ Superglobal (เรี ยกใช้ ได้ จากทุกทีในโค้ ดโปรแกรม) การเรี ยกใช้ ค่าของคุกกีจ้ ะ
มีรูปแบบเหมือนกับการเรี ยกใช้ ค่าที่ส่งมาจากฟอร์ ม เพียงแต่ เปลี่ยนชื่อตัวแปรไปเท่ านัน้
<?
if(isset($_COOKIE["username"])){
echo "ค่ำคุ๊กกี ้ username ที่บนั ทึกเก็บไว้ คือ " .
$_COOKIE["username"];
}
else{
echo "ไม่มีคกุ กี ้ username";
}
?>
read_cookie.php
8
เมื่อต้ องการลบคุกกี ้ ให้ ใช้ ฟังก์ ช่ นั setcookie กาหนดค่ าสตริงว่ างให้ กับคุกกีท้ ่ จี ะลบ และกาหนดเวลา
หมดอายุเป็ นเวลาในอดีตที่ผ่านมาแล้ ว (เช่ น time() -3600 ซึ่งหมายถึง 1 ชั่วโมงที่แล้ ว) นอกจากนีถ้ ้ ามีการระบุ
พาธ (อาร์ กิวเมนต์ ตัวที่ 4 ) ตอนกาหนดคุกกี ้ เวลาลบก็จะต้ องระบุพาธให้ เหมือนเดิมด้ วย
<?
//ลบคุ๊กกี ้ username โดยกำหนดค่ำเป็ นสตริงว่ำง และกำหนดเวลำ
หมดอำยุเป็ น 1 ชัว่ โมงที่แล้ ว
setcookie("username","",time()-3600);
echo "ลบคุ๊กกี ้แล้ ว";
?>
<a href="read_cookie.php">คลิกเพื่อดูคำ่ ของคุ๊กกี ้
username</a>
9
<?
if(isset($_POST["send"]))
process_form();
else
show_form();
//ฟั งก์ชนั่ ที่ใช้ แสดงฟอร์ มสาหรับล็อกอิน
function show_form(){
$user = ""; //กาหนดค่าสตริงว่างให้ กบั ตัวแปร $user ไว้ ก่อน
if(isset($_Cookie["username"])){ //ตรวจสอบว่ามีคกุ กี ้ชื่อ username หรื อไม่
//ถ้ ามีให้ เก็บค่าของคุกกี ้ไว้ ในตัวแปร $user เพื่อแสดงออกมาในเท็กซ์บ๊อกซ์
$user = $_COOKIE["username"];
}
/*แสดงฟอร์ มสาหรับล็อกอินออกมา โดยนาค่าของตัวแปร $user ไปแสดงใน
เท็กซ์บอ็ กซ์(กรณีไม่มีคกุ กี ้ username ตัวแปร $user จะมีคา่ เป็ นสตริงว่าง)*/
echo <<<HTMLBLOCK
<h3>เข้ าสู้ระบบ</h3>
<form method="POST" action="{$_SERVER['PHP_SELF']}">
ชื่อผู้ใช้ : <input type="text" name="uname" value="{$user}"><br>
รหัสผ่าน : <input type="password" name="passwd"><br>
<input type="submit" name="send" value="เข้ าสูร่ ะบบ">
</form>
HTMLBLOCK;
}
//ฟั งก์ชนั่ ที่ใช้ ประมวลผลฟอร์ ม
function process_form(){
$user = trim($_POST["uname"]);//เก็บ username ไว้ ในตัวแปร $user
$pass = $_POST["passwd"];//เก็บรหัสผ่านไว้ ในตัวแปร $pass
/*ตรงจุดนี ้สมมติตรวจสอบชื่อและรหัสผ่านที่ผ้ ใู ช้ ป้อนเข้ ามาแล้ วว่าถูกต้ อง*/
/*กาหนดคุกกี ้ชื่อ username ลงในเครื่ องผู้ใช้ โดยให้ มีคา่ เป็ นชื่อที่ผ้ ใู ช้ ป้อนเข้ า
มาในฟอร์ ม (ในฟั งก์ชนั่ show_form ไม่ได้ สนใจคุกกี ้จะมีคา่ อะไร แต่สนใจว่ามี
หรื อไม่มีคกุ กี ้นี ้แค่นนเอง)
ั้
และให้ คกุ กี ้มีอายุ 10 นาที*/
setcookie("username",$user,time()+600);
echo "<h3>สวัสดี $user </h3>";
echo "ได้ เข้ าสูร่ ะบบแล้ ว";
}
?>
10
การทดสอบโปรแกรม ให้ คุณป้อนชื่อผู้ใช้ และรหัสผ่ านอะไรก็ได้ เพราะเป็ นเพียงการสมมติ ไม่ ได้ มีการ
ตรวจสอบจริงๆ เสร็จแล้ วคลิกปุ่ ม “เข้ าสู่ระบบ”
จากนัน้ ให้ ปิดเว็บบราวเซอร์ เปิ ดขึน้ มาใหม่ แล้ วเรี ยกไปยังเพจ login.php อีกครั ง้ ชื่อผู้ใช้ ท่ ีเคยป้อนไว้ จะแสดง
ออกมาโดยอัตโนมัติ ดังรู ป
11
การใช้ เซสชั่น (Session) เป็ นอีกหนทางหนึ่งที่ช่วยให้ เราจดจาผู้ใช้ และส่ งข้ อมูลระหว่ างเพจได้ แต่ ละ
เซสชั่นจะเก็บข้ อมูลไว้ ในเว็บเซิฟเวอร์ และจะส่ งหมายเลขเซสชั่น (SessionID) ไปเก็บไว้ ในเครื่ องผู้ใช้
หมายเลขนีจ้ ะบอกให้ PHP รู้ ว่าข้ อมูลใดในเว็บเซิร์ฟเวอร์ สัมพันธ์ กับผู้ใช้ คนใด
12
เมื่อต้ องการใช้ งานเซสชั่น อันดับแรกให้ เริ่มต้ นเซสชั่นโดยใช้ ฟังก์ ช่ ัน
session_start
session_start();
ฟั งก์ ช่ ันนีจ้ ะสุ่มหมายเลขเซสชั่นที่ไม่ ซา้ กันในแต่ ละครั ง้ ขึน้ มา แล้ วส่ งไป
เก็บเป็ นคุกกีไ้ ว้ ในเครื่ องผู้ใช้ โดยทั่วไปจึงต้ องเรี ยกใช้ ฟังก์ ช่ ันนีก้ ่ อนที่จะแสดง
เนือ้ หาใดๆ ออกมาในเพจ ยกเว้ นเมื่อทา Output Bufferring
13
PHP จัดเตรียมอาร์ เรย์ ช่ ือ $_SESSION ไว้ ให้ คุณเก็บและอ่ านค่ าของตัวแปรเซสชั่น
(Session Variable) เช่ น
$_SESSION["username"]=“sanya";
คือการกาหนดตัวแปรเซสชั่นชื่อ Username ให้ มีค่าเท่ ากับ “sanya” และเนื่องจากตัว
แปร $_SESSION เป็ นตัวแปรแบบ Superglobal ดังนัน้ คุณจึงเรียกใช้ ค่าของตัวแปรเซสชั่น
ต่ างๆ ได้ จากทุกเพจตราบใดที่เซสชั่นนัน้ ยังไม่ ถูกปิ ดลงไป
เมื่อต้ องการเรียกใช้ ตัวแปรเซสชั่นจากเพจใดก็ตาม คุณจะต้ องเรียกฟั งก์ ช่ ัน
session_start ในเพจนัน้ ก่ อนทุกครัง้ เพื่อบอกให้ PHP ทางานต่ อจากเซสชั่นเดิม และโหลด
ข้ อมูลของตัวแปรเซสชั่นต่ างๆ ที่สัมพันธ์ กับเซสชั่นนัน้ กลับเข้ ามาในโปรแกรม ซึ่ง PHP จะ
รู้ได้ ว่าข้ อมูลใดเป็ นของผู้ใช้ ปัจจุบนั โดยดูจากหมายเลขเซสชั่นที่เว็บบราวเซอร์ ส่งมาให้
14
เนื่องจากจริงๆแล้ วตัวแปรเซสชั่นก็คือสมาชิกของอาร์ เรย์ $_SESSION เราจึงใช้
ฟั งก์ ช่ ันunset ลบตัวแปลเซสชั่นได้ เช่ น
unset($_SESSION["username"]);
คือการลบตัวแปรเซสชั่นชื่อ username ทิง้ ไป
หมายเหตุ
ห้ ามใช้ ฟังก์ชนั่ unset กับอาร์ เรย์ $_SESSION ทั ้งชุด (unset($_SESSION)) เพราะจะทาให้
กาหนดตัวแปรเซสชัน่ ไม่ได้ อีก ถ้ าคุณต้ องการลบคัวแปรเซสชัน่ ทั ้งหมดในเซสชัน่ ปั จจุบนั
ขอให้ ใช้ ฟังก์ชนั่ session_unset
session_unset();
15
การปิ ดเซสชั่นให้ ใช้ ฟังก์ ช่ นั session_destroy
session_destroy();
ยกตัวอย่ างเช่ น เมื่อผู้ใช้ ลอ็ กอินเข้ ามา เราอาจเริ่มต้ นเซสชั่นพร้ อมทัง้
กาหนดตัวแปรเซสชั่นที่เอาไว้ จดจาว่ าผู้ใช้ คนนัน้ ได้ ผ่านการล็อกอินมาแล้ ว หลังจาก
นัน้ เมื่อผู้ใช้ คลิปปุ่ มออกจากระบบ เราก็จะเรี ยกใช้ ฟังก์ ช่ นั session_destroy เพื่อปิ ด
เซสชั่นนัน้ ซึ่งจะทาให้ ตวั แปรทัง้ หมดในเซสชั่นถูกลบทิง้ ไป
นอกจากนีเ้ ซสชั่นจะถูกปิ ดไปโดยอัตโนมัติ ถ้ าหากผู้ใช้ ปิดโปรแกรมเว็บ
บราวเซอร์
16
ตัวอย่ างต่ อไปนีจ้ ะแสดงการใช้ งานเซสชั่น โดยประกอบด้ วย 3 เพจที่มีการทางานดังนี ้
• session1.php จะกาหนดตัวแปรเซสชั่นชื่อ username ขึน้ มา และมีลิงค์ สาหรั บเชื่อมโยง
ไปยังเพจ session2.php
• session2.php จะตรวจสอบว่ ามีตัวแปรเซสชั่นชื่อ usernameหรื อไม่ ถ้ ามีกจ็ ะแสดงค่ า
ออกมา และจะสั่งปิ ดเซสชั่นด้ วย เพจนีจ้ ะมีลิงค์ สาหรับเชื่อมโยงไปยังเพจ session3.php
• session3.php จะตรวจสอบว่ ามีตัวแปรเซสชั่นชื่อ username หรื อไม่ ถ้ ามีกจ็ ะแสดงค่ า
ออกมา
17
session1.php
<?php
session_start();
$_SESSION["username"] = "sanya";
echo "กาหนดตัวแปรเซสชัน่ username แล้ ว";
?>
<br><a href="session2.php">ไปยังเพจ session2.php</a>
18
session2.php
<?php
session_start();
if(isset($_SESSION["username"]))
echo "ค่าของตัวแปรเซสชัน่ username คือ " . $_SESSION["username"];
else
echo "ไม่มีตวั แปรเซสชัน่ username";
session_destroy();
?>
<br><a href="session3.php">ไปยังเพจ session3.php</a>
19
session3.php
<?php
session_start();
if(isset($_session["username"]))
echo "ค่าของตัวแปรเซสชัน่ username คือ " . $_SESSION["username"];
else
echo "ไม่มีตวั แปรเซสชัน่ username";
?>
20
session_var1.php
<?php
session_start();
//เก็บอาร์ เรย์ไว้ ในตัวแปรเซสชัน่ ชือ่ arr
$_SESSION["arr"] = array(1,2,3);
//เก็บ Timestamp(เลขจานวนเต็ม) ไว้ ในตัวแปรเซสชัน่ ชื่อ timestamp
$_SESSION["timestamp"]=time();
//เก็บ Database Link Identifier (ออบเจ็คชนิด mysqli) ไว้ ในตัวแปรเซสชัน่ ชื่อ db_conn
$cn = mysql_connect("localhost","root","1234");
$_SESSION["db_conn"]=$cn;
?>
กาหนดตัวแปรเซสชัน่ แล้ ว<br>
<a href="session_var2.php">ไปยังเพจ session_var2.php</a>
21
session_var2.php
<?php
session_start();
//แสดงค่าทั ้งหมดในอาร์ เรย์ $_SESSION ออกมา
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
?>
22
23
• ในที่นีจ้ ะลองทาให้ ดู 4 ไฟล์
• ฟอร์ มล็อกอิน login_form.php
• ตรวจสอบ Password คือ check_user.php ในที่น่ ีไม่ ได้ ดงึ จาก
ฐานข้ อมูล
• หน้ าเมนูหลัก mainmenu.php ซึ่งจะมีโค้ ดตรงสอบว่ ามีการ login
มาถูกต้ องไหม ทาให้ ผ้ ูท่ รี ้ ูไฟล์ จะมาทางลัดได้
• ไฟล์ logout.php เพื่อเคลียร์ ค่า Session ออก
24
• ตรวจสอบว่ า Login มาใช่ หรื อไม่
Login_form.php
<HTML>
<HEAD><TITLE> iamsanya.com </TITLE> </HEAD>
<BODY>
**User Form**
<FORM METHOD=POST ACTION="check_user.php">
User : <INPUT TYPE="text" NAME="user"><BR>
Password : <INPUT TYPE="password"
NAME="pass"><BR>
<INPUT TYPE="submit" value="Login">
</FORM>
</BODY>
</HTML>
25
• เมื่อ Login ผ่ านจะเก็บค่ า sessionid ไว้ ท่ ี $_SESSION["user_sta"]
<?
Check_user.php
session_start();
ob_start();
ตรงนี ้อำจจะตรวจด้ วยฐำนข้ อมูลได้
if (($user=="admin") and ($pass=="5678"))
{
$a = session_id();
$_SESSION["user_sta"] = $a;
กำรทำ Redirect อำจจะใช้ JavaScript แบบนี ้แทรกก็ได้
เพรำะไม่แนะนำให้ ใช้ ob_start()
echo "Session ID=".$a;
<script type="text/javascript">
header('Location:mainmenu.php');
window.location="mainmenu.php";
}else{
</script>
echo "<br>User or Password incorrect. " ;
echo "<a href=login_form.php>Back</a>";
}
?>
26
• ตรวจสอบว่ า sessionid ตรงกับ Session ที่เก็บไว้ หรื อไม่
<?
Mainmenu.php
session_start();
ob_start();
$a=session_id();
if($_SESSION["user_sta"] <> $a)
{
echo "ไม่ได้ Login มำให้ กลับไป หน้ ำแรก";
echo "<a href=login_form.php> Back </a>";
}else{
?>
Welcome to Main Menu :: Admin
<br>
<a href="logout.php">Log out</a>
<?}?>
Code สีแดงให้ เอำไปไว้ สว่ นแรกของไฟล์
ที่จะใช้ ได้ ต้อง Login ก่อน ทุกไฟล์
เพื่อป้องกันกำรเข้ ำไม่ถกู ต้ องจำกผุ้ใช้
27
• เคลียร์ ค่า session ระบุเป้นตัวแปรหรื อทัง้ หมดกได้
Logout.php
<?
session_destroy();
ob_start();
// unset($_SESSION["user_sta"]);
header('Location:login_form.php');
?>
28
• คุกกี ้ (Cookie) คือข้ อมูลขนาดเล็กที่เราส่ งไปเก็บไว้ ในเครื่ องของผู้ใช้ เพื่อบันทึกข้ อมูล
•
•
•
•
บางอย่ างเกี่ยวกับผู้ใช้ คุกกีย้ ังช่ วยให้ เราส่ งข้ อมูลจากเพจหนึ่งไปยังอีกเพจหนึ่งได้ แทนที่
จะต้ องเก็บข้ อมูลนัน้ ลงไฟล์ หรื อฐานข้ อมูล ซึ่งเป็ นวิธีท่ ยี ่ ุงยากกว่ า
เมื่อคุกกีถ้ ูกเก็บลงในเครื่ องผู้ใช้ แล้ ว หลังจากนัน้ เว็บบราวเซอร์ จะส่ งคุกกีก้ ลับมาให้ เราโดย
อัตโนมัติ ทุกครั ง้ ที่ผ้ ูใช้ เรี ยกมายังเพจต่ างๆ ในเว็บเซิร์ฟเวอร์ ของเรา
การกาหนดคุกกี ้ ให้ ใช้ ฟังก์ ช่ ัน setcookie โดยคุกกีแ้ ต่ ละอันจะมีช่ ือและมีค่า คล้ ายกับตัวแปร
แต่ รูปแบบการใช้ งานไม่ เหมือนกัน นอกจากนีเ้ รายังสามารถกาหนดเวลาหมดอายุให้ กับคุกกี ้
แต่ ละอันได้ ถ้ าเว็บบราวเซอร์ พบว่ าคุกกีห้ มดอายุแล้ วก็จะไม่ ส่งกลับมาให้ เรา จึงเท่ ากับไม่ มี
คุกกีน้ ัน้ ในเครื่ องผู้ใช้
PHP จะรวบรวมคุกกีท้ ่ เี ว็บบราวเซอร์ ส่งกลับมายังเว็บเซิร์ฟเวอร์ ของเรา ไว้ ในตัวแปรอาร์ เรย์
ชื่อ $_COOKIE
การลบคุกกี ้ ให้ ใช้ ฟังก์ ช่ ัน setcookie กาหนดค่ าสตริงว่ างให้ กับคุกกี ้ และกาหนดเวลา
หมดอายุให้ เป็ นเวลาในอดีตที่ผ่านมาแล้ ว
29
• การใช้ เซสชั่น (Session) เป็ นอีกวิธีหนึ่งที่ช่วยให้ เราจดจาข้ อมูลเกี่ยวกับผู้ใช้ และส่ งข้ อมูล
•
•
•
•
•
จากเพจหนึ่งไปยังอีกเพจหนึ่งได้
ข้ อมูลที่เราจดจาไว้ ในเซสชั่น เรี ยกว่ า ตัวแปรเซสชั่น (Session Variable) ซึ่งจะถูกเก็บไว้ ท่ ี
เครื่ องเซิร์ฟเวอร์ ผู้ใช้ จงึ ไม่ มีทางแก้ ไขข้ อมูลได้ (ในขณะที่คุกกีน้ ัน้ ผู้ใช้ สามารถแก้ ไขได้
เพราะเก็บอยู่ในเครื่ องผู้ใช้ )
การเริ่ มต้ นเซสชั่นใหม่ ให้ ใช้ ฟังก์ ช่ ัน session_start
เมื่อมีการเก็บค่ าไว้ ในตัวแปรเซสชั่นแล้ วต้ องการเรี ยกใช้ ค่าเหล่ านัน้ จากในเพจต่ างๆ ให้ เรี ยก
ฟั งก์ ช่ ัน session_start ก่ อนทุกครั ง้ เพื่อโหลดค่ าของตัวแปรเซสชั่นที่บันทึกเก็บไว้ กลับเข้ ามา
ในโปรแกรม
PHP จะรวบรวมตัวแปรเซสชั่นทัง้ หมดในเซสชั่นปั จจุบันเก็บไว้ ในตัวแปรอาร์ เรย์ ช่ ือ
$_SESSION โดยตัวแปรเซสชั่นแต่ ละตัวจะเป็ นสมาชิกหนึ่งๆ ของอาร์ เรย์ นี ้
การปิ ดหรื อทาลายเซสชั่นปั จจุบัน ให้ ใช้ ฟังก์ ช่ ัน session_destroy
30
31