بإسم الله الرحمان الرحيم
((مَا نُنَزِّلُ الْمَلاَئِكَةَ إِلاَّ بِالْحَقِّ وَمَا كَانُوا إِذًا مُنْظَرِينَ)) (الحجر/8).
السلام عليكم و رحمة الله و بركاته
موضوع هدا الجزء من الدورة هو : الجلسات
عادة يتم حفظ الجلسات عن طريق دالة session_start في php أو عن طريق القطع المعلوماتية التي يتم حفظها في جهاز المستخدم و المعروفة بالكوكيز
و كلتا الطريقتين لهما عيوب و مميزات مختلفة في ما بينهما
سأحاول في هدا الدرس أن اضع بين أيديكم طريقة مبسطة للدمج بين الجلسات و الكوكيز عن طريق الاعتماد على قاعدة البيانات لحفظ المعلومات الخاصة بالجلسة
لن نقوم بحفظ معلومات في الكوكيز و دلك لزيادة مستوى الأمان في برمجياتنا
لنبدأ العمل على بركة الله
و الأمور البديهية لن أتطرق لشرحها في هدا الدرس
في صفحة تسجيل الدخول login
الاستعلام عن المعلومات التي قام المستخدم بإدخالها و حساب عدد النتائج في قاعدة ابيانات
كود PHP:
$count=mysql_num_rows(mysql_query("SELECT user, pass FROM usr WHERE user='$user' and pass='password'"));
لن يتم تسجيل الجلسة إلا إدا كان عدد نتائج الإستعلام السابق هو 1
كود PHP:
if($count==1){
//تسجيل الجلسة
}
داخل شرط تسجيل الجلسة سنقوم بالعمليات التالية
- تسجيل الجلسة
- إدخال معلومات الجلسة إلى جدول البيانات المؤقتة في قاعدة البيانات
- حفظ معرف الجلسة في الكوكيز
1 تسجيل الجلسة
كود PHP:
session_start();
$_SESSION['usr'] = $user;
2 تسجيل معلومات الجلسة في قاعدة البيانات
هده العملية ستتطلب منا توفير المتغيرات اللازمة لإدخالها إلى الجدول الدي انشئناه في الجزء الأول من الدورة:
id الرقم الترتيبي . سيتم إنشائه تلقائيا حسب التسلسل الزمني للمعلومات المدخلة
type نوع العملية سيكون تابتا في هدا الدرس
كود PHP:
$type = "session";
ip رقم الأيبي سنستخرجه من المصفوفة $_SERVER
كود PHP:
$ip = $_SERVER['REMOTE_ADDR'];
usr اسم المستخدم تم تعريفه مسبقا و هو $user
crc هنا سنقوم بإدخال رمز عشوائي نستخدمه في تخديد مكان المعلومات التي ادخلناها و الرجوع إليها في أي وقت
و سننشئه عن طريق الدالة التالية
كود PHP:
function rand_string($num_chars){
$chars=array("a","A","b","8","B","c","C","9","-","d","D","0","e","1","E","f","F","g","G","h","2","H","i","I","j","J","k","3","K","7","l","_","L","m","M","n","N","o","O","p","P","q","Q","r","R","s","4","S","t","T","u","U","6","v","V","w","W","x","5","X","y","Y","z","Z",);
$string=array_rand($chars,$num_chars);
foreach($string as $s){
@$ret.=$chars[$s];
}
return $ret;
}
المتغير $num_chars للدالة هو عدد الحروف المراد تكوين الرمز منها
لنختر 20 تم تخزين النتيجة في متغير
كود PHP:
$crc = rand_string(20);
time مدة الصلاحية لتكن إفتراضيا ساعة واحدة إنطلاقا من فترة تسجيل الدخول = 3600 ثانية
كود PHP:
$time = time() + 3600;
الإستعلام بكل بساطة :
كود PHP:
mysql_query("INSERT INTO azizsoft_tmp(ip,type,crc,time,usr)VALUES('$ip','$type','$crc','$time','$user')");
مع كل عملية تسجيل دخول سيتم إدخال سجل إلى قاعدة البيانات
3 حفظ معرف الجلسة في الكوكيز
حتى نبقي المستخدم متصلا مع السجل الخاص بجلسته في قاعدة البيانات سنقوم بوضع الرمز العشوائي الدي إحتفظنا به في المتغير $crc في الكوكيز
إسم متغير الكوكيز : sessioncrc
قيمته : $crc و هو الرمز العشوائي الدي أدخلناه إلى قاعدة البيانات
مدة صلاحيته : $time نفس المدة التي أدخلناها إلى قاعدة البيانات
كود PHP:
setcookie('sessioncrc', $crc, $time);
الأن إلى توضيف هده البيانات و الشرط التحققي من وجود الجلسة
الشرط سيكون متشعب قليلا و سأحاول تبسيطه لكم ما أمكن
هيكل الشرط الأول:
و سيكون ثلاتيا ==> الجلسة؟ . الكوكيز؟ . لاشيئ؟
الكود مبسط
كود PHP:
if(التحقق من وجود الجلسة){
//إدا تم العتور على الجلسة يتوقف الشرط هنا
}elseif(التحقق من وجود الكوكيز){
//هنا التحقق من وجود الكوكيز لإستخدامه في جلب معلومات الجلسة في قاعدة البيانات
}else{
//إدا لم يتم تحقق أي من الشرطين السابقين فمعناه عدم وجود أي جلسة
}
الأن سننتقل إلى التفصيل في الكود
إدا إعتبرنا أن متغير الجلسة الدي نبحت عنه هو $_SESSION['usr'] و نريد تخزينه في المتغير $username
فسيكون الجزء الأول من الشرط هكدا
كود PHP:
if(isset($_SESSION['usr'])){
$username = $_SESSION['usr'];
}
إلى الجزء التاني من الشرط و هو الاصعب نظرا لأنه هو الأخر سيحتوي على شرط جديد و إستعلام إلى قاعدة البيانات
ننشئ اولا متغيرا يحمل التوقيت الحالي للتحقق من صلاحية الجلسة الموجودة في قاعدة البيانات
تم الإستعلام
باللغة العربية : تحديد المدخلات الموجودة في جدول azizsoft_tmp دات النوع session و رقم الأيبي هو نفسه للمستخدم و معرف الجلسة هو الموجود في الكوكيز $_COOKIE['sessioncrc'] و التاريخ يجب أن يكون أكبر من التاريخ الحالي الموجود في المتغير $time
بلغة php
كود PHP:
$querysession = @mysql_query("SELECT * FROM azizsoft_tmp WHERE `type`='session' and `ip`='".$_SERVER['REMOTE_ADDR']."' and `crc`='".$_COOKIE['sessioncrc']."' and `time`>'$time'");
حساب عدد السجلات المحصل عليها من الإستعلام
كود PHP:
$countsession=mysql_num_rows($querysession);
إدا كان عدد السجلات هو 1
كود PHP:
if($countsession==1){
//تخزين بيانات السجل في مصفوفة
$resultsession = @mysql_fetch_array($querysession);
//تخزين إسم المستخدم الموجود في قاعدة البيانات في المتغير $username و السيشن $_SESSION['usr']
$_SESSION['usr'] = $resultsession['usr'];
$username = $resultsession['usr'];
}else{
//لا توجد جلسة
}
هدا كله داخل الجزء التاني من الشرط الثلاتي
أي:
كود PHP:
elseif(isset($_COOKIE['sessioncrc'])) {
$querysession = @mysql_query("SELECT * FROM azizsoft_tmp WHERE `type`='session' and `ip`='".$_SERVER['REMOTE_ADDR']."' and `crc`='".$_COOKIE['sessioncrc']."' and `time`>'$time'");
$countsession=mysql_num_rows($querysession);
if($countsession==1){
//تخزين بيانات السجل في مصفوفة
$resultsession = @mysql_fetch_array($querysession);
//تخزين إسم المستخدم الموجود في قاعدة البيانات في المتغير $username و السيشن $_SESSION['usr']
$_SESSION['usr'] = $resultsession['usr'];
$username = $resultsession['usr'];
}else{
//لا توجد جلسة
}
}
الجزء الإخير من الشرط التلاتي معروف
كود PHP:
else{
//لا توجد جلسة
}
الشرط التلاتي كاملا
كود PHP:
if(isset($_SESSION['usr'])){
$username = $_SESSION['usr'];
}
elseif(isset($_COOKIE['sessioncrc'])) {
$time = time();
$querysession = @mysql_query("SELECT * FROM azizsoft_tmp WHERE `type`='session' and `ip`='".$_SERVER['REMOTE_ADDR']."' and `crc`='".$_COOKIE['sessioncrc']."' and `time`>'$time'");
$countsession=mysql_num_rows($querysession);
if($countsession==1){
//تخزين بيانات السجل في مصفوفة
$resultsession = @mysql_fetch_array($querysession);
//تخزين إسم المستخدم الموجود في قاعدة البيانات في المتغير $username و السيشن $_SESSION['usr']
$_SESSION['usr'] = $resultsession['usr'];
$username = $resultsession['usr'];
}else{
//لا توجد جلسة
}
} else{
//لا توجد جلسة
}
لأي إستفسارات حول الدرس لا تتردد بطرحها
الشرح بواسطة عزيز سوفت
حقوق النشر لكل مسلم