اسرة واحدة
المنتدي نور بزيارتك ويسعدنا ويشرفنا انضمامك للمنتدي
مع ارق تمنياتنا بقضاء وقت ممتع ومفيد
ادارة المنتدي
اسرة واحدة
المنتدي نور بزيارتك ويسعدنا ويشرفنا انضمامك للمنتدي
مع ارق تمنياتنا بقضاء وقت ممتع ومفيد
ادارة المنتدي
اسرة واحدة
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.



 
الرئيسيةتدفق rssأحدث الصورالتسجيلدخول
بحـث
 
 

نتائج البحث
 
Rechercher بحث متقدم
سحابة الكلمات الدلالية
اقوال تمجيد البابا المقدس التعب الكتاب السويس الدخول للبابا روحية اسرة عروسة باربي شنودة
المواضيع الأخيرة
» مرشح الرئاسة المصرية السابق صباحي يؤكد قدرة اليسار على هزيمة الاسلاميين في البرلمان
أنشاء عضوية للفي بي Icon_minitime10/1/2012, 01:36 من طرف ادارة المنتدي

» «بكري»: نرفض تورط مصر في عمل عسكري
أنشاء عضوية للفي بي Icon_minitime10/1/2012, 01:33 من طرف ادارة المنتدي

» توفيق عكاشة يسلم نفسه للشرطة ويسعى لتسوية موقفه بشأن 5 أحكام غيابية
أنشاء عضوية للفي بي Icon_minitime10/1/2012, 01:30 من طرف ادارة المنتدي

» أبو العينين" أمام المحكمة: علمت بـ"موقعة الجمل" من التلفزيون
أنشاء عضوية للفي بي Icon_minitime10/1/2012, 01:26 من طرف ادارة المنتدي

» الأمن يسيطر على اشتباك أنصار أبو إسلام وأقباط بأول جلسة لمحاكمته
أنشاء عضوية للفي بي Icon_minitime10/1/2012, 01:21 من طرف ادارة المنتدي

» صور روعة لقداسة البابا شنودة الثالث
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 18:28 من طرف ادارة المنتدي

» بقلم قداسة البابا شنوده يارب ماذا أطلب منك
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 18:24 من طرف ادارة المنتدي

» لا شيء من تأملات قداسة البابا شنودة
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 18:22 من طرف ادارة المنتدي

» تأمل مكتوب لقداسة البابا شنودة إن جاع عدوك
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 18:19 من طرف ادارة المنتدي

» العذراء مريم فى فكر أباء الكنيسة
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 18:08 من طرف ادارة المنتدي

» صور شهداء امبابه
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 18:03 من طرف ادارة المنتدي

» الاختلافات ما بين الكنيسة الأرثوذكسية والكنيسة الكاثوليكية
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 17:57 من طرف ادارة المنتدي

» الاعتراض على الصوم الجماعى
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 17:55 من طرف ادارة المنتدي

» قصة أخْنُوخ البار
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 17:52 من طرف ادارة المنتدي

» ما هو صوم الميلاد
أنشاء عضوية للفي بي Icon_minitime9/24/2012, 17:49 من طرف ادارة المنتدي


 

 أنشاء عضوية للفي بي

اذهب الى الأسفل 
كاتب الموضوعرسالة
ادارة المنتدي
ربنا موجود
ادارة المنتدي


رقم العضوية : 1
عدد المساهمات : 1301
نقاط : 4027
شكر صاحب الموضوع : 3
تاريخ التسجيل : 03/03/2012
الموقع : onefamily3.yoo7.com

أنشاء عضوية للفي بي Empty
مُساهمةموضوع: أنشاء عضوية للفي بي   أنشاء عضوية للفي بي Icon_minitime3/28/2012, 01:29

[size=24]
إنشاء نظام عضوية (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! <br />';

if(!$first_name){

echo "First Name is a required field. Please enter it below.<br />";

}

if(!$last_name){

echo "Last Name is a required field. Please enter it below.<br />";

}

if(!$email_address){

echo "Email Address is a required field. Please enter it below.<br />";

}

if(!$username){

echo "Desired Username is a required field. Please enter it below.<br />";

}

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: <br />";

if($email_check > 0){

echo "<strong>Your email address has already been used by another member

in our database. Please submit a different Email address!<br />";

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!<br />";

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<admin@mydomain.com>

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! <br />';

if(!$first_name){

echo "First Name is a required field. Please enter it below.<br />";

}

if(!$last_name){

echo "Last Name is a required field. Please enter it below.<br />";

}

if(!$email_address){

echo "Email Address is a required field. Please enter it below.<br />";

}

if(!$username){

echo "Desired Username is a required field. Please enter it below.<br />";

}

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: <br />";

if($email_check > 0){

echo "<strong>Your email address has already been used by another member

in our database. Please submit a different Email address!<br />";

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!<br />";

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<admin@mydomain.com>

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 "<strong><font color=red>Your account could not be activated!</font></strong>";

} elseif ($doublecheck > 0) {

echo "<strong>Your account has been activated!</strong> You may login below!<br />";

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 "<strong><font color=red>Your account could not be activated!</font></strong>";

} elseif ($doublecheck > 0) {

echo "<strong>Your account has been activated!</strong> You may login below!<br />";

include 'login_form.html';

}

?>




قد يبدو في ذلك عملاً فائضاً لبعض الأشخاص، أو قد يرونه طريقة خاطئة لتحقيق غاية التأكد من صحة هوية المستخدم، ولكنَّنا نجدها الطريقة الأكثر صراحة لمعرفة ما إذا كان قد تم تحديث الصف بشكل صحيح فعلياً، ومن ثمَّ تقديم رسالة نجاح أو فشل للمستخدم. بعد أن يقوم استعلامنا الابتدائي بتغيير قيمة العمود activated إلى 1 إذا كانت معلومات سلسلة الاستعلام المحرفية صحيحة، سوف نسحب استعلاماً إضافياً للتأكد من تغيير ذلك العمود مرة أخرى. ولقد تحدثنا فيما سبق عن التوابع المستخدمة هنا، وذلك في كتل الشيفرة السابقة.

كما تلاحظ، إذا تم التحديث بنجاح، فسوف نعرض، بكل بساطة رسالة صغيرة ونمنح المستخدم إمكانية إدخال اسم المستخدم وكلمة المرور الخاصين به، وذلك ليرسلهما إلى البرنامج النصي التالي.


[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]

مشاركة هذا الرد في
<TABLE class=share_in cellSpacing=0 cellPadding=6 width="100%" sizset="49" sizcache="1">

<TR sizset="49" sizcache="1">
<td class=share_in_google jQuery1332890025593="2">[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]</TD>
<td class=share_in_fb jQuery1332890025593="3">[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]</TD></TR>
<TR sizset="51" sizcache="1">
<td class=share_in_twitter jQuery1332890025593="4">[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]</TD>
<td class=share_in_digg jQuery1332890025593="5">[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]</TD></TR></TABLE>

تابــــــــــــــــــــــــــــــع

الرجوع الى أعلى الصفحة اذهب الى الأسفل
https://onefamily3.yoo7.com
ادارة المنتدي
ربنا موجود
ادارة المنتدي


رقم العضوية : 1
عدد المساهمات : 1301
نقاط : 4027
شكر صاحب الموضوع : 3
تاريخ التسجيل : 03/03/2012
الموقع : onefamily3.yoo7.com

أنشاء عضوية للفي بي Empty
مُساهمةموضوع: رد: أنشاء عضوية للفي بي   أنشاء عضوية للفي بي Icon_minitime3/28/2012, 01:31


هاک إنشاء نظام عضوية (2)

التحقق من تسجيل الدخول:

سوف نرسل النموذج الذي يتضمن حقلي اسم المستخدم وكلمة المرور إلى ملف يدعى checkuser.php. ويمثل هذا الملف الملف الذي يعالج جلَّ عمليات المستخدم، وذلك بعد أن ينتهي من عمليات الانتساب إلى الموقع وتفعيل عضويته. دعنا نلقي نظرة على هذا البرنامج النصي:



<?

/* Check User Script */

session_start(); // Start Session

include 'db.php';

// Conver to simple variables

$username = $_POST['username'];

$password = $_POST['password'];

if((!$username) || (!$password)){

echo "Please enter ALL of the information! <br />";

include 'login_form.html';

exit();

}

// Convert password to md5 hash

$password = md5($password);

// check if the user info validates the db

$sql = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password' AND activated='1'");

$login_check = mysql_num_rows($sql);

if($login_check > 0){

while($row = mysql_fetch_array($sql)){

foreach( $row AS $key => $val ){

$$key = stripslashes( $val );

}

// Register some session variables!

session_register('first_name');

$_SESSION['first_name'] = $first_name;

session_register('last_name');

$_SESSION['last_name'] = $last_name;

session_register('email_address');

$_SESSION['email_address'] = $email_address;

session_register('special_user');

$_SESSION['user_level'] = $user_level;



mysql_query("UPDATE users SET last_login=now() WHERE userid='$userid'");



header("Location: login_success.php");

}

} else {

echo "You could not be logged in! Either the username and password do not match or you have not validated your membership!<br />

Please try again!<br />";

include 'login_form.html';

}

?>




ليست هذه الشيفرة بتلك الصعوبة، فدعنا نشرحها الآن.


<?

/* Check User Script */

session_start(); // Start Session



لقد بدأنا جلسة عمل PHP باستخدام التابع session_start( ). وتعتبر هذه المهمة غاية في البساطة، ولكنَّها قد تغدو صعبة، إذ يجب عليك القيام بذلك قبل أن يتم عرض أي شيء على مستعرضك من قبل البرنامج النصي الذي تتم فيه تبدئة جلسة العمل. فإذا لم تقم بذلك، فسوف تبدأ بالحصول على أخطاء قبيحة تقول بأنَّ هناك ترويسات قد أرسلت بالفعل. وما إلى ذلك من أشياء غريبة. ونستطيع أن نضمن لك بأن هذه ستكون مشكلة وستعمم الفوضى على موقعك.

إذا لم تقم بتبدئة جلسة العمل في أعلى كل برنامج نصي تريد استخدام جلسات العمل فيه، فلن تكون قادراً على استخدام متحولات جلسة العمل. وعادة ما نقوم بذلك في الملف header.php الذي نستند عليه في أعلى كل من برامجنا النصية، وذلك مع الملف db.php وغيره، وسوف تكتشف ذلك بنفسك.




// Conver to simple variables

$username = $_POST['username'];

$password = $_POST['password'];




وهنا مجدَّداً نشير إلى أنَّ هذه الطريقة تمثل ما نفضله لتبسيط متحولاتنا. ولا يتوجب عليك القيام بهذه الخطوة إذا لم ترغب بذلك، ولكنَّ عليك إصلاح الشيفرة التالية:






if((!$username) || (!$password)){

echo "Please enter ALL of the information! <br />";

include 'login_form.html';

exit();

}




لن تصدق كم من الأشخاص يقومون فعلياً بالنقر على الزر submit (إرسال) في نموذج دون كتابة شيء. ولا نعلم إن كان ذلك عن عبث أو قصد غايته الهرج. تقوم الشيفرة السابقة بكل بساطة بمراقبة إمكانية قيامهم بشيء من هذا القبيل، وبالتالي إعادة نموذج تسجيل الدخول إليهم دون تنفيذ ما تبقى من البرنامج النصي، هذا هو الرد المناسب لمثل هؤلاء!




// Convert password to md5 hash

$password = md5($password);




هل تذكر جميع الأشياء التي أوردناها حول كلمات المرور فيما سبق من هذه الدراسة! حسناً، تأخذ قطعة الشيفرة هذه كلمة المرور المقروءة للإنسان (تلك التي أرسلناها للمستخدم عن طريق بريده الإلكتروني، ومن ثمَّ تحولها إلى نسخة مجزأة باستخدام التابع mds، وبذلك نستطيع التحقق منها بمقارنتها مع ما هو مخزن في قاعدة البيانات، الأمر الذي يسمح لنا بالتأكد من كونهما متطابقتين.




// check if the user info validates the db

$sql = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password' AND activated='1'");

$login_check = mysql_num_rows($sql);

if($login_check > 0){

while($row = mysql_fetch_array($sql)){

foreach( $row AS $key => $val ){

$$key = stripslashes( $val );

}




تمثل هذه الشيفرة استعلام تحديد(select) في MySQL، والذي يتحقق من مطابقة اسم المستخدم وكلمة المرور لما هو مخزن في قاعدة البيانات. كما وتعيد كتلة الشيفرة هذه عدد الصفوف المتأثرة بالاستعلام، وفي حال كان العدد أكبر من الصفر (أي أننا وجدنا تطابقاً، إذ إنها أعادت لنا العدد 1)، فسوف نقوم ببناء المعلومات التي نحتاجها في ما تبقى من البرنامج النصي. أما إذا كانت قيمة المتحول $login_check تساوي الصفر، فسوف تقدم للمستخدم نموذج تسجيل الدخول مجدَّداً بكل بساطة.

يوجد شيء آخر يتعلق بهذه الشيفرة نود إيضاحه بدوره أيضاً. إذ توجد قطعة من الشيفرة تتولى سحب المعلومات من قاعدة بياناتك، وذلك مع قص محارف (/) منها وإنشاء متحول لكل عمود من أعمدة قاعدة بياناتك في ذلك الصف. ويعتبر مفيداً للغاية، ومن شأنه أن يوفر عليك وقتاً كبيراً عندما تحتاج إلى تطبيق التابع stripslashes( ) على عدة متحولات. ونقدم فيما يلي قطعة الشيفرة هذه لوحدها:




while($row = mysql_fetch_array($sql)){

foreach( $row AS $key => $val ){

$$key = stripslashes( $val );

}




لنفترض بأنَّ لدينا ثلاثة أعمدة في جدولنا، وبحيث يمثل العمود الأول الاسم الأول (file_name) والثاني الاسم الأخير (last_name) والثالث مستوى المستخدم (user_level). باستخدام قطعة الشيفرة هذه، نكون قد قمنا بإنشاء المتحولات $first_name و$last_name و$user_level، وذلك دون وجود أية محارف (/) فيها، وبحيث تحتوي على قيم الأعمدة الموافقة لها في قاعدة البيانات. أليس هذا رائعاً؟

لنعد إلى موضوعنا، ولنقدم الكتلة التالية من الشيفرة:




// Register some session variables!

session_register('first_name');

$_SESSION['first_name'] = $first_name;

session_register('last_name');

$_SESSION['last_name'] = $last_name;

session_register('email_address');

$_SESSION['email_address'] = $email_address;

session_register('special_user');

$_SESSION['user_level'] = $user_level;




إنها جلسة العمل مجدَّداً! تعتبر هذه الشيفرة بسيطة للغاية صدق ذلك أو لا تصدقه. لقد عانى الكثيرون للغاية من جلسات العمل، ولكنَّ هذا البرنامج النصي سيوضح لك كيف تعمل بكل بساطة.

دعنا نتوقف قليلاً لشرح جلسات العمل لأولئك الذين لم يتوصلوا إلى فهمها بشكل جيد، وسنحاول جهداً أن نقدم لك فكرة واضحة عنها.

لقد اعتدنا جميعاً، على ما نأمل، على استخدام ملفات تعريف الارتباط (******s)، وهو ملف نصي صغير يتم تخزينه على حواسبنا، ويحتوي على معلومات تتعلق بنا، ولا يمكن قراءته سوى من قبل موقع الويب الذي تم إنشاؤه من قبله (وكذلك محرِّرات النصوص لدينا). وقد يحتوي ملف تعريف الارتباط على معلومات من قبيل الاسم الأول أو عنوان البريد الإلكتروني أو تاريخ آخر زيارة. هذا جميل ولكن!؟ لقد قام مطورو مستعرضات الويب وغيرهم من مطوري البرمجيات بجعل إنشاء ملفات تعريف الارتباط صعباً للغاية، الأمر الذي أدى إلى تناقص وثوقية ملفات تعريف الارتباط بشكل كبير، وذلك جرّاء مستويات الأمان وإعاقة البرامج كلها. ولقد أصلحت PHP هذه المشكلة من أجلنا.

تشبه جلسة العمل ملف تعريف الارتباط، ولكنها تخزن المعلومات على الملقم في دليل مؤقت بدلاً من تخزينها على محرك القرص الصلب لدى المستخدم. يتم تعيين رقم خاص لملف تعريف الارتباط هذا، وكذلك الحال مع جلسة العمل التي يمتلكها المستخدم. فإذا كان معرِّف جلسة العمل ID ومعرِّف الملف المؤقت ID متماثلين، فسوف يصل ملقم الويب إلى ملف تعريف ارتباط جلسة العمل على محرك القرص الصلب الخاص به. يمنح ذلك مسؤولي الويب فسحة كبيرة لتوسيع وظيفة مواقعهم، ويجعل الحياة أكثر سهولة، ذلك أنَّ المستخدم لن يستطيع إعاقة جلسة العمل عن الظهور والعمل. وعندما يغلق المستخدم مستعرض الويب الخاص به، سوف يتم تدمير ملف تعريف الارتباط المؤقت من ملقم الويب. هل وصلتك الفكرة؟ نرجو ذلك.

يتمثل أول ما سنقوم به في إنشاء متحول جلسة عمل. ويتحقق ذلك بتسجيل اسمه:

session_register('first_name');



ومن ثم نقوم بتعيين قيمة لاسم متحول جلسة العمل هذا:

$_SESSION['first_name'] = $first_name;



وهكذا، وإذا ما كان اسم المستخدمMazen، فستكون قيمة متحول جلسة العمل المدعو first_name هي Mazen. بكلمة أخرى، ستكون قيمة المتحول $_SESSION ['first_name']; هي Mazen لهذا المستخدم بالذات. ويتمثل الشيء الممتع في ذلك في أننا نستطيع استخدام هذه الفكرة في عدة مواضع من موقعنا، وذلك دون استعلام قاعدة البيانات مراراً وتكراراً، ذلك أننا قد قمنا للتو بتسجيل المتحول كمتحول جلسة عمل. لكنَّ عليك أن تتذكر دائماً بأنَّ كل استدعاء لمتحول جلسة عمل يوجب عليك وضع التابع session_start( ) في أعلى البرنامج النصي المعني بذلك.

لننتقل إلى المقطع التالي من هذه الشيفرة:




mysql_query("UPDATE users SET last_login=now() WHERE userid='$userid'");



header("Location: login_success.php");

}




يوجد لدينا عمود في قاعدة بياناتنا يمكننا استخدامه ويدعى last_login، وهو من النوع DATETIME، وبما أنَّه قد تم التحقق من المستخدم، وحيث أنَّ كل شيء يسير على النحو المقدَّر له، يمكننا الآن تحديث معلومات المستخدم وتعيين قيمة العمود last_login على التاريخ الموافق للحظة استخدام التابع now( ).

قد تتساءل لماذا اخترنا تحديث login_date (تاريخ تسجيل الدخول) للعضوية. حسناً، لنفترض بأنَّ قاعدة بيانات المستخدمين خاصتنا ستتضخم في المستقبل لتضم فئات الآلاف من المشتركين. يمكننا في هذه الحالة إنشاء برنامج نصي يمكننا تشغيله كل شهر لتحديد ما إذا كان مستخدم قد سجل دخوله إلى موقع الويب خلال الأشهر الستة الأخيرة. فإذا كان كذلك، فسوف نحافظ له على عضويته، وإلا فسنقوم بإلغاء اشتراكه أو حتى إرسال بريد إلكتروني إليه لإعلامه بأننا نعتزم حذفه من قائمة الأعضاء وبذلك نقوم بتغيير قيمة العمود activated إلى القيمة 0 مجدَّداً مع إرسال ارتباط إليه لإعادة تفعيل عضويته. يعتبر هذا العمل اختيارياً تماماً، ولكنه يمثل ميزة جيدة يمكن إضافتها.

لماذا استخدمنا header("Location: login_success.php");؟ يعود ذلك إلى أننا نريد التحقق مرتين من تخزين جلسات العمل بشكل صحيح. ويماثل ذلك المصطلح Meta ******* في HTML، باستثناء أنَّ برنامج PHP النصي سيقوم تلقائياً بتوجيهك إلى الصفحة في هذا التابع header( ). ونكرر مجدَّداً بأنه، وكما التابع session_start( )، يمثل هذا التابع أحد تلك التوابع التي يجب استدعاؤها قبل طباعة أي HTML على مستعرض المستخدم.

لننتقل إلى كتلة الشيفرة التالية:




} else {

echo "You could not be logged in! Either the username and password do not match or you have not validated your membership!<br />

Please try again!<br />";

include 'login_form.html';

}

?>




ادع ذلك ما تريد، عادات برمجية سيئة أو أي شيء، ولكننا سنكتفي بالقول إنَّ هذه الشيفرة تمثل نهاية التحقق من الأخطاء للتابع mysql_query. فإذا لم يتم العثور على أي صف في المتحول $login_check السابق، فسنقدم للمستخدم بكل بساطة هذا الخطأ مع تضمين نموذج تسجيل الدخول مجدَّداً.

هذا كل شيء بالنسبة لهذا البرنامج النصي. وسنكون إما قد نجحنا بالتحقق من المستخدم، بمقارنة معلوماته مع ما هو مخزن في قاعدة البيانات وإعادة توجيهه إلى برنامجنا النصي التالي، أو بتقديم نموذج تسجيل الدخول إليه ليعيد المحاولة مجدَّداً.

دعنا الآن نلقي نظرة على آخر برنامج نصي لعملية تسجيل الدخول.

البرنامج النصي لتسجيل الدخول الناجح:

يمثل هذا البرنامج النصي آخر مرحلة في تسجيل الدخول. فإذا ما سارت الأمور على ما يرام حتى وصولنا إلى هنا، فسيكون بوسعنا عرض رسالة نجاح تسجيل الدخول على المستخدم، وذلك باستخدام متحولات جلسة العمل التي قمنا بتسجيلها أثناء قيام المستخدم بتسجيل دخوله. كما وسيقوم هذا البرنامج النصي بتقديم تعريف عن مجموعات المستخدمين ومستويات الوصول إلى موقع الويب. ونقدم إليك فيما يلي شيفرة هذا البرنامج النصي:


<?

session_start();

echo "Welcome ". $_SESSION['first_name'] ." ". $_SESSION['last_name'] ."!

You have made it to the members area!<br /><br />";

echo "Your user level is ". $_SESSION['user_level']." which enables

you access to the following areas: <br />";

if($_SESSION['user_level'] == 0){

echo "- Forums<br />- Chat Room<br />";

}

if($_SESSION['user_level'] == 1){

echo "- Forums<br />- Chat Room<br />- Moderator Area<br />";

}

echo "<br /><a href=logout.php>Logout</a>";

?>




لنقم بشرح أجزاء هذه الشيفرة كلاً على حدة.


<?

session_start();

echo "Welcome ". $_SESSION['first_name'] ." ". $_SESSION['last_name'] ."!

You have made it to the members area!<br /><br />";

echo "Your user level is ". $_SESSION['user_level']." which enables

you access to the following areas: <br />";




يتولى هذا الجزء بدء جلسة العمل كما سبق وشرحنا، ومن ثمَّ يقدم للمستخدم رسالة ترحيب تتضمن اسمه الأول والأخير. كما ويحول دون وصولهم إلى أجزاء معينة، وذلك استناداً إلى إعداد مستوى الوصول user_level الخاص به في قاعدة البيانات. راجع الشيفرة التالية:


if($_SESSION['user_level'] == 0){

echo "- Forums<br />- Chat Room<br />";

}

if($_SESSION['user_level'] == 1){

echo "- Forums<br />- Chat Room<br />- Moderator Area<br />";

}




نقوم هنا بالتحقق من المستوى الذي يمتلك المستخدم حق الوصول تبعاً له، وعليه نقدم له الارتباطات الموافقة. ومنذ الآن، يكون من السهولة بمكان فهم ما تبقى من الشيفرة. بشكل أساسي، وإذا كان user_level = 0، فسيكون بوسع المستخدم الوصول إلى ساحات الحوار (Forums) وغرف المحادثة (Chat Room)، أما إذا كان user_level = 1 فسيكون بوسع المستخدم الدخول إلى Forums وChat Room وModerator Area.




echo "<br /><a href=logout.php>Logout</a>";

?>




وتمثل هذه الشيفرة ارتباط تسجيل الخروج، وبذلك ننتقل إلى البرنامج النصي التالي.

البرنامج النصي لتسجيل الخروج:

نقدم فيما يلي البرنامج النصي الخاص بتسجيل الخروج:




<?

session_start();

if(!isset($_REQUEST['logmeout'])){

echo "<center>Are you sure you want to logout?</center><br />";

echo "<center><a href=logout.php?logmeout=true>Yes</a> |

<a href=**********:history.back()>No</a>";

} else {

session_destroy();

if(!session_is_registered('first_name')){

echo "<center><font color=red><strong>You are now logged

out!</strong></font></center><br />";

echo "<center><strong>Login:</strong></center><br />";

include 'login_form.html';

}

}

?>




لقد وصلنا أخيراً إلى استخدام المتحول isset( ). ونقوم هنا بالتحقق من أنَّ المتحول $logmeout غير معيَّن. فإذا لم يكن كذلك، فسوف نطلب من المستخدم أن يؤكد رغبته في تسجيل خروجه وسنقدم له خيارين اثنين. يتضمن الخيار yes الأول سلسلة استعلام محرفية، وهي تعيد المستخدم إلى البرنامج النصي نفسه الذي تم بناء المتحول $logmeout داخله، ومن ثم يتم تمرير أول عبارة if التي تقوم بتدمير جلسة عمله باستخدام التابع session_destroy( ) وتضمين نموذج تسجيل الدخول. ولن يتم بعد ذلك تسجيل دخوله!.

يبقى شيء لم نقم بتغطيته حتى الآن، ألا وهو كيفية توليد أداة استرداد كلمة مرور مفقودة. دعنا نقم بذلك لننهي عملنا في شرح كيفية إنشاء موقع ويب يقدم عضوية لزائريه.



أداة استرداد كلمة المرور المفقودة:

تعتبر هذه الأداة أساسية، ذلك أنك لن تستطيع أن تخبر المستخدمين بكلمة مرورهم السابقة باستخدام كلمات المرور المشفَّرة باستعمال التابع mds. إضافة إلى ذلك، يعتبر إرسال بريد إلكتروني لإرسال كلمة المرور للمستخدم في كل مرة يحتاج إليها فيها أمراً غير محبذ إطلاقاً. لنجعل الأمر إذاً مؤتمتاً كلياً.

نقدم فيما يلي البرنامج النصي الذي نستخدمه:




<?

include 'db.php';

switch($_POST['recover']){

default:

include 'lost_pw.html';

break;



case "recover":

recover_pw($_POST['email_address']);

break;

}

function recover_pw($email_address){

if(!$email_address){

echo "You forgot to enter your Email address

<strong>Knucklehead</strong><br />";

include 'lost_pw.html';

exit();

}

// quick check to see if record exists

$sql_check = mysql_query("SELECT * FROM users WHERE email_address='$email_address'");

$sql_check_num = mysql_num_rows($sql_check);

if($sql_check_num == 0){

echo "No records found matching your email address<br />";

include 'lost_pw.html';

exit();

}

// Everything looks ok, generate password, update it and send it!



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);



$sql = mysql_query("UPDATE users SET password='$db_password'

WHERE email_address='$email_address'");



$subject = "Your Password at MyWebsite!";

$message = "Hi, we have reset your password.



New Password: $random_password



[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]




Thanks!

The Webmaster



This is an automated response, please do not reply!";



mail($email_address, $subject, $message, "From: MyDomain Webmaster<admin@mydomain.com>

X-Mailer: PHP/" . phpversion());

echo "Your password has been sent! Please check your email!<br />";

include 'login_form.html';

}

?>




لقد قمنا من أجل هذا البرنامج النصي بإنشاء النموذج lost_pw.html، والذي يستخلص عنوان البريد الإلكتروني للمستخدم. كما ويتضمن هذا النموذج حقلاً مخفياً يدعى recover وقيمته recover. وفي أعلى البرنامج النصي، قمنا بإنشاء عبارة switch، وهي طريقة أخرى للتحقق من المعلومات، وذلك بدلاً من استخدام عبارة if else.

لقد قمنا بجمع المعلومات واستعلام قاعدة البيانات وحددنا ما إذا كان هناك تطابقاً. فإذا كان الأمر كذلك، سنقوم بإرسال بريد إلكتروني للمستخدم مع كلمة مرور عشوائية جديدة، وذلك مع تحديث قاعدة البيانات بتلك المعلومات في نفس الوقت. نقوم بعد ذلك بعرض نموذج تسجيل الدخول ونخبر المستخدم بأنَّ عليه العودة إلى بريده الإلكتروني ليشاهد كلمة مروره الجديدة.

إذا لم نحصل على أي تطابق مع عنوان البريد الإلكتروني، فسنعلم المستخدم بذلك بكل بساطة، وسنقدم له نموذج كلمة المرور الضائعة مجدَّداً، وإذا لم يقم المستخدم بإدخال عنوان بريده الإلكتروني، فسوف نطلب منه إعادة إدخال عنوان بريده الإلكتروني.

الخلاصة:

لقد تعلمنا في هذه الدراسة المطوَّلة بعض الأشياء، ونرجو أن تكون قد حصلت من خلالها فهماً أفضل عن نظام تسجيل الدخول وجلسات العمل واستعلامات قاعدة البيانات وبعض التوابع التي نستخدمها يومياً فيPHP. لقد عملنا جهدنا على إنشاء نظام يسهل عليك فهمه والتلاعب به، فنرجو أن تكون قد وجدت في ما قدمناه كل الفائدة

الرجوع الى أعلى الصفحة اذهب الى الأسفل
https://onefamily3.yoo7.com
 
أنشاء عضوية للفي بي
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
اسرة واحدة :: أقسام تطوير المواقع والمنتديات :: تقنيات أخرى-
انتقل الى: