مصدر الموضوع الاصلي: هاك إنشاء نظام عضوية
إنشاء نظام عضوية (1)
مدخل
تتمثل إحدى أفضل الميزات الفريدة والمفيدة معاً في PHP وMySQL في القدرة على إنشاء نظام تسجيل دخول يستند إلى المستخدم من أجل موقعك. ومع هذه الميزة يكون بوسع موقعك أن ينمو ويتضخم إلى درجة لا نتوقعها، إذ قد يغدو موقعك ملتقى جماعياً وفقاً للغاية، مما يجعله يستقطب المستخدمين الذين سيعودون مراراً وتكراراً إليه بحثاً عن المزيد من الحيوية.
سوف نشرح في هذه الدراسة النقاط التالية:
1-جمع معلومات حول المستخدم أثناء انتسابه لموقعك وتخزين تلك المعلومات في MySQL.
2-توليد كلمة مرور عشوائية وتشفيرها في قاعدة البيانات.
3-التحقق من عنوان البريد الإلكتروني للمستخدم قبل أن يتمكن من تسجيل دخوله.
4-إنشاء نظام تسجيل دخول للمستخدم، وذلك للتحقق من صحة معلوماته مقارنة مع المعلومات المخزنة في قاعدة البيانات.
5-إنشاء أداة استرداد كلمة المرور الضائعة.
6-معالجة أساسية للنموذج باستخدام PHP.
7-بعض أساسيات جلسة عمل PHP.
8-استخدام التابعMail لإرسال بريد إلكتروني للمستخدم.
9-وغير ذلك الكثير.
دعنا نتذكر دائماً أنَّ هذه الشيفرة بأكملها تمثل شبه شيفرة أي أنها قد تعمل وقد لا تعمل على نظامك دون أية تعديلات. وإذا قرأت هذه الدراسة بعناية، فنحن أكيدون من أنك ستحصل على مبتغاك بأقل جهد ممكن. ونشير أخيراً إلى أنَّ هذه الدراسة تستند على PHP4.1 وما يليها، وبحيث يكون الخيار register_globals معطَّلاً (off).
لننطلق إذاً ونبدأ بإنشاء قاعدة البيانات.
إنشاء بنية قاعدة البيانات:
لنبدأ بإنشاء بنية قاعدة بيانات قياسية حتى نستخدمها في دراستنا. يمكنك أن تستخدم phpMyAdmin أو شيئاً قد اعتدت عليه لإنشاء قاعدة بياناتك. ولقد استخدمنا phpMyAdmin نظراً لأنها أسهل استعمالاً، ولأنه ليس علينا تخزين أية تطبيقات أو استخدام أي شيء يتعلق بسطر الأوامر على حاسبك. قم ببساطة بإنشاء قاعدة بياناتك الخاصة بك وأطلق عليها الاسم الذي تريد. وفي داخل قاعدة البيانات تلك، شغِّل عبارة SQL التالية:
CREATE TABLE users (
userid int(25) NOT NULL auto_increment,
first_name varchar(25) NOT NULL default '',
last_name varchar(25) NOT NULL default '',
email_address varchar(25) NOT NULL default '',
username varchar(25) NOT NULL default '',
password varchar(255) NOT NULL default '',
info text NOT NULL,
user_level enum('0','1','2','3') NOT NULL default '0',
signup_date datetime NOT NULL default '0000-00-00 00:00:00',
last_login datetime NOT NULL default '0000-00-00 00:00:00',
activated enum('0','1') NOT NULL default '0',
PRIMARY KEY (userid)
) TYPE=MyISAM COMMENT='Membership Information';
قبل المضي قدماً في دراستنا، يجب أن نشير إلى شيء. قد لا تتفق مع الأنواع التي اخترناها لأعمدة جداولنا في هذا المثال، ولكنَّها ليست قاعدة بياناتك ولا داعي للشكوى، إذ ليس هناك ما يعيب أنواع الأعمدة هذه مما يمنعها من العمل كما نشاء لها.
بعد أن قمت بإنشاء قاعدة بياناتك وأصبحت مستعداً للمضي قدماً، دعنا نبدأ بجمع المعلومات حول المستخدم.
انتساب المستخدم- جمع البيانات:
بعد أن قمنا بإنشاء قاعدة بيانات وأصبحنا مستعدين للانتقال نحو جمع المعلومات الخاصة بالمستخدم لوضعها في قاعدة البيانات. يجب أن نقوم أولاً بإنشاء نموذج جمع معلومات. ويمكنك القيام بذلك بسهولة باستخدام محرر html المفضل لديك، وقد استخدمنا لذلك Dreamweaver MX. ونبين فيما يلي الشكل الذي سيبدو عليه نموذج الإدخال الخاص بنا.
First Name
" name=last_name>
Email Address
" name=username>
Information about you:
echo $info; ?>
سوف نحصل من هذا النموذج على ما يكفينا من معلومات عن المستخدم، ويمكنك إضافة ما تشاء من حقول بدورك.
سوف يرسل هذا النموذج الدخل إلى برنامج نصي يدعى register.php، كما وسيقوم بأشياء أخرى أساسية. إذ إننا سنضع بعض العمليات الأساسية للتحقق من الأخطاء باستخدام PHP. لم نضع أي توابع تحقق من الأخطاء خاصة مع هذا النموذج، وذلك لأنَّ لكل أسلوبه الخاص في تحقيق ذلك. ومن جهتنا فسنقوم بشكل أساسي بالتحقق من أنَّ المستخدم قد قام بملء الحقول المطلوبة في هذا النموذج. وعندما لا يقوم المستخدم بذلك، سنضع رسالة خطأ على الصفحة التي سيرسل إليها هذا النموذج.
ملاحظة: نفضل أن نضع HTML في الموضع المناسب لها. لذلك ننصح بأن تحاول قدر الإمكان حفظ ملفات HTML في دليل خاص على موقع الويب وتضمينها عند الحاجة إليها. لذلك فقد قمنا بحفظ هذا النموذج في ملف HTML على الملقم الخاص بنا وسوف نضمنه في الملف register.php الذي يتم فيه التحقق من الأخطاء.
دعنا نلقي نظرة على البرنامج النصي الذي سيرسل إليه هذا النموذج.
انتساب المستخدم-التحقق من الأخطاء وإنشاء العضوية:
سوف يرسل النموذج الذي شاهدناه فيما سبق إلى برنامج نصي يدعى register.php، وهو الذي نقدمه فيما يلي:
include 'db.php'; // Define post fields into simple variables $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $email_address = $_POST['email_address']; $username = $_POST['username']; $info = $_POST['info']; /* Let's strip some slashes in case the user entered any escaped characters. */ $first_name = stripslashes($first_name); $last_name = stripslashes($last_name); $email_address = stripslashes($email_address); $username = stripslashes($username); $info = stripslashes($info); /* Do some error checking on the form posted fields */ if((!$first_name) || (!$last_name) || (!$email_address) || (!$username)){ echo 'You did not submit the following required information!
'; if(!$first_name){ echo "First Name is a required field. Please enter it below.
"; } if(!$last_name){ echo "Last Name is a required field. Please enter it below.
"; } if(!$email_address){ echo "Email Address is a required field. Please enter it below.
"; } if(!$username){ echo "Desired Username is a required field. Please enter it below.
"; } include 'join_form.html'; // Show the form again! /* End the error checking and if everything is ok, we'll move on to creating the user account */ exit(); // if the error checking has failed, we'll exit the script! } /* Let's do some checking and ensure that the user's email address or username does not exist in the database */ $sql_email_check = mysql_query("SELECT email_address FROM users WHERE email_address='$email_address'"); $sql_username_check = mysql_query("SELECT username FROM users WHERE username='$username'"); $email_check = mysql_num_rows($sql_email_check); $username_check = mysql_num_rows($sql_username_check); if(($email_check > 0) || ($username_check > 0)){ echo "Please fix the following errors:
"; if($email_check > 0){ echo "Your email address has already been used by another member in our database. Please submit a different Email address!
"; unset($email_address); } if($username_check > 0){ echo "The username you have selected has already been used by another member in our database. Please choose a different Username!
"; unset($username); } include 'join_form.html'; // Show the form again! exit(); // exit the script so that we do not create this account! } /* Everything has passed both error checks that we have done. It's time to create the account! */ /* Random Password generator. [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] We'll generate a random password for the user and encrypt it, email it and then enter it into the db. */ function makeRandomPassword() { $salt = "abchefghjkmnpqrstuvwxyz0123456789"; srand((double)microtime()*1000000); $i = 0; while ($i <= 7) { $num = rand() % 33; $tmp = substr($salt, $num, 1); $pass = $pass . $tmp; $i++; } return $pass; } $random_password = makeRandomPassword(); $db_password = md5($random_password); // Enter info into the Database. $info2 = htmlspecialchars($info); $sql = mysql_query("INSERT INTO users (first_name, last_name, email_address, username, password, info, signup_date) VALUES('$first_name', '$last_name', '$email_address', '$username', '$db_password', '$info2', now())") or die (mysql_error()); if(!$sql){ echo 'There has been an error creating your account. Please contact the webmaster.'; } else { $userid = mysql_insert_id(); // Let's mail the user! $subject = "Your Membership at MyWebsite!"; $message = "Dear $first_name $last_name, Thank you for registering at our website, [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] You are two steps away from logging in and accessing our exclusive members area. To activate your membership, please click here: [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] Once you activate your memebership, you will be able to login with the following information: Username: $username Password: $random_password Thanks! The Webmaster This is an automated response, please do not reply!"; mail($email_address, $subject, $message, "From: MyDomain Webmaster X-Mailer: PHP/" . phpversion()); echo 'Your membership information has been mailed to your email address! Please check it and follow the directions!'; } ?>
دعنا الآن نشرح ما ينضوي عليه هذا البرنامج النصي. ولنبدأ من أوله.
include 'db.php';
تتولى هذه الشيفرة بكل بساطة تضمين برنامج نصي كنا قد كتبناه فيما سبق، وهو يحتوي على اتصال قاعدة البيانات في تابعmysql_pconnect. وقد قمنا بوضع هذه المعلومات هنا لأننا لا نريد إعادة كتابتها في كل مرة نحتاجها فيها. تعمل وظائف التضمين في PHP بشكل رائع، وهي تمثل أداة يمكن لها أن توفر عليك وقتاً كبيراً من تكرار كتابة الشيفرة نفسها عدة مرات. ويسمح لك التابع mysql_pconnect بتأسيس اتصال دائم مع قاعدة البيانات.
ما هو الاتصال الدائم (persistent)؟ يمثل هذا النوع من الاتصال طريقة لإعادة استخدام مسالك MySQL مراراً وتكراراًً، وذلك دون الحاجة إلى مثيل جديد من MySQL لمعالجة كل اتصال. لنفترض بأنك كنت تستعرض موقعاً وفتحت مسلك MySQL ومن ثمَّ غادرت الموقع لفترة من الزمن. بعد ذلك، أتينا إلى الموقع وبدأنا باستعراضه. يمكننا حينها التقاط مسلك MySQL الخاص بك والبدء باستخدامه بدلاً من فتح مسلك جديد، الأمر الذي يختزل بشكل كبير عملMySQL على ملقمك.
يمثل البرنامج النصي dp.php مثالاً عن كيفية تأسيس اتصال MySQL دائم.
لننتقل الآن إلى المقطع التالي من البرنامج النصي:
// Define post fields into simple variables
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email_address = $_POST['email_address'];
$username = $_POST['username'];
$info = $_POST['info'];
/* Let's strip some slashes in case the user entered
any escaped characters. */
$first_name = stripslashes($first_name);
$last_name = stripslashes($last_name);
$email_address = stripslashes($email_address);
$username = stripslashes($username);
$info = stripslashes($info);
يقوم المقطع الأول من كتلة الشيفرة بكل بساطة بتحويل الحقول register_globals إلى متحولات بسيطة، وذلك لاستخدامها في هذا البرنامج النصي. يمثل ذلك الطريقة المفضلة لدينا، وهي أفضل برأينا من كتابة سلسلة محرفية متكاملة في كل مرة نحتاج فيها لاستخدام هذه الحقول، وستشاهد كم يوفر عليك ذلك من وقت وجهد.
تقوم كتلة الشيفرة الثانية بقص المحارف () من الحقول التي أرسلها المستخدم، وهي تستخدم لذلك التابع stripslashes( ) الذي يحذف المحارف () الموجودة قبل كل محرف (') و(") تضيفه PHP تلقائياً إلى الحقول المرسلة. ونقوم بذلك نظراً لأننا قد نحتاج إلى عرض المعلومات التي يرسلها المستخدم في النموذج، وذلك عندما نجد أي أخطاء من خلال شيفرة التحقق من الأخطاء التالية:
/* Do some error checking on the form posted fields */
if((!$first_name) || (!$last_name) || (!$email_address) || (!$username)){
echo 'You did not submit the following required information!
';
if(!$first_name){
echo "First Name is a required field. Please enter it below.
";
}
if(!$last_name){
echo "Last Name is a required field. Please enter it below.
";
}
if(!$email_address){
echo "Email Address is a required field. Please enter it below.
";
}
if(!$username){
echo "Desired Username is a required field. Please enter it below.
";
}
include 'join_form.html'; // Show the form again!
/* End the error checking and if everything is ok, we'll move on to
creating the user account */
exit(); // if the error checking has failed, we'll exit the script!
}
تعتبر كتلة الشيفرة السابقة بسيطة للغاية. وقد تبدو صعبة نوعاً ما، وهذا إذا لم تكن متآلفاً مع استخدام PHP، ولكن ثق بنا، إذ ليس من الصعوبة بمكان فهمها. تقوم هذه الشيفرة بالتحقق من أنَّ كلاً من المتحولات يحوي شيئاً بداخله. فإذا لم يكن كذلك، فسوف نخبر المستخدم بأنَّه أرسل حقلاً فارغاً ولا غنى له عن ملئه مجدَّداً. هذا وسأعبر عن أول سطر من أجلك.
"إذا لم تقم بإدخال أي شيء في حقل الاسم الأول، أو إذا لم تقم بإدخال أي شيء في حقل الاسم الأخير، أو إذا لم تقم بإدخال أي شيء في حقل عنوان البريد الإلكتروني، أو إذا لم تقم بإدخال أي شيء في حقل اسم المستخدم، فستحصل على هذا الخطأ".
أرجو أن يكون لذلك معنى، ذلك أنَّ هذه هي الطريقة التي تحتاجها لفهم شيفرة التحقق من الخطأ هذه. وباستخدام الرمز||، الذي يكافئ الكلمة "أو" أيضاً، يمكنك تقييم السلاسل المحرفية في برامجك النصية.
يوجد شيء نريد إضافته هنا. توجد عدة طرق لاختبار ما إذا كانت سلسلة محرفية فارغة، ونقدم لك هنا طريقتين من هذه الطرق:
if(!isset($string); or if(empty($string);
يعتبر استخدام التابع isset( ) أو التابع empty( ) مسألة شخصية. ولقد اكتفينا باستخدام المعامل المنطقي ! (نفي) الذي أدى الغرض المطلوب تماماً.
يوجد شيء آخر في كتلة الشيفرة السابقة. فإذا ما تأملت بنيتها، لشاهدت أننا سوف نعرض الخطأ الموجود فقط. وبعد أن يتم عرض الخطأ، سوف نقدم للمستخدم النموذج مجدَّداً وسنملأ جميع الحقول الصحيحة بما كان يملؤها فيما سبق. ويتحقق ذلك بإضافة الشيفرة vale = " echo$variable; ?> علَّامة دخل النموذج في html.
يمثل التابع exit( ) التابع التالي الذي استخدمناه في كتلة الشيفرة هذه. ويتولى هذا التابع إخراج رسالة خطأ إذا ما طلبت منه ذلك، ومن ثم ينهي البرنامج النصي دون تنفيذ الشيفرة التي تليه. وقد وجدنا هذه الطريقة أسهل من استخدام عبارة if else واحدة طويلة للتحقق من صحة البرنامج النصي بأكمله. تذكر دائماً أنك عندما تستخدم ملف footer.php عاماً، فستميل على الأغلب إلى تضمين هذا الملف فوق استدعاء التابع exit( )، وإلا سيتم قص أسفل موقعك على الويب.
سوف نقوم بعد ذلك ببعض التحقق داخل قاعدة البيانات، وذلك لضمان أننا لا نقوم بإنشاء مدخل مضاعف.
/* Let's do some checking and ensure that the user's email address or username
does not exist in the database */
$sql_email_check = mysql_query("SELECT email_address FROM users WHERE email_address='$email_address'");
$sql_username_check = mysql_query("SELECT username FROM users WHERE username='$username'");
$email_check = mysql_num_rows($sql_email_check);
$username_check = mysql_num_rows($sql_username_check);
if(($email_check > 0) || ($username_check > 0)){
echo "Please fix the following errors:
";
if($email_check > 0){
echo "Your email address has already been used by another member
in our database. Please submit a different Email address!
";
unset($email_address);
}
if($username_check > 0){
echo "The username you have selected has already been used by another member
in our database. Please choose a different Username!
";
unset($username);
}
include 'join_form.html'; // Show the form again!
exit(); // exit the script so that we do not create this account!
}
تتحقق الشيفرة السابقة من المعلومات التي أرسلها المستخدم، وذلك لضمان أنَّ عنوان البريد الإلكتروني واسم المستخدم غير موجودين مسبقاً في قاعدة البيانات. فإذا كانا موجودين، فسوف نقدم للمستخدم النموذج طالبين منه إدخال قيم مختلفة. تستخدم كتلة الشيفرة هذه التابع unset( )، والذي سيحذف السلسلتين المحرفيتين $email_address و$username من PHP، والتي تقوم بدورها بإخراج حقول النموذج الخاصة بهاتين القيمتين. بعد ذلك، سوف نمنع البرنامج النصي من الاستمرار، وذلك باستخدام التابع exit( ).
وقد استخدمنا كذلك تابع PHP/MySQL المدعو mysql_num_rows للتحقق من الأخطاء. يعيد هذا التابع عدد الصفوف الموجودة في mysql_query التي تحقق مجموعة من الشروط التي حددناها في التابع mysql_query( ). واستناداً إلى هذا العدد، يمكننا تشغيل بعض عبارات if وتنفيذ مجموعة معينة من الأوامر التي نحتاج إلى تنفيذها. وقد تجد في هذه الشيفرة فائدة جلية لك في برامجك النصية، فاحفظها لديك.
لنمضي قدماً ونتحدث عن كتلة الشيفرة التالية:
/* Random Password generator. [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] We'll generate a random password for the user and encrypt it, email it and then enter it into the db. */ function makeRandomPassword() { $salt = "abchefghjkmnpqrstuvwxyz0123456789"; srand((double)microtime()*1000000); $i = 0; while ($i <= 7) { $num = rand() % 33; $tmp = substr($salt, $num, 1); $pass = $pass . $tmp; $i++; } return $pass; } $random_password = makeRandomPassword(); $db_password = md5($random_password);
تستخدم هذه الشيفرة مولِّد كلمة مرور عشوائية (Random Password)، والذي ينشئ كلمة مرور عشوائية بطول سبعة محارف، ومن ثمَّ يرسلها إلى المستخدم مع تشفيرها باستخدام تابع التجزئة mds( ) ويخزنها في قاعدة البيانات مع المعلومات الخاصة بالمستخدم.
تلبِّي كتلة الشيفرة هذه عدة غايات. تكمن الغاية الأولى في أننا لا نريد منح المستخدمين إمكانية إنشاء كلمة مرور خاصةً بهم حال تسجيل انتسابهم للموقع. إذ إننا نريد أولاً التحقق من هذا المستخدم بطريقة ما، لذلك سوف نمنعه من إنشاء مدخله الخاص به إلى موقعنا حتى نتعرف عليه بشكل أفضل. أما ثانياً، فسنقوم بتشفير كلمة المرور باستخدام mds، وهو تشفير وحيد الاتجاه، لذلك لن تستطيع فك تشفيرها بنفسك. وليس من طريقة للتحقق منmds في قاعدة البيانات إلا بتشفير ما تكتبه ومن ثمَّ التحقق لمعرفة ما إذا كان الحقلان يساويان بعضهما البعض.
لننتقل إلى كتلة الشيفرة التالية:
// Enter info into the Database. $info2 = htmlspecialchars($info); $sql = mysql_query("INSERT INTO users (first_name, last_name, email_address, username, password, info, signup_date) VALUES('$first_name', '$last_name', '$email_address', '$username', '$db_password', '$info2', now())") or die (mysql_error()); if(!$sql){ echo 'There has been an error creating your account. Please contact the webmaster.'; } else { $userid = mysql_insert_id(); // Let's mail the user! $subject = "Your Membership at MyWebsite!"; $message = "Dear $first_name $last_name, Thank you for registering at our website, [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] You are two steps away from logging in and accessing our exclusive members area. To activate your membership, please click here: [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] Once you activate your memebership, you will be able to login with the following information: Username: $username Password: $random_password Thanks! The Webmaster This is an automated response, please do not reply!"; mail($email_address, $subject, $message, "From: MyDomain Webmaster X-Mailer: PHP/" . phpversion()); echo 'Your membership information has been mailed to your email address! Please check it and follow the directions!'; } ?>
لعل أجمل ما في تطوير تطبيقات ويب متقدمة يتمثل في أنك تستطيع جعل الأشياء تبدو معقدة أكثر مما هي عليه في الحقيقة. إذ تقوم الشيفرة السابقة بكل بساطة بإدراج معلومات المستخدم التي قام بإرسالها، وبحيث تضيف إليها كلمة مرور مشفَّرة عشوائية التي كنا قد قمنا بتوليدها، في قاعدة البيانات، ومن ثمَّ إرسال بريد إلكتروني للمستخدم يتضمن ارتباطاً خاصاً.
نستخدم هنا التابع mysql_error( )، والذي يعتبر مفيداً للغاية في تحديد الخطأ في استعلام MySQL الخاص بك. وسوف يعيد هذا التابع معلومات محددة من ملقم MySQL من شأنها أن تعلمك بالخطأ في استعلامك. كما ويوجد تابع رائع آخر في PHP وMySQL، ألا وهو التابع mysql_insert_id( )، والذي سيخبرك بالعدد الذي تم تعيينه للسطر الذي أنشأته للتو مستخدماً مفتاحاً رئيسياً يزداد تلقائياً، وهو أمر هام للغاية هنا.
كما وقد قمنا باستخدام التابع mail( ) منPHP. وحيث أننا لا نبتغي من دراستنا هذه شرح كل تابع قمنا باستخدامه هنا، فسنكتفي بالقول بأنَّ استخدامنا لهذا التابع هنا ليس له غاية سوى إرسال بريد إلكتروني إلى الشخص لنتأكد من عنوان بريده الإلكتروني، وذلك مع منحه ارتباطاً ليثبت صحة هويته لملقمنا. هذا وسوف نغطي ما يخص عملية التحقق من الهوية هذه لاحقاً. ونقدم فيما يلي مثالاً عن بريد إلكتروني سيرسل إلى المستخدمين:
From: MyDomain Webmaster
To: [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
Subject: Your Membership at MyWebsite!
Dear Eric Rosebrock,
Thank you for registering at our website, [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
You are two steps away from logging in and accessing our exclusive members area.
To activate your membership, please click here: [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
Once you activate your memebership, you will be able to login with the following information:
Username: myusername
Password: msxsag4h
Thanks!
The Webmaster
This is an automated response, please do not reply!
قد تتساءل عن السبب الذي يجعلنا نرسل بريداً إلكترونياً للمستخدم مع كلمة المرور المشفَّرة وكذلك المتحول $code في سلسلة الاستعلام المحرفية. حسناً، فكما أشرنا سابقاً، ليس ذلك من المهم في شيء لأنَّه لا يمكن فك تشفير mds أولاً، ولأنه يقدم لنا طريقة للتحقق من المستخدم في البرنامج النصي التالي. لن يعرف المستخدم على الأغلب ما تعنيه شيفرة mds. وقد تتساءل عما إذا كنت أعقد موقعي ليس إلا. لا، فليس الأمر بهذه الصورة حقيقة. إذ يمكنك دائماً منح المستخدم طريقة لتغيير كلمة مروره بعد تسجيل دخوله الأول لموقعك مباشرة إذا كنت مهتماً لذلك. إلى جانب ذلك، لا يستطيع المستخدم لصق كلمة المرور المشفَّرة الخاصة به في نموذج تسجيل الدخول، ذلك أنَّ الشيء الوحيد الذي سيحصل هو أنه سيتم تشفيرها مجدَّداً، مما يتسبب في فشله في تسجيل دخوله. ثق بي، فهذا آمن.
حسناً، لقد انتهينا من هذه المهمة! وقد بتنا الآن مستعدين لإنشاء برنامج نصي للتحقق من صحة هوية المستخدم، وهو شيء سهل للغاية.
تفعيل العضوية:
تقوم الخطوة التالية بإنشاء برنامج نصي، وذلك استناداً إلى البريد الإلكتروني الذي قمنا بإرساله للمستخدم مع المعلومات المتعلقة به. ويمكننا تفعيل/تنشيط الحساب بمجرد استدعاء البرنامج النصي، والذي نقدمه فيما يلي:
/* Account activation script */
// Get database connection
include 'db.php';
// Create variables from URL.
$userid = $_REQUEST['id'];
$code = $_REQUEST['code'];
$sql = mysql_query("UPDATE users SET activated='1' WHERE userid='$userid' AND password='$code'");
$sql_doublecheck = mysql_query("SELECT * FROM users WHERE userid='$userid' AND password='$code' AND activated='1'");
$doublecheck = mysql_num_rows($sql_doublecheck);
if($doublecheck == 0){
echo "Your account could not be activated!";
} elseif ($doublecheck > 0) {
echo "Your account has been activated! You may login below!
";
include 'login_form.html';
}
?>
سوف نتجاوز الجزء الأول من كتلة الشيفرة، إذ إنه يتعلق بالبرنامج النصي dbphp الذي سبق وأن شرحناه. وبذلك سنتحدث أولاً عن الموضع الذي قمنا به بفصل المتحولات في سلسلة الاستعلام المرتبة إلى متحولات مستقلة، وذلك لتبسيط استخدامها.
// Create variables from URL.
$userid = $_REQUEST['id'];
$code = $_REQUEST['code'];
لنمعن النظر في سلسلة الاستعلام المحرفية ونشرحها بشكل خاص. تمثل هذه السلسلة بشكل أساسي اسم ملف برنامجك النصي متبوعاً بإشارة استفهام (?)، ومن ثمَّ اسم المتحول وقيمته. يتم فصل كل سلسلة محرفية وقيمتها عن السلاسل الأخرى وقيمها باستخدام إشارة (AN) &. فعلى سبيل المثال، تكون سلسلة استعلامنا المحرفية بالشكل التالي:
activate.php?id = (mysql_insert_iclالمأخوذ من التابع idمعرِّف المستخدم ) & code = (كلمة مرور المستخدم المشفَّرة)
باستخدام سلسلة الاستعلام المحرفية هذه، نكون قد قمنا بتقسيم الشيفرة بمعاملتها كمتحول $_REQUEST الذي تجد تفصيلاً عنه في PHP Manual Predefined Variables. أما إذا كان علينا إرسال شيء من نموذج باستخدام الطريقة POST، فيجب علينا استخدام المتحول $_POST.
وهكذا فقد حولنا سلسلة الاستعلام المحرفية إلى متحولين هما $userid و$code، وذلك من أجل استعلام MySQL الذي نريد تنفيذه.
$sql = mysql_query("UPDATE users SET activated='1' WHERE userid='$userid' AND password='$code'");
اعتباراً من هنا، نقوم بسحب استعلامMySQL ومن ثمَّ تغيير العمود "activated"، والذي يعود إلى النوع Enumerated ذي الإعدادين 0 و1. تمثل القيمة 0 عدم تفعيل انتساب المستخدم، فيما تمثل القيمة 1 تفعيله. وأثناء استعلام التحديث هذا، نتحقق من معلومات المستخدم في حقلين إضافيين في قاعدة البيانات. وهما الحقلان userid وpassword. فإذا كانت جميع هذه القيم صحيحة في سلسلة الاستعلام المحرفية وتطابق صفاً في قاعدة بياناتنا، فسوف يتم تغيير الصف المتأثر إلى "activated = 1"، وسيكون بوسع المستخدم الآن أن يسجل دخوله.
$sql_doublecheck = mysql_query("SELECT * FROM users WHERE userid='$userid' AND password='$code' AND activated='1'");
$doublecheck = mysql_num_rows($sql_doublecheck);
if($doublecheck == 0){
echo "Your account could not be activated!";
} elseif ($doublecheck > 0) {
echo "Your account has been activated! You may login below!
";
include 'login_form.html';
}
?>
قد يبدو في ذلك عملاً فائضاً لبعض الأشخاص، أو قد يرونه طريقة خاطئة لتحقيق غاية التأكد من صحة هوية المستخدم، ولكنَّنا نجدها الطريقة الأكثر صراحة لمعرفة ما إذا كان قد تم تحديث الصف بشكل صحيح فعلياً، ومن ثمَّ تقديم رسالة نجاح أو فشل للمستخدم. بعد أن يقوم استعلامنا الابتدائي بتغيير قيمة العمود activated إلى 1 إذا كانت معلومات سلسلة الاستعلام المحرفية صحيحة، سوف نسحب استعلاماً إضافياً للتأكد من تغيير ذلك العمود مرة أخرى. ولقد تحدثنا فيما سبق عن التوابع المستخدمة هنا، وذلك في كتل الشيفرة السابقة.
كما تلاحظ، إذا تم التحديث بنجاح، فسوف نعرض، بكل بساطة رسالة صغيرة ونمنح المستخدم إمكانية إدخال اسم المستخدم وكلمة المرور الخاصين به، وذلك ليرسلهما إلى البرنامج النصي التالي.