Superglobals: $_SESSION
ในบทเรียนก่อนหน้า เราได้เรียนรู้เกี่ยวกับ $_REQUEST ซึ่งเป็น Superglobal array ที่รวมข้อมูลจาก GET, POST และ COOKIE เข้าด้วยกัน ในบทนี้ เราจะมาทำความรู้จักกับ Superglobal array อีกตัวหนึ่งที่มีความสำคัญอย่างมากในการพัฒนาเว็บแอปพลิเคชัน นั่นคือ $_SESSION
ความหมายของ $_SESSION
$_SESSION เป็น Superglobal array ที่ใช้ในการจัดการ Session ใน PHP Session คือวิธีการเก็บข้อมูลของผู้ใช้ในขณะที่ผู้ใช้กำลังใช้งานเว็บไซต์ของเรา ข้อมูลเหล่านี้จะถูกเก็บไว้บน Server และสามารถเข้าถึงได้จากทุกหน้าของเว็บไซต์ ตราบใดที่ Session ยังไม่หมดอายุ หรือผู้ใช้ไม่ได้ทำการ Logout
Session มีประโยชน์อย่างมากในการเก็บข้อมูลที่จำเป็นสำหรับการทำงานของเว็บไซต์ เช่น ข้อมูลการ Login ของผู้ใช้, ข้อมูลสินค้าในตะกร้า, หรือข้อมูลอื่นๆ ที่ต้องการเก็บไว้ระหว่างการใช้งาน
ข้อแตกต่างที่สำคัญระหว่าง $_SESSION กับ $_COOKIE คือ $_SESSION เก็บข้อมูลบน Server ในขณะที่ $_COOKIE เก็บข้อมูลบน Client (Browser ของผู้ใช้) ทำให้ $_SESSION มีความปลอดภัยมากกว่า $_COOKIE
การเริ่มต้น Session ด้วย session_start()
ก่อนที่จะใช้งาน $_SESSION ได้ เราจะต้องทำการเริ่มต้น Session ก่อน โดยใช้ฟังก์ชัน session_start() ฟังก์ชันนี้จะสร้าง Session ID ใหม่ หรือดึง Session ID เดิม (ถ้ามี) จาก Cookie ที่ส่งมาจาก Browser ของผู้ใช้
สำคัญ: session_start() จะต้องถูกเรียกใช้งานก่อนที่จะมีการส่ง Output ใดๆ ออกไปยัง Browser (เช่น HTML, text) หากมีการส่ง Output ออกไปก่อน จะทำให้เกิด Error ได้
ตัวอย่าง:
<?php
session_start();
// โค้ดอื่นๆ ของเรา
?>
ข้อผิดพลาดที่พบบ่อย:
- "Cannot send session cookie - headers already sent" error: เกิดจากการเรียก
session_start()หลังจากการส่ง Output ใดๆ ออกไปยัง Browser แล้ว ตรวจสอบให้แน่ใจว่าsession_start()ถูกเรียกใช้งานเป็นสิ่งแรกในไฟล์ PHP - เรียก
session_start()ซ้ำ: ไม่จำเป็นต้องเรียกsession_start()หลายครั้งในหน้าเดียวกัน หากเรียกใช้งานแล้ว ก็สามารถใช้งาน$_SESSIONได้เลย
การกำหนดและเข้าถึงค่าใน $_SESSION
เมื่อเราเริ่มต้น Session แล้ว เราสามารถกำหนดและเข้าถึงค่าใน $_SESSION ได้เหมือนกับ Array ทั่วไป
การกำหนดค่า:
<?php
session_start();
$_SESSION['username'] = 'JohnDoe';
$_SESSION['user_id'] = 123;
$_SESSION['is_logged_in'] = true;
?>
การเข้าถึงค่า:
<?php
session_start();
if (isset($_SESSION['username'])) {
echo 'Username: ' . $_SESSION['username']; // Output: Username: JohnDoe
} else {
echo 'Username not set.';
}
if ($_SESSION['is_logged_in'] === true) {
echo '<p>User is logged in.</p>';
}
?>
การลบค่าออกจาก Session:
<?php
session_start();
// ลบตัวแปร username ออกจาก session
unset($_SESSION['username']);
// ลบ session ทั้งหมด
session_destroy();
?>
คำอธิบายเพิ่มเติม:
unset($_SESSION['username']);จะลบเฉพาะตัวแปรusernameออกจาก$_SESSIONSession ยังคงอยู่ และตัวแปรอื่นๆ ใน$_SESSIONยังสามารถใช้งานได้session_destroy();จะทำลาย Session ทั้งหมด ข้อมูลทั้งหมดใน$_SESSIONจะถูกลบ และ Session ID จะถูกยกเลิก
กรณีใช้งานจริง
- การจัดการ Login: เมื่อผู้ใช้ Login สำเร็จ เราสามารถเก็บข้อมูลผู้ใช้ไว้ใน
$_SESSIONเพื่อตรวจสอบว่าผู้ใช้ได้ Login แล้วหรือไม่ และแสดงข้อมูลที่เกี่ยวข้องกับผู้ใช้ - ตะกร้าสินค้า: ในเว็บไซต์ E-commerce เราสามารถเก็บข้อมูลสินค้าที่ผู้ใช้เลือกไว้ในตะกร้าใน
$_SESSIONเพื่อให้ผู้ใช้สามารถเลือกซื้อสินค้าได้หลายชิ้น และทำการ Checkout ได้ในภายหลัง - การเก็บข้อมูลชั่วคราว: เราสามารถใช้
$_SESSIONในการเก็บข้อมูลชั่วคราวที่จำเป็นสำหรับการทำงานของเว็บไซต์ เช่น ข้อมูลที่ได้จากการ Submit Form หรือข้อมูลที่ได้จากการ Query Database
ตัวอย่าง: การจัดการ Login
login.php:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
// ตรวจสอบ username และ password ในฐานข้อมูล (ควรใช้ Prepared Statements เพื่อป้องกัน SQL Injection)
// ...
// ถ้า username และ password ถูกต้อง
if ($username === 'admin' && $password === 'password') {
$_SESSION['username'] = $username;
$_SESSION['is_logged_in'] = true;
header('Location: dashboard.php'); // Redirect ไปยังหน้า Dashboard
exit();
} else {
$error = 'Invalid username or password.';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<?php if (isset($error)): ?>
<p style="color: red;"><?= $error ?></p>
<?php endif; ?>
<form method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
dashboard.php:
<?php
session_start();
if (!isset($_SESSION['is_logged_in']) || $_SESSION['is_logged_in'] !== true) {
header('Location: login.php'); // Redirect ไปยังหน้า Login ถ้ายังไม่ได้ Login
exit();
}
$username = $_SESSION['username'];
?>
<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
</head>
<body>
<h2>Dashboard</h2>
<p>Welcome, <?= $username ?>!</p>
<a href="logout.php">Logout</a>
</body>
</html>
logout.php:
<?php
session_start();
// ลบ session ทั้งหมด
session_destroy();
header('Location: login.php'); // Redirect ไปยังหน้า Login
exit();
?>
ข้อควรระวังในการใช้งาน $_SESSION
- ความปลอดภัย: ข้อมูลใน
$_SESSIONจะถูกเก็บไว้บน Server ดังนั้นจึงมีความปลอดภัยมากกว่า$_COOKIEแต่ก็ยังควรระมัดระวังในการเก็บข้อมูลที่สำคัญ เช่น รหัสผ่าน หรือข้อมูลทางการเงิน - Session Hijacking: ผู้ไม่หวังดีอาจพยายามขโมย Session ID ของผู้ใช้ เพื่อเข้าถึงข้อมูลใน
$_SESSIONควรใช้ HTTPS เพื่อเข้ารหัสข้อมูลที่ส่งระหว่าง Client และ Server และควร Regenerate Session ID เป็นระยะๆ - Session Timeout: Session จะหมดอายุเมื่อไม่มีการใช้งานเป็นระยะเวลาหนึ่ง ค่า Default ของ Session Timeout จะถูกกำหนดไว้ใน
php.iniหรือสามารถกำหนดได้ใน Code โดยใช้ฟังก์ชันsession_set_cookie_params()หรือini_set() - การใช้งาน Resource: การเก็บข้อมูลจำนวนมากใน
$_SESSIONอาจทำให้ Server ทำงานหนัก ควรเก็บเฉพาะข้อมูลที่จำเป็นเท่านั้น
ในบทเรียนนี้ เราได้เรียนรู้เกี่ยวกับ $_SESSION ซึ่งเป็น Superglobal array ที่ใช้ในการจัดการ Session ใน PHP เราได้เรียนรู้วิธีการเริ่มต้น Session, การกำหนดและเข้าถึงค่าใน $_SESSION, และกรณีใช้งานจริงต่างๆ นอกจากนี้ เรายังได้เรียนรู้ข้อควรระวังในการใช้งาน $_SESSION เพื่อให้เราสามารถใช้งาน $_SESSION ได้อย่างมีประสิทธิภาพและปลอดภัย
ในบทเรียนถัดไป เราจะมาเรียนรู้เกี่ยวกับ Superglobal array อีกตัวหนึ่งที่ใช้ในการจัดการ Cookie นั่นคือ $_COOKIE