Session Management: การเก็บข้อมูลใน Session
หลังจากที่เราได้เรียนรู้เกี่ยวกับการเริ่มต้น Session และการจัดการ Session ID ในบทที่แล้ว ในบทนี้เราจะมาดูวิธีการเก็บข้อมูลที่จำเป็นของผู้ใช้ไว้ใน Session ซึ่งเป็นหัวใจสำคัญของการใช้งาน Session ในการสร้างประสบการณ์การใช้งานที่ต่อเนื่องและเป็นส่วนตัว
การใช้งาน $_SESSION
ตัวแปร $_SESSION คือ Superglobal Array ใน PHP ที่ใช้สำหรับเก็บข้อมูล Session ข้อมูลที่เก็บใน $_SESSION จะสามารถเข้าถึงได้ในทุกๆ หน้าของเว็บไซต์ ตราบใดที่ Session ได้ถูกเริ่มต้นด้วย session_start()
วิธีการใช้งาน $_SESSION นั้นง่ายมาก เราสามารถกำหนดค่าให้กับ Key ใดๆ ใน Array นี้ได้เหมือนกับการใช้งาน Array ทั่วไป
<?php
session_start();
// เก็บชื่อผู้ใช้ใน Session
$_SESSION['username'] = 'JohnDoe';
// เก็บ ID ผู้ใช้ใน Session
$_SESSION['user_id'] = 123;
// เก็บสถานะการเข้าสู่ระบบ
$_SESSION['logged_in'] = true;
echo 'ข้อมูลถูกเก็บใน Session แล้ว';
?>
ในตัวอย่างข้างต้น เราได้เก็บข้อมูล 3 อย่างไว้ใน Session:
username: ชื่อผู้ใช้user_id: ID ของผู้ใช้logged_in: สถานะการเข้าสู่ระบบ
เมื่อต้องการเข้าถึงข้อมูลที่เก็บไว้ใน Session เราก็สามารถใช้ $_SESSION ได้เช่นกัน
<?php
session_start();
// ตรวจสอบว่ามี username ใน Session หรือไม่
if (isset($_SESSION['username'])) {
echo 'ยินดีต้อนรับ, ' . $_SESSION['username'] . '!';
} else {
echo 'กรุณาเข้าสู่ระบบ';
}
?>
ในตัวอย่างนี้ เราตรวจสอบว่ามี username ใน Session หรือไม่ ถ้ามี ก็จะแสดงข้อความต้อนรับ หากไม่มี ก็จะแสดงข้อความให้เข้าสู่ระบบ
การเก็บข้อมูลที่จำเป็น
การเก็บข้อมูลใน Session ควรจำกัดเฉพาะข้อมูลที่จำเป็นสำหรับการใช้งานเท่านั้น ข้อมูลที่จำเป็นโดยทั่วไปมักจะเป็น:
- ข้อมูลประจำตัวผู้ใช้: เช่น ID ผู้ใช้, ชื่อผู้ใช้, อีเมล
- สถานะการเข้าสู่ระบบ: เพื่อตรวจสอบว่าผู้ใช้ได้เข้าสู่ระบบแล้วหรือไม่
- สิทธิ์การใช้งาน: เช่น สิทธิ์ในการเข้าถึงหน้าผู้ดูแลระบบ
- ข้อมูลตะกร้าสินค้า: สำหรับเว็บไซต์ E-commerce
- การตั้งค่าผู้ใช้: เช่น ภาษาที่ใช้, รูปแบบวันที่
ตัวอย่างการเก็บข้อมูลตะกร้าสินค้า:
<?php
session_start();
// เพิ่มสินค้าลงในตะกร้า
if (isset($_POST['add_to_cart'])) {
$product_id = $_POST['product_id'];
$quantity = $_POST['quantity'];
// ตรวจสอบว่ามีตะกร้าสินค้าใน Session หรือไม่
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
// เพิ่มสินค้าลงในตะกร้า
$_SESSION['cart'][$product_id] = $quantity;
echo 'เพิ่มสินค้าลงในตะกร้าแล้ว';
}
?>
<form method="post">
<input type="hidden" name="product_id" value="123">
<input type="hidden" name="quantity" value="1">
<button type="submit" name="add_to_cart">เพิ่มลงตะกร้า</button>
</form>
<?php
// แสดงสินค้าในตะกร้า
if (isset($_SESSION['cart'])) {
echo '<h3>สินค้าในตะกร้า</h3>';
echo '<ul>';
foreach ($_SESSION['cart'] as $product_id => $quantity) {
echo '<li>Product ID: ' . $product_id . ', Quantity: ' . $quantity . '</li>';
}
echo '</ul>';
}
?>
ในตัวอย่างนี้ เราใช้ $_SESSION['cart'] เพื่อเก็บข้อมูลตะกร้าสินค้า โดยใช้ Product ID เป็น Key และ Quantity เป็น Value
การหลีกเลี่ยงการเก็บข้อมูลที่ละเอียดอ่อน
สิ่งสำคัญที่สุดในการจัดการ Session คือการหลีกเลี่ยงการเก็บข้อมูลที่ละเอียดอ่อนโดยตรงใน Session ข้อมูลที่ละเอียดอ่อน ได้แก่:
- รหัสผ่าน: ห้ามเก็บรหัสผ่านที่ไม่ผ่านการ Hash ใน Session เด็ดขาด
- ข้อมูลบัตรเครดิต: ห้ามเก็บข้อมูลบัตรเครดิตใน Session
- ข้อมูลส่วนตัวที่ละเอียดอ่อน: เช่น หมายเลขประกันสังคม, ข้อมูลทางการแพทย์
ถ้าจำเป็นต้องใช้ข้อมูลที่ละเอียดอ่อน ควรเก็บเฉพาะ ID ของข้อมูลนั้นๆ แล้วดึงข้อมูลจากฐานข้อมูลเมื่อต้องการใช้งาน ตัวอย่างเช่น แทนที่จะเก็บข้อมูลบัตรเครดิตใน Session ให้เก็บเฉพาะ Credit Card ID แล้วดึงข้อมูลบัตรเครดิตจากฐานข้อมูล (โดยเข้ารหัสข้อมูลในฐานข้อมูลอย่างปลอดภัย) เมื่อต้องการชำระเงิน
นอกจากนี้ ควรใช้ HTTPS เพื่อเข้ารหัสการสื่อสารระหว่าง Browser และ Server เพื่อป้องกันการดักจับข้อมูล Session Cookie
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง: ระบบ Login
ระบบ Login เป็นกรณีใช้งานที่พบบ่อยที่สุดสำหรับการจัดการ Session เมื่อผู้ใช้ Login สำเร็จ เราจะเก็บข้อมูลที่จำเป็นของผู้ใช้ไว้ใน Session เช่น User ID และ Username เพื่อให้ระบบรู้ว่าผู้ใช้ได้ Login แล้ว
<?php
session_start();
// ตรวจสอบข้อมูล Login จากฐานข้อมูล
$username = $_POST['username'];
$password = $_POST['password'];
// (สมมติว่า $user คือข้อมูลผู้ใช้ที่ได้จากการตรวจสอบในฐานข้อมูล)
$user = // ... (ดึงข้อมูลผู้ใช้จากฐานข้อมูลโดยใช้ username)
if ($user && password_verify($password, $user['password'])) {
// Login สำเร็จ
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['logged_in'] = true;
echo 'Login สำเร็จ! ยินดีต้อนรับ, ' . $_SESSION['username'] . '!';
} else {
// Login ไม่สำเร็จ
echo 'Username หรือ Password ไม่ถูกต้อง';
}
?>
หลังจาก Login สำเร็จ เราจะเก็บ user_id, username และ logged_in ไว้ใน Session เพื่อใช้ในการตรวจสอบสิทธิ์การใช้งานในหน้าอื่นๆ
ข้อผิดพลาดที่พบบ่อย: session_start() ไม่ได้ถูกเรียกใช้งาน
ข้อผิดพลาดที่พบบ่อยที่สุดคือการลืมเรียกใช้งาน session_start() ก่อนที่จะใช้งาน $_SESSION หากไม่ได้เรียกใช้งาน session_start() การเข้าถึง $_SESSION จะไม่ทำงานและอาจทำให้เกิดข้อผิดพลาดหรือพฤติกรรมที่ไม่คาดคิด
<?php
// ลืมเรียกใช้งาน session_start()
// session_start();
$_SESSION['error'] = 'เกิดข้อผิดพลาด!'; // บรรทัดนี้จะไม่ทำงานหากไม่ได้เรียก session_start()
echo $_SESSION['error']; // อาจเกิดข้อผิดพลาด หรือไม่ได้แสดงผลลัพธ์ที่ต้องการ
?>
วิธีแก้ไข: ตรวจสอบให้แน่ใจว่า session_start() ถูกเรียกใช้งานในทุกๆ หน้าที่ต้องการใช้งาน $_SESSION และต้องเรียกใช้งานก่อนที่จะมีการส่ง Output ใดๆ ไปยัง Browser
ข้อผิดพลาดที่พบบ่อย: การเก็บข้อมูลมากเกินไปใน Session
การเก็บข้อมูลมากเกินไปใน Session อาจทำให้ประสิทธิภาพของเว็บไซต์ลดลง เนื่องจากข้อมูล Session จะถูกเก็บไว้ใน Server และถูกส่งไปพร้อมกับ Cookie ในทุกๆ Request ดังนั้น ควรเก็บเฉพาะข้อมูลที่จำเป็นเท่านั้น
วิธีแก้ไข: พิจารณาว่าข้อมูลใดที่จำเป็นต้องเก็บไว้ใน Session และข้อมูลใดที่สามารถดึงมาจากฐานข้อมูลได้เมื่อต้องการใช้งาน
สรุป
การเก็บข้อมูลใน Session เป็นส่วนสำคัญของการจัดการ Session ใน PHP ช่วยให้เราสามารถสร้างประสบการณ์การใช้งานที่ต่อเนื่องและเป็นส่วนตัวสำหรับผู้ใช้ อย่างไรก็ตาม สิ่งสำคัญคือต้องเก็บเฉพาะข้อมูลที่จำเป็นและหลีกเลี่ยงการเก็บข้อมูลที่ละเอียดอ่อนโดยตรงใน Session เพื่อความปลอดภัยและความเป็นส่วนตัวของผู้ใช้
ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับการทำลาย Session เมื่อผู้ใช้ออกจากระบบหรือเมื่อ Session หมดอายุ