php SESSIONS : الجلسات

رأينا بأن الخادوم لا يستقر له وضع ، و لا يجعل أي رابط بين طلبين و لو قدّمهما نفس الزبون . لحل هذه المشكلة قمنا بتخزين بياناتنا في متغيرات محدّدة و شاملة ، فاستعملنا GET_$ و POST_$ لنقلها من صفحة إلى أخرى . و بما أن المتغيران متخصصين في إرسال الطلبات . لجأنا إلى الكوكيز COOKIE_$ لحفظ هذه البيانات لمدّة أطول .
كل هذه الطرق تختلف في وضعيات و حدود استعمالها و مستوى حماية بياناتها ، مثلا لا يجب أن نرسل معلومات حساسة ككلمة السر باستعمال الكوكيز أو عبر عنوان الويب كما أن كمية البيانات التي نرسلها جد محدودة ... إلخ
و لهذا ، بما أن مستوى الحماية شيء جد أساسي . أصبح استعمال الجلسات لا غنى عنه في أي موقع تفاعلي .

تعريف الجلسة : session

الجلسة هي طريقة لحفظ بيانات تخص عضوا ما ، طيلة مدّة تواجده على موقعكم ، بخلاف بيانات الكوكيز التي تظل تتنقل بين المتصفح و الخادوم جيئة و ذهابا و أمام أعين المتلصّصين . بيانات الجلسة تُخزّن على الخادوم ، و يكون من المستحيل الولوج إليها عبر javascript . كما أن كميتها غير محدّدة ، يمكن إرسال قدر ما تشاؤؤن من المعلومات .

مراحل حياة الجلسة

عمر الجلسة يمر بثلاث مراحل :
  • فتح الجلسة : session_start()
  • إنشاء متغيرات الجلسة : $_SESSION[ ]
  • تدمير الجلسة : session_destroy()

فتح الجلسة

عندما يأتي زائر إلى موقعكم تأمرون بفتح جلسة له ، و يقوم php بإعطائه مفتاحا بمثابة هوية له ، هذا المفتاح يسمى PHPSESSID ، و يتكون غالبا من نص لا يتجاوز 32 حركة مثال : "c19gh4r15vx456ug9871jm8s0zke93b7" ، و يتم تداوله من صفحة إلى أخرى إما عبر عنوان الويب و غالبا عن طريق الكوكيز . (المفتاح فقط هو الذي يتم تمريره و ليس البيانات).
لفتح الجلسة نستخدم الدالة الجاهزة session_start() و يجب كتابتها في بداية جميع صفحات php قبل كتابة أي شيفرة html ، أو القيام بأي عرض عن طريق echo او print . بالضبط كما رأينا أثناء إنشاء الكوكيز .

تعيين متغيرات الجلسة

بعد فتح الجلسة يمكنكم إنشاء العدد الذي تريدونه من متغيرات الجلسة .
لإنشاء متغيرات الجلسة ، نستعمل المتغير $_SESSION[ ] مثال :
<?php
// فتح الجلسة
session_start();
// تعيين متغيرات الجلسة
$_SESSION['pseudo'] = 'sameh';
$_SESSION['name'] = 'hani';
$_SESSION['age'] = '16';
بخلاف session_start() ، التي يجب كتابتها قبل عرض أي شيء على المتصفح . يمكننا إنشاء متغيرات الجلسة حيث ما نريد في صفحتنا :
<?php
session_start();
// تعيين بعض متغيرات الجلسة
$_SESSION['pseudo'] = 'sameh';
$_SESSION['name'] = 'hani';
?>

<!DOCTYPE html>
<html dir="rtl">
<head></head>
<body>
...
<?php
// تعيين متغيرات أخرى للجلسة
$_SESSION['age'] = '25';
?>

...
</body>
</html>

تدمير الجلسة

عند مغادرة الزائر لموقعكم ، يتم تدمير الجلسة و حذف جميع بياناتها من الخادوم . و غالبا ما لا نعرف بالضبط متى غادر ، لذا يتم تدميرها بعد مضي وقت يسمى timeout . و تختلف هذه المدّة من خادوم إلى آخر .
للتأكد من تدمير الجلسة فور مغادرة العضو ، يمكننا إضافة صفحة لتسجيل الخروج .
لتدمير الجلسة نستعمل الدالة session_destroy()
سنرى هذه المراحل بتفصيل في المثال التالي ، ثقوا بي ، فهي أسهل مما تبدو لكم

تطبيق

سنقوم بإنشاء ثلاث صفحات :
  • index.php : صفحة الإستقبال ، و تتضمن أيضا استمارة تسجيل الدّخول .
  • login.php : صفحة معالجة بيانات الإستمارة ، و إنشاء متغيرات الجلسة
  • logout.php : صفحة تسجيل الخروج و تدمير الجلسة .
حولوا قبل رؤية الحل :

index.php

<?php
// فتح الجلسة
session_start();
?>

<!DOCTYPE html>
<html dir="rtl">
<head>
<meta charset="utf-8">
<style>
label{display:inline-block;width:100px;}
</style>
</head>
<body>
<h1> صفحة الإستقبال </h1>
<?php
// إذا نجح العضو في تسجيل دخوله ، نستقبله بكلمة ترحاب
if (isset($_SESSION['pseudo']) AND isset($_SESSION['pays']))
{
echo '<p>مرحبا بك : <strong>'.$_SESSION['pseudo'].'</strong> بلدك هو :<strong>'.$_SESSION['pays'].'</strong><p>';
echo '<p>أنت الآن في صفحة الإستقبال <p>';

// ثم نضيف روابط إلى صفحات من موقعنا
echo '<p> <a href="#"> صفحة 6 </a> <br>
<a href="#"> صفحة 9 </a> <br>
</p>'
;

// و نضع له رابطا إذا أراد تدمير الجلسة
echo '<p> <a href="logout.php"> تسجيل الخروج </a> </p>';
}
else // أو ندعوه لملأ استمارة الدّخول
{
?>

<p> المرجو ملأ الإستمارة التالية ، للتعريف عن نفسك </p>

<form action="login.php" method="post">
<label for="pseudo"> اسم المستخدم </label><input type="text" name="pseudo" id="pseudo"><br>
<label for="pays"> البلد </label><input type="text" name="pays" id="pays">
<p><input type="submit" value = "إرسال"></p>
</form>
<?php
}
?>

</body>
</html>

login.php

<?php
// فتح الجلسة
session_start();

// إذا نجح العضو في ملأ الإستمارة
if (!empty($_POST['pseudo']) AND !empty($_POST['pays']))
{
// نقوم بإنشاء متغيرات الجلسة
$_SESSION['pseudo'] = $_POST['pseudo'];
$_SESSION['pays'] = $_POST['pays'];

// ثم تحويله تلقائيا إلى صفحة الإستقبال
header('location:index.php');
}
else
{
/*
إذا لم يقم بملأ الإستمارة بشكل صحيح
أو قد يكون أصلا نجح في فتح الجلسة
نقوم أيضا بتحويله لصفحة الإستقبال
*/

header('location:index.php');
}
?>

logout.php

<?php
// فتح الجلسة
session_start();

if (isset($_SESSION['pseudo']))
{
// نقوم بتدمير الجلسة
session_destroy();

// ثم تحويله تلقائيا إلى صفحة الإستقبال
header('location:index.php');
exit();
}
else
{
//إذا كانت الجلسة أصلا مدمّرة أيضا نقوم تحويله تلقائيا إلى صفحة الإستقبال
header('location:index.php');
}
هذا مثال بسيط . عادة في استمارة تسجيل الدخول ، يجب إدخال كلمة المرور . لكن تفاديت هذا الحقل ، نظرا لأهميته و مكانته سنوليه عناية خاصة في فصل قاعدة البيانات .