🔐 درس دوم: مدیریت نشستها (Sessions)؛ ساخت سیستم لاگین و خروج کاربر
🎯 هدف این درس: یادگیری نحوه استفاده از Sessions برای ذخیره اطلاعات کاربر در طول زمان، ساخت یک فرم لاگین ساده و مدیریت دسترسی کاربران به صفحات محافظتشده.
مهمان عزیز! 👋
در درس قبل یاد گرفتی چطور دادهها را در دیتابیس ذخیره کنی. اما یک سوال مهم وجود دارد: وقتی کاربر لاگین میکند، چگونه سایت متوجه میشود که او کیست و اجازه دسترسی به پنل کاربری را دارد؟
پروتکل HTTP که وب بر اساس آن کار میکند، «بدون حالت» (Stateless) است. یعنی سرور هر درخواست را مستقل از قبلی میبیند و نمیداند شما همان کسی هستید که لحظهای پیش لاگین کردهاید.
برای حل این مشکل از Sessions (نشستها) استفاده میکنیم. Session مانند یک کارت شناسایی موقت است که سرور به مرورگر شما میدهد تا در طول بازدیدتان از سایت، هویت شما را به خاطر بسپارد.
💡 تفاوت Cookie و Session:
Cookie اطلاعات را در کامپیوتر کاربر ذخیره میکند (ناامن برای دادههای حساس)، اما Session اطلاعات را در سرور ذخیره کرده و فقط یک ID منحصربهفرد را به کاربر میدهد.
🚀 مرحله ۱: شروع یک Session
قبل از هر کاری که مربوط به Session باشد، باید تابع session_start() را فراخوانی کنیم. این تابع باید در اولین خط فایل PHP و قبل از هر خروجی HTML یا فضای خالی قرار بگیرد.
start_session.php
PHP
8.x
<?php
// شروع جلسه - باید در اولین خط فایل باشد
session_start();
// ذخیره یک مقدار در Session
$_SESSION['username'] = 'یونس رجستری';
$_SESSION['role'] = 'admin';
echo "اطلاعات کاربر در Session ذخیره شد.";
🔍 مرحله ۲: خواندن اطلاعات Session
حالا در صفحه دیگری (مثلاً داشبورد کاربر) میتوانیم بررسی کنیم که آیا کاربر لاگین کرده است یا خیر.
dashboard.php
PHP
8.x
<?php
session_start();
// بررسی اینکه آیا کلید username در Session وجود دارد؟
if (isset($_SESSION['username'])) {
echo "سلام {$_SESSION['username']}! به داشبورد خوش آمدید.";
} else {
echo "لطفاً ابتدا وارد حساب کاربری خود شوید.";
}
🔐 مرحله ۳: ساخت فرم لاگین ساده
بیایید یک فرم لاگین واقعی بسازیم که نام کاربری را از دیتابیس (که در درس قبل ساختیم) چک کند.
login.php
PHP
8.x
<?php
session_start();
require_once 'db_connect.php';
$error = '';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$email = $_POST['email'];
// جستجوی کاربر در دیتابیس
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);
$user = $stmt->fetch();
if ($user) {
// اگر کاربر پیدا شد، اطلاعات را در Session ذخیره کن
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['name'];
header("Location: dashboard.php");
exit;
} else {
$error = "کاربری با این ایمیل یافت نشد.";
}
}
?>
<!-- فرم HTML -->
<form method="post">
<input type="email" name="email" placeholder="ایمیل خود را وارد کنید" required>
<button type="submit">ورود</button>
<p style="color:red;"><?= $error ?></p>
</form>
🚪 مرحله ۴: خروج از حساب (Logout)
برای خروج، باید Session را نابود کنیم تا دیگر کاربر شناسایی نشود.
logout.php
PHP
8.x
<?php
session_start();
// پاک کردن تمام متغیرهای Session
$_SESSION = array();
// نابود کردن کامل Session
session_destroy();
header("Location: login.php");
exit;
❌ خطاهای رایج در کار با Sessions
🚫 خطای “Headers already sent”:
این خطا زمانی رخ میدهد که قبل از session_start() حتی یک فاصله خالی (Space) یا تگ HTML داشته باشید. همیشه session_start() را در خط اول فایل قرار دهید.
- فراموش کردن session_start: اگر در صفحهای بخواهید از Session استفاده کنید و این تابع را صدا نزنید، با خطا مواجه میشوید.
- ذخیره اطلاعات حساس بدون رمزنگاری: هیچگاه پسورد کاربر را در Session ذخیره نکنید.
🏁 جمعبندی درس دوم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ چگونه یک Session را شروع و مدیریت کنی.
- ✅ تفاوت Cookie و Session را درک کنی.
- ✅ یک سیستم لاگین ساده با کمک دیتابیس و Session بسازی.
- ✅ کاربر را از سیستم خارج (Logout) کنی.
🎓 تمرین عملی درس دوم
سعی کن یک صفحه “پنل کاربری” بسازی که فقط اگر کاربر لاگین کرده باشد نمایش داده شود. اگر لاگین نکرده بود، او را به صفحه لاگین هدایت کن.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | ارتباط با دیتابیس (PDO) | اتصال امن به MySQL، جلوگیری از SQL Injection |
| ۲ | مدیریت نشستها (Sessions) | ساخت سیستم لاگین/خروج، مدیریت دسترسی کاربران |
| ۳ | کار با فایلها (File Handling) | آپلود تصویر، خواندن و نوشتن در فایلها |
| ۴ | مدیریت خطاها (Error Handling) | استفاده از Try/Catch، لاگگیری خطاها |
| ۵ | مقدمهای بر شیگرایی (OOP) | کلاس، شیء، متد، ویژگیها |
| ۶ | ساختاردهی پروژه (MVC مقدماتی) | جداسازی منطق از ظاهر، فایلهای Config |
| ۷ | امنیت پیشرفته | هش کردن پسورد، محافظت در برابر XSS و CSRF |
| ۸ | کار با API (مقدماتی) | دریافت داده از API خارجی (cURL)، JSON |
| ۹ | پروژه نهایی سطح متوسط | ساخت وبلاگ کامل با قابلیت لاگین و مدیریت |



