بسم الله الرحمن الرحيم والصلاة والسلام على اشرف الانبياء والمرسلين اما بعد ، في هذا الدرس بمشيئة الله سنتحدث عن مقدمة للتحكم في المواقع عن طريق الـ Session أو الجلسـات كما اصطلح على تسميتها ، ففي البداية سنتعرف على الـ Session وعن التحكم فيها ، ومن ثم استخداماتها بالاضافة الى بعض الامثلة ، وفي النهاية سنتطرق الى بعض الأخطاء في كتابة الـ Session وحلول تلك الأخطاء ، وفي الدرس القادم بإذن الله تعالى سنتطرق الى مثال كامل للوحة تحكم مبسطة تتعامل بالـ Session ، والأمل أن يكون في هذا الشرح المبسط فائدة للجميع ..
- مقدمة عن الـ Session :
عند الانتقال من صفحة الى أخرى في موقع معين فإن بروتوكول الـ HTTP لا يمكنه معرفة أن تلك الصفحات قد تم تصفحها من قبل نفس الشخص ، ولكن مع الـ ******s وما نحن بصدده هنا الـ Session تقدم تلك الطريقة ، ولذلك وببساطة فإن الـ Session هي مكان على جهاز المتصفح يمكن من خلاله تخزين قيمة معينة للرجوع اليها في حال قام نفس الشخص بالانتقال من صفحة الى أخرى ، ولعل هذا التعريف يصف ببساطة معناها العام ولا يعني ذلك أنه تعريف شامل لكل المعاني ..
إذاً التعرف على الشخص الذي يقوم بتصفح الموقع هو الهدف الرئيسي للـ Session أو الجلسـات ، ولكن كيف يتم ذلك ، وما هي النقاط الرئيسية التي يجب معرفتها لفهم طريقة التعامل مع الـ Session ؟
أول تلك النقاط أن عملية تسجيل المتغير على جهاز المستخدم له مدة معينة تنتهي بانتهاء الجلسة ، ومن هنا جاءت التسمية ، أما ما تعنيه الجلسة فهي مصطلح لقيامك بالتصفح من الموقع ومن ثم اغلاق الموقع ، ببساطة كل مرة تقوم بزيارة الموقع تبدأ جلسة أو Session جديدة ، مع ملاحظة أن هناك طرق للتحكم بوقت الانتهاء كما في الـ ******s ، بالاضافة الى طرق اخرى عن طريق قواعد البيانات وهو حديث سابق لاوانه .
بالنسبة للنقطة الأخرى التي يجب وضعها في الحسبان هي ما يسمى بالـ Session ID أو اختصـاراً SID ويعني ذلك ( رقم الجلسة ) ، وهو رقم عشوائي فريد يصعب تكراره أو فلنقل أنه مستحيل لاحتوائه على ارقام واحرف كبيرة وصغيرة في متغير طويل نسبياً ، وهذه القيمة هي الأهم في ما ذكرت ، لإنها القيمة الوحيدة التي تربط ما يسمى بالـ Session Variables أو ( متغيرات الجلسة ) مع جهاز المستخدم ، فالـ SID هي القيمة الوحيدة التي يتم تخزينها في جهاز المستخدم ( Client ) ، أما الـ متغيرات الجلسة Session Variables يتم تخزينها في السيرفر ( Server ) ، فعند التحقق منه وجود هذه القيمة على جهاز المستخدم يمكن الدخول الى المتغير الآخر المتربط به والمسمى بالـ Session Variable .
النقطة الثالثة هي طريقة التخزين للـ SID و الـ Session Variables ، أما الـ SID وكما قلنا أنها تخزن على جهاز العميل ( Client ) إما عن طريق الـ ******s والتي لها سلبياتها المتعددة أو عن طريق تمريرها عبر الـ 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.******_lifetime :
وقت انتهاء الـ ****** المرتبطة بالجلسة ، وهي افتراضياً ستكون 0 أي أن الـ ****** ستنتهي فترتها مع اقفـال الشخص المتصفح للموقع .
4- الخيـار Session_name :
إسم الـ Session التي ستستخدم كـ ****** وافتراضياً ستكون 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 ، وبالتالي تم طباعة الجملة بدون القيمة .
منقوووول للافادة
hg]vs hgehlk uav(lr]lm uk hgJ Session)