จดจำผู้เยี่ยมชมของคุณจากหน้าหนึ่งไปอีกหน้า: การเข้าสู่ระบบที่ปลอดภัย ตะกร้าสินค้าที่อิงเซสชัน และคุกกี้ที่ได้รับการปกป้องอย่างเหมาะสม
เปิดบทเรียนนี้ใน KodokonHTTP ไม่จดจำอะไรเลย แต่ละคำขอมาถึงแบบใหม่เอี่ยม ไม่มีความเชื่อมโยงกับคำขอก่อนหน้า เซสชัน (session) แก้ปัญหานี้ session_start() เชื่อมโยงผู้เยี่ยมชมเข้ากับตัวระบุที่ไม่ซ้ำกัน ซึ่งส่งผ่านคุกกี้ และพื้นที่จัดเก็บ ฝั่งเซิร์ฟเวอร์ ที่เข้าถึงได้ผ่าน $_SESSION จงเรียก session_start() ไว้บนสุดของทุกหน้าที่เกี่ยวข้อง ก่อนที่จะมีการแสดงผลใด ๆ
<?php
declare(strict_types=1);
session_start();
$storedHash = password_hash('secret123', PASSWORD_DEFAULT);
$password = $_POST['password'] ?? '';
if (password_verify($password, $storedHash)) {
session_regenerate_id(true);
$_SESSION['user_id'] = 42;
header('Location: /account.php');
exit;
}
echo "Invalid credentials.";การปกป้องหน้าเว็บสรุปได้เป็นการตรวจสอบการมีอยู่ของผู้ใช้ในเซสชัน และเปลี่ยนเส้นทางหากไม่มี เซสชันยังทำหน้าที่เป็นที่จัดเก็บชั่วคราวอันเหมาะเจาะสำหรับ ตะกร้าสินค้า อาร์เรย์แบบเชื่อมโยง รหัสสินค้า => จำนวน ที่คงอยู่จากหน้าหนึ่งไปอีกหน้า
<?php
declare(strict_types=1);
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}
$_SESSION['cart'] ??= [];
$productId = filter_input(
INPUT_POST,
'product_id',
FILTER_VALIDATE_INT
);
if (is_int($productId)) {
$qty = $_SESSION['cart'][$productId] ?? 0;
$_SESSION['cart'][$productId] = $qty + 1;
}
$count = array_sum($_SESSION['cart']);
echo "Cart: " . $count . " item(s)";ส่วนคุกกี้นั้นอาศัยอยู่ บนอุปกรณ์ของผู้ใช้ และคงอยู่แม้ปิดเบราว์เซอร์ไปแล้ว เหมาะอย่างยิ่งสำหรับธีมหรือการตั้งค่าภาษา ตั้งแต่ PHP 7.3 เป็นต้นมา setcookie() รับอาร์เรย์ของตัวเลือกได้ ให้กำหนด secure (ผ่าน HTTPS เท่านั้น), httponly (มองไม่เห็นจาก JavaScript) และ samesite (จำกัดการส่งจากเว็บไซต์อื่น)
<?php
setcookie('theme', 'dark', [
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
$theme = $_COOKIE['theme'] ?? 'light';
echo "Active theme: " . $theme;การออกจากระบบต้องทำอย่างรอบคอบพอ ๆ กับการเข้าสู่ระบบ ล้าง $_SESSION ให้ว่าง ทำลายเซสชันฝั่งเซิร์ฟเวอร์ และทำให้คุกกี้ที่พาตัวระบุมาหมดอายุ
<?php
session_start();
$_SESSION = [];
session_destroy();
setcookie(session_name(), '', time() - 3600, '/');
header('Location: /login.php');
exit;