الدرس الثاني عشر: الجلسات (Sessions)
عندما تزور موقعاً فأنت تفعل أشياء مختلفة، تنتقل من صفحة لأخرى وربما تضع معلومات في نموذج أو تشتري منتجاً.
كمطور مواقع مثل هذه المعلومات لها أهمية كبيرة لتوفير حلول ناجحة للويب.
افترض مثلاً أنك تطور موقعاً يحوي بضع صفحات محمية باسم وكلمة سر، لكي تكون الحماية فعالة يجب أن تتمكن الصفحات المحمية بكلمة السر من الوصول إلى معلومات حول إمكانية دخول المستخدم في وقت سابق، بمعنى آخر يجب على الصفحة أن تتذكر ما فعله المستخدم سابقاً.
هذا بالضبط ما يدور حوله هذا الدرس، كيف يمكنك استخدام الجلسات في PHP لحفظ واسترجاع المعلومات أثناء زيارة المستخدم لموقعك.
الجلسات
أمر session في PHP يسمح لك بإدارة المعلومات حول جلسة المستخدم، يمكنك كتابة تطبيقات ذكية يمكنها معرفة المستخدم وجمع معلومات حوله.
الجلسة يمكن أن تبدأ بطرق مختلفة، لن نشرح التفاصيل التقنية هنا لكن سنركز على حالة حيث الجلسة تبدأ بحفظ قيمة، الجلسة تبدأ وتنتهي إذا لم يطلب المستخدم أي صفحة خلال وقت محدد، (20 دقيقة هو المعيار)، بالطبع يمكنك أن تنهي الجلسة في برنامجك.
لنفترض أن 50 شخصاً يتصفحون نفس الموقع - متجر مثلاً - في نفس الوقت، أفضل وسيلة لحفظ معلومات ما قد تحويه سلة المشتريات لكل واحد منهم هي الجلسات، لكي نحدد كل زائر المزود يستخدم رقم تعريف محدد يحفظ في كوكيز (cookie)، الكوكيز هو ملف نصي صغير يحفظ في حاسوب المستخدم، (للمزيد حول الكوكيز اقرأ الدرس الثالث عشر)، لذلك الجلسات تتطلب دعم الكوكيز في متصفح الزائر.
مثال لاستخدام الجلسات
عندما تطلب هذه الصفحة ستحفظ الوقت الحالي في جلسة، فعلت ذلك لكي أوضح لك بالمثال كيف تعمل الجلسات.
سميت المتغير "StartTime" وحفظته بإضافة هذه الأسطر لبرنامج PHP:
<?php session_start(); $_SESSION["StartTime"] = date("r"); ?>
هكذا بدأنا جلسة، كما هو مذكور أعلاه كل جلسة لها رقم تعريف خاص بها في المزود.
الجلسة الخاصة بك رقم تعريفها: d3tvfofic9muh9uakmejbbfcg3
في أي وقت، يمكنني أن أطلب "StartTime" من الجلسة بكتابة التالي:
<?php session_start(); echo $_SESSION["StartTime"]; ?>
والذي سيظهر لنا أن هذه الصفحة طلبت في هذا الوقت Wed, 27 Sep 2023 00:45:25 +0000 (بحسب ساعة المزود).
لكن ما هو مثير أن المعلومة ستبقى في الجلسة حتى لو تركت الصفحة، المعلومة ستلاحقك حتى تنتهي الجلسة.
تلقائياً الجلسة تدوم حتى يغلق الزائر المتصفح وهكذا تنتهي الجلسة تلقائياً، لكن إن أردت أن تنهي الجلسة يمكنك أن تفعل ذلك بهذه الطريقة:
<?php session_destroy(); ?>
لننظر في مثال آخر حيث الجلسات تستخدم: كلمات السر.
نظام دخول مع الجلسات
في المثال التالي سنطور مثالاً بسيطاً لنظام دخول، سنستخدم كثيراً مما تعلمناه في الدروس السابقة.
أول ما نحتاجه هو نموذج يدخل فيه الناس الاسم وكلمة السر، سيكون بهذا الشكل:
<html> <head> <title>Login</title> </head> <body> <form method="post" action="login.php"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="text" name="password" /></p> <p><input type="submit" value="Let me in" /></p> </form> </body> </html>
بعد ذلك ننشأ ملف login.php.
في هذا الملف سنتأكد ما إذا أدخل المستخدم اسماً وكلمة سر صحيحين، في هذه الحالة نبدأ جلسة تقول بأن المستخدم سجل دخوله باسم وكلمة سر صحيحين.
<html> <head> <title>Login</title> </head> <body> <?php // Check if username and password are correct if ($_POST["username"] == "php" && $_POST["password"] == "php") { // If correct, we set the session to YES session_start(); $_SESSION["Login"] = "YES"; echo "<h1>You are now logged correctly in</h1>"; echo "<p><a href='document.php'>Link to protected file</a><p/>"; } else { // If not correct, we set the session to NO session_start(); $_SESSION["Login"] = "NO"; echo "<h1>You are NOT logged correctly in </h1>"; echo "<p><a href='document.php'>Link to protected file</a></p>"; } ?> </body> </html>
في الملفات المحمية نريد أن نتأكد أن المستخدم سجل دخوله بشكل صحيح، في حال لم ينجز ذلك المستخدم سيعود إلى نموذج الدخول، هكذا تحمي الصفحات:
<?php // Start up your PHP Session session_start(); // If the user is not logged in send him/her to the login form if ($_SESSION["Login"] != "YES") { header("Location: form.php"); } ?> <html> <head> <title>Login</title> </head> <body> <h1>This document is protected</h1> <p>You can only see it if you are logged in.</p> </body> </html>
الآن نحن نعرف أمر الجلسات، في الدرس التالي سنعمل في نفس المساحة لكن سنلقي نظرة مقربة أكثر على الكوكيز.