بسم
الله الرحمن
الرحيم والصلاة
والسلام على
اشرف الانبياء
والمرسلين اما
بعد ، في هذا
الدرس بمشيئة
الله سنتحدث
عن مقدمة للتحكم
في المواقع عن
طريق الـ Session
أو
الجلسـات كما
اصطلح على تسميتها
، ففي البداية
سنتعرف على الـ
Session وعن
التحكم فيها
، ومن ثم استخداماتها
بالاضافة الى
بعض الامثلة
، وفي النهاية
سنتطرق الى بعض
الأخطاء في
كتابة الـ Session
وحلول
تلك الأخطاء
، وفي الدرس
القادم بإذن
الله تعالى
سنتطرق الى مثال
كامل للوحة تحكم
مبسطة تتعامل
بالـ Session
،
والأمل أن يكون
في هذا الشرح
المبسط فائدة
للجميع ..
-
مقدمة
عن الـ Session
:
عند
الانتقال من
صفحة الى أخرى
في موقع معين
فإن بروتوكول
الـ HTTP
لا
يمكنه معرفة
أن تلك الصفحات
قد تم تصفحها
من قبل نفس الشخص
، ولكن مع الـ
cookies وما
نحن بصدده هنا
الـ Session
تقدم
تلك الطريقة
، ولذلك وببساطة
فإن الـ Session
هي
مكان على جهاز
المتصفح يمكن
من خلاله تخزين
قيمة معينة
للرجوع اليها
في حال قام نفس
الشخص بالانتقال
من صفحة الى
أخرى ، ولعل هذا
التعريف يصف
ببساطة معناها
العام ولا يعني
ذلك أنه تعريف
شامل لكل المعاني
..
إذاً
التعرف على
الشخص الذي يقوم
بتصفح الموقع
هو الهدف الرئيسي
للـ Session
أو
الجلسـات ، ولكن
كيف يتم ذلك ،
وما هي النقاط
الرئيسية التي
يجب معرفتها
لفهم طريقة
التعامل مع الـ
Session ؟
أول
تلك النقاط أن
عملية تسجيل
المتغير على
جهاز المستخدم
له مدة معينة
تنتهي بانتهاء
الجلسة ، ومن
هنا جاءت التسمية
، أما ما تعنيه
الجلسة فهي
مصطلح لقيامك
بالتصفح من
الموقع ومن ثم
اغلاق الموقع
، ببساطة كل مرة
تقوم بزيارة
الموقع تبدأ
جلسة أو Session
جديدة
، مع ملاحظة أن
هناك طرق للتحكم
بوقت الانتهاء
كما في الـ cookies
،
بالاضافة الى
طرق اخرى عن
طريق قواعد
البيانات وهو
حديث سابق لاوانه
.
بالنسبة
للنقطة الأخرى
التي يجب وضعها
في الحسبان هي
ما يسمى بالـ
Session ID أو
اختصـاراً SID
ويعني
ذلك (
رقم
الجلسة )
، وهو
رقم عشوائي فريد
يصعب تكراره
أو فلنقل أنه
مستحيل لاحتوائه
على ارقام واحرف
كبيرة وصغيرة
في متغير طويل
نسبياً ، وهذه
القيمة هي الأهم
في ما ذكرت ،
لإنها القيمة
الوحيدة التي
تربط ما يسمى
بالـ Session
Variables أو
( متغيرات
الجلسة )
مع
جهاز المستخدم
، فالـ SID
هي
القيمة الوحيدة
التي يتم تخزينها
في جهاز المستخدم
( Client ) ،
أما الـ متغيرات
الجلسة Session
Variables يتم
تخزينها في
السيرفر (
Server ) ،
فعند التحقق
منه وجود هذه
القيمة على جهاز
المستخدم يمكن
الدخول الى
المتغير الآخر
المتربط به
والمسمى بالـ
Session Variable .
النقطة
الثالثة هي
طريقة التخزين
للـ SID
و الـ
Session Variables ،
أما الـ SID
وكما
قلنا أنها تخزن
على جهاز العميل
( Client ) إما
عن طريق الـ
cookies والتي
لها سلبياتها
المتعددة أو
عن طريق تمريرها
عبر الـ HTTP
، أما
بالنسبة للـ
Session Variables فيتم
تخزينها في
ملفات فارغة
على جهاز الـ
Server وكذلك
في مستويات
متقدمة يمكن
التحكم بها
وتخزينها في
قواعد بيانات
.
-
إعدادت
الـ Session
:
عن
طريق ملف الـ
php.ini والذي
يحتوي على إعدادت
الـ PHP
يمكن
التحكم باعدادات
الـ Session
،
وكاستعراض لتلك
النقاط المتحكمة
بالـ Session
سنتطرق
أهم النقاط
ومعانيها ،
وللوصول الى
ما نحن بصدده
تذكر أن ملف الـ
php.ini يوجد
في دليل الـ
Windows ،
وللوصول الى
خصائص الـ Session
إبحث
عنه كلمة (
Session ) وستجد
السطر التالي
:
[Session]
من
هنا تستطيع
التحكم بخيارات
الـ Sessions
،
وكما يظهر في
الجدول التالي
وصف لأهم الخيارات
..
1-
الخيار
Session.auto_start
:
بداية
تلقائية للـ
Session ( دون
الحاجة لعمل
ذلك يدوياً عن
طريق Session_start
) .
2- الخيـار
Session.cache_expire
:
وقت
انتهاء الجلسة
بالدقائق .
3- الخيـار
Session.cookie_lifetime
:
وقت
انتهاء الـ
cookie المرتبطة
بالجلسة ، وهي
افتراضياً ستكون
0 أي
أن الـ cookie
ستنتهي
فترتها مع اقفـال
الشخص المتصفح
للموقع .
4- الخيـار
Session_name
:
إسم
الـ Session
التي
ستستخدم كـ
cookie وافتراضياً
ستكون PHPSESSID
.
5- الخيـار
session.save_path
:
هذا
السطر يعني مكان
تخزين ملفات
الـ Session
في
جهازك باعتباره
سيرفر ، وهنا
تستطيع
أن تضع أي عنوان
في جهازك ، أما
تركه فارغاً
فيعني عدم تفعيل
الـ Session
لديك
، بالنسبة لي
أقترح أن يكون
المجلد Temp
داخل
الـ Windows
هو
الدليل الأمثل
لاحتوائه
على ملفات مؤقتة
يمكن حذفها ،
اذا العنوان
سيكون c:\windows\Temp
هذه
في نظري أهم
الخيـارات التي
يجب فهمها ،
-
بداية
الـ Session
:
قبل
أن تستخدم أياً
من دوال الـ
Session يجب
اخبار السكربت
أن يبدأ جلسة
Session ،
والطريقة هي
أن تضع في بداية
السكربت وفي
أول سطر فيه بعد
علامة الفتح
ما يلي :
<?
session_start();
?>
في
هذه الحالة فقط
يمكن أن تقوم
باستخدام دوال
الـ Session
الأخرى
، أما اذا لم
يتم كتابة هذا
السطر فلن يتم
ذلك .
ملاحظة
مهمة حول عملية
بداية الـ Session
وهي
أن تتأكد من أن
هذا السطر لا
يسبقه عملية
اخراج مخرجات
، بمعنى أخرى
أي استخدام
لدوال مثل echo
أو
print ،
وكذلك لا يسبق
هذا السطر أي
فراغ وتأكد من
هذه النقطة
جيداً لانها
كثيرة الحدوث
وتعطى الخطاً
التالي :
وأسلم
طريقة من وجهة
نظري أن تضع هذا
السطر في بداية
ملف الـ header
لانك
سنقوم بادراج
هذه الصفحة في
كل الصفحات
الأخرى وبالتالي
يكون السطر هو
الأول في كل
الحالات ..
-
تخزين
متغيرات الجلسات
:
وهي
ما نسميها بالـ
Session Variables ،
ولعمل ذلك يوجد
لدينا الدالة
الواردة في
المثال التالي
:
<?
$user = "AbdulAziz";
session_register("user");
?>
ما
قمنا بعمله هو
التالي :
1- عرفنا
متغيراً هو user
يحتوي
على قيمة حرفية
.
2- قمنا
بتسجيل هذا
المتغير في
متغير جلسة (
Session Variable ) وبنفس
الاسم user
ولكن
بدون علامة $
.
-
التعامل
مع متغيرات
الجلسة :
بعد
تسجيل المتغير
، يمكن الرجوع
اليه بعدة طرق
تعتمد على الخيار
register_globals
في
ملف الـ php.ini
، أما
اذا كان on
وهذا
هو الاختيار
الإفتراضي فإن
المتغير الذي
تم تسجيله في
الـ Session
يمكن
الرجوع اليه
كأي متغير آخر
، عن طريق اسم
المتغير فقط
، وفي مثالنا
الحالي سيكون
$user ،
أما اذا كان
الخيار غير مفعل
وليس بالصورة
التي ذكرتها
فيمكن الرجوع
الى المتغير
عن طريق الأمر
$HTTP_SESSION_VARs["user"]
.
أيضا
كنقطة مهمة يجب
معرفتها وهي
طريقة التحقق
من أن متغيراً
معيناً قد تم
تسجيله أم لا
، وهذه الطريقة
مفيدة في الصفحات
التي يجب أن
يكون فيها المستخدم
قد سجل الدخول
وبالفعل تمت
عملية تسجيل
الـ Session
له
، في المثال
التالي تلك
الطريقة :
<?
if (session_is_registered("user")) {
echo "أهلا
وسهلا بكم في
قرية بي اتش
بي";
}
else {
echo "لا
يسمح لك بالدخول
..";
}
?>
في
هذا المثال سيتم
عرض الجملة
(أهلا
وسهلا بكم في
قرية بي اتش بي
) إذا
كان عملية تسجيل
الـ Session
تمت
للمتغير user
،
وسيتم عرض الجملة
(لا
يسمح لك بالدخول
.. ) في
حالة عدم تسجيل
الـ Session
.
نقطة
أخيرة في التعامل
مع متغيرات
الجلسة ، وهي
عملية الغاء
تسجيل الـ Session
لمتغير
معين ، وهذه
الطريقة تتم
عن طريق الدوال
session_unregister
و
session_unset و
session_destroy
، أما
الفرق بينهم
فهو أن الدالة
الأولى تقوم
بعملية الغاء
التسجيل لـ
Session معينة
، أي بتمرير إسم
المتغير لها
كما في المثال
التالي :
<?
session_unregister("user");
?>
اذا
سيتم الغاء
تسجيل الـ Session
المتعلقة
بالمتغير user
فقط
، أما الدالة
الثانية فستقوم
بالغاء تسجيل
جميع الـ Session
التي
تم تسجيلها من
قبل ، وفي النهاية
يجب أستخدام
الدالة الثالثة
session_destroy
لالغاء
الـ SID
والانتهاء
من التعامل مع
الـ Session
.
-
مثال
بسيط عن الـ
Session :
ساتطرق
الى مثال بسيط
جداً لتوضيح
كيفية عمل الـ
Session ،
في البداية قم
بوضع الكود
التالي في ملف
وقم بتسميته
phpex1.php :
<?
$age = 12;
session_register("age");
echo "$age تحتوي على القيمة age الـجلسة <br>";
echo "<a
href=phpex2.php>التــالي
..</a>";
?>
الصفحة
الثانية احفظها
بإسم phpex2.php
، وضع
الكود التالي
فيها :
<?
echo "أنت
في الصفحة
الثانية<br>";
echo "$age تحتوي على القيمة age الـجلسة <br>";
session_unregister("age");
echo "<a
href=phpex3.php>التــالي
..</a>";
?>
الصفحة
الثالثة تحتوي
على الكود التالي
، واسمها phpex3.php
:
<?
echo "أنت
في الصفحة
الثالثة<br>";
echo "$age تحتوي على القيمة age الـجلسة <br>";
?>
ابدأ
من الصفحة الأولى
ومن ثم انتقل
من صفحة الى
أخرى ، حتى تصل
الى الثالثة
، بافتراض أنك
قمت بتجربة
المثال ، ستلاحظ
أن الصفحة الأولى
سيتم طباعة الـ
Session التي
تم تسجيلها وهي
age وستظهر
القيمة 12
في
الجملة الطويلة
التي تبين أن
المتغير age
يحتوي
على قيمة معينة
، وفي الصفحة
الثانية ستلاحظ
نفس الجملة ونفس
القيمة تمت
طباعتهما ، أما
في الصفحة الثالثة
والأخيرة فتمت
طباعة الجملة
، لكن الاختلاف
أن القيمة 12
في
متغير الـ Session
age لم
تتم طباعتها
، لماذا ؟
لسبب
بسيط وهو أننا
في الصفحة السابقة
قمنا بالغاء
تسجيل الـ Session
للمتغير
age وبالتالي
فإن الصفحة
الثالثة لم
تتعرف على متغير
مباشر له الاسم
age ولا
على متغير الـ
Session age ،
وبالتالي تم
طباعة الجملة
بدون القيمة
.