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

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

ثانياً: جدول الأعضاء في قاعدة البيانات
نقوم بانشاء قاعدة بيانات جديدة

نبدأ الآن بتصميم جدول الأعضاء في قاعدة البيانات :
CREATE TABLE users ( user_id INT( 12 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , username VARCHAR( 255 ) NOT NULL , password VARCHAR( 255 ) NOT NULL , usermail VARCHAR( 255 ) NOT NULL , activation_code VARCHAR( 255 ) NOT NULL , register_date INT( 12 ) NOT NULL , active INT( 1 ) NOT NULL DEFAULT '0' ) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_unicode_ci;

و الآن سنشرح كل سطر من تعليمة الـ SQL في جدول users ( جدول الأعضاء )
| معناه | نوعه | الحقل |
| المعرف : و هو رقم يزداد تلقائياً كلما تمت اضافة عضو جديد و يجب ان يكون رقمياً (int) و القيمة (12) تعني أنه رقم قد يصل إلى 12 خانة أي أنه بامكاننا تسجيل حتى 999999999999 عضو . | int | user_id |
| اسم المستخدم : من النوع (varchar) ويقبل كل أنواع المحارف بحد أقصى 255 محرف . ( يمكن تقليل العدد لكن لا يمكن زيادته ) | varchar | username |
| كلمة المرور : مثل اسم المستخدم لكننا سنخزنها مشفرة بتشفير md5 و الذي سيمر معنا لاحقاً . | varchar | password |
| البريد الالكتروني | varchar | usermail |
| رمز التفعيل : نضع أي رقم عشوائي أو حروف و أرقام بشكل عشوائي ( يفيدنا في مسألة تأكيد البريد الالكتروني ) . | varchar | activation_code |
| تاريخ التسجيل : سنعتمد فيه على الدالة time() والتي سأشرحها أيضاً لاحقاً . هناك خاصية للحقول في mysql تضيف التاريخ تلقائياً عند انشاء الصف لكنها غير مجدية لانها تتغير مع كل تحديث للصف . | int | register_date |
| التفعيل : و يفيد لمعرفة إذا كان العضو قد قام بتأكيد تسجيله عن طريق البريد الالكتروني أو لا و سنحدد لها قيمة افتراضية و هي 0 و تتغير الى 1 عندما يقوم العضو بتأكيد تسجيله عن طريق البريد الالكتروني | int | active |
| ملاحظة : هذه الحقول جميعها سنقوم بترميزها بالترميز العالمي الموحد UTF-8 | ||
إلى هنا نكون قد انتهينا من تصميم جدول الأعضاء في قاعدة البيانات لنأتي إلى ملف الاتصال بقاعدة البيانات :
db.php
// معلومات الاتصال بقاعدة البيانات $dbhost="localhost"; // The Host $dbusername="user"; // Database Username $dbpassword="pass"; // Database Password $dbname="qaswlasq"; // Database Name // دوال الاتصال mysql_connect("$dbhost", "$dbusername", "$dbpassword")or die("لا يمكن الاتصال"); mysql_select_db("$dbname")or die("لا يمكن الوصول لقاعدة البيانات");
للاتصال بقاعدة البيانات يلزمنا دالتان :
الأولى : mysql_connect و تتضمن ثلاثة بارامترات ( المستضيف ، اسم مستخدم قاعدة البيانات ، كلمة المرور ) .
الثانية : mysql_select_db و تستعمل لتحديد قاعدة البيانات التي نريد الاتصال بها و تتضمن بارامتر واحد ( اسم قاعدة البيانات ) .
لتسهيل الأمور قمنا باسناد قيم الاتصال إلى متغيرات
فقيمة المتغير $dbhost هي المستضيف و غالباً القيمة هي localhost
و قيمة المتغير $dbusername هي اسم المستخدم لقاعدة البيانات .
قيمة المتغير $dbpassword هي كلمة المرور لقاعدة البيانات .
و قيمة المتغير $dbname هي اسم القاعدة التي انشأناها و هي في مثالنا الحالي : qaswlasq
بهذا نكون قد انهينا مهمة الاتصال بقاعدة البيانات .
ثالثاً: صفحة نموذج التسجيل (الصفحة الرئيسية في مثالنا):
index.php
<form action="register.php" method="POST"> <span>اسم المستخدم</span> <input name="username" size="30" type="text" /> <span>البريد الالكتروني</span> <input name="usermail" size="30" type="text" /> <span>كلمة المرور</span> <input name="password" size="30" type="password" /> <span>تأكيد كلمة المرور</span> <input name="confirmpassword" size="30" type="password" /> <button>تسجيل عضوية</button> </form>
في بداية الصفحة قمنا بإنشاء نموذج form باسم register الاسم هنا هو فقط للدلالة و بإمكاننا استخدام اي اسم نريده . (name=register)
اخترنا طريقة الارسال POST . لدينا طريقتين للارسال ( POST – GET ) إلا أن الطريقة POST آمنة أكثر و في حالتنا هذه فإننا نتعامل مع أمور حساسة و سرية مثل كلمة المرور .. (method=POST)
بالنسبة للحدث action فقد اخترنا الانتقال إلى ملف register.php وهذا يعني أننا بمجرد ارسال البيانات بالضغط على زر الارسال فاننا سننتقل إلى صفحة register.php لمعالجة البيانات التي ارسلناها .
يحتوي النموذج في مثالنا على اربع حقول :
- اسم المستخدم
- البريد الالكتروني
- كلمة المرور
- تأكيد كلمة المرور
بالنسبة لاسم المستخدم و كلمة المرور فإن نوع الحقل يكون نصياً و نحدد له اسماً لكي نميزه عن الحقول الأخرى و لنقوم باستقباله و معالجته في ملف register.php .
<input name="username" size="30" type="text" />
أما بالنسبة لكلمة المرور و تأكيدها فإن الحقل يكون من نوع password أي أن ما يكتب فيه سيظهر على شكل نجوم أو نقاط ( حسب المتصفح أو نظام التشغيل )
<input name="password" size="30" type="password" />
و لدينا في النهاية زر الارسال
<button>تسجيل عضوية</button>
بهذا نكون قد انهينا نموذج الارسال للتسجيل .
رابعاً : صفحة معالجة بيانات النموذج (register.php):
في هذه الصفحة سنقوم باستلام البيانات المرسلة من صفحة النموذج index.php و من ثم التحقق منها و في حال حققت الشروط التي نريد نقوم بادخال المعلومات إلى قاعدة البيانات .
Register.php
في البداية نقوم بتضمين ملف الاتصال بقاعدة البيانات
include ("db.php");
ثم نقوم باستقبال البيانات التي ارسلناها من صفحة النموذج
$username = strip_tags($_POST['username']); $usermail = strip_tags($_POST['usermail']); $password = strip_tags($_POST['password']); $confirmpassword = strip_tags($_POST['confirmpassword']);
نستقبلها بالطريقة POST و هي الطريقة التي اعتمدناها في الارسال و يجب أن يكون الارسال و الاستقبال بالطريقة ذاتها .
قمت باستعمال الدالة strip_tags و ذلك لحماية المدخلات من ادخال اي كود html إلى قاعدة البيانات .
هناك طرق عديدة للحماية إلا أنني أستعمل هذه الطريقة فهي أسهل و آمنة إلى حد كبير .
بعد استقبال البيانات نقوم بالتأكد من صحتها ..
أولاً نتأكد أنه لا يوجد حقول فارغة
if (empty($username) OR empty($usermail) OR empty($password) or empty($confirmpassword)) { echo " أحد الحقول فارغة . يرجى تعبئة الحقول جميعها <a href="index.php">عودة لنموذج التسجيل</a> "; }
في حال وجد أي حقل فارغ فإن المتصفح سيطبع عبارة مفادها انه يجب ملىء الحقول جميعها .
بعد أن تأكدنا من ملىء الحقول ، يجب أن نتأكد من المعلومات .. هل اسم المستخدم موجود مسبقاً ؟!
لعمل ذلك يلزمنا استعلام من قاعدة البيانات باسم المستخدم المرسل فإن وجد يقوم المتصفح بطباعة عبارة ( الاسم الذي ادخلته قد تم استخدامه من قبل ) . و إن لم يكن موجوداً .. يجتاز الشرط .
$userquery = mysql_query("SELECT * FROM users WHERE username='$username'"); $checkname = mysql_num_rows($userquery); if ($checkname > 0) { echo "الاسم الذي ادخلته مستخدم مسبقاً . <a href="index.php">عودة لنموذج التسجيل</a> "; }
قمنا بعمل استعلام يجلب لنا الاسماء التي تساوي الاسم الذي ادخلناه من جدول الأعضاء ، و قمنا بعمل تحديد لعدد الصفوف الناتجة من الاستعلام .. فإذا كانت قيمتها ( صفر ) فهذا يعني ان الاستعلام لم يعثر على اسم مطابق للاسم الذي ادخلناه في قاعدة البيانات و هذا يدل على ان الاسم الذي ادخلناه متاح للتسجيل .
أما في حالة العكس ( اي اذا كانت النتيجة اكبر من صفر ) فهذا يعني ان هناك مستخدماً أو ( أكثر ) بنفس الاسم الذي أدخلناه و في هذه الحالة فإن الشرط لا يتحقق و يطبع المتصفح عبارة ( الاسم الذي ادخلته مستخدم مسبقاً ) .
نقوم بعملية التحقق ذاتها مع البريد الالكتروني أيضاً .
$mailquery = mysql_query("SELECT * FROM users WHERE usermail='$usermail'"); $checkmail = mysql_num_rows($mailquery); if ($checkmail > 0) { echo "البريد الالكتروني الذي ادخلته مستخدم مسبقاً . <a href="index.php">عودة لنموذج التسجيل</a> "; }
هناك شرط آخر و هو مدى أمان كلمة المرور ، نستخدم الدالة strlen و التي تجلب لنا عدد الحروف في كلمة المرور فإن كانت أقل من 6 فإن المتصفح يطبع عبارة (كلمة المرور لا يجب ان تقل عن 6 حروف )
if (strlen($password) < 6) { echo "كلمة المرور لا يجب ان تقل عن 6 حروف . "; }
ننتقل إلى الشرط التالي و هو تساوي كلمتي المرور أثناء الكتابة و الـتأكيد
if ($password != $confirmpassword) { echo "كلمتي المرور غير متطابقتين . <a href="index.php">عودة لنموذج التسجيل</a>"; }
العلامة != تعني ( لا يساوي ) و هي عكس العلامة ( == ) و التي تعني ( يساوي ) .
بعد أن تأكدنا من كل الشروط و في حال تحققها نقوم بإدخال معلومات المستخدم إلى قاعدة البيانات :
$encrypted_password = md5($password); $activation_code = rand(00000000,99999999); $register_date = time(); $adduser = mysql_query("INSERT INTO users (username,password,usermail,activation_code,register_date) VALUES ('$username','$encrypted_password','$usermail','$activation_code','$register_date')"); if ($adduser) { echo "تم قبول عضويتك ، سيتم ارسال رسالة الى البريد الالكتروني الذي استخدمته ، قم باتباع الرابط في الرسالة لتفعيل عضويتك"; } else { echo "حصل خطأ يرجى معاودة التسجيل لاحقاً"; }
أولاً: نقوم بتشفير كلمة المرور قبل ادخالها الى جدول العضو
ثانياً: نقوم بعمل كود التأكيد ( لقد اخترت أن يكون كود الـتأكيد رقماً عشوائياً يتألف من ثمان خانات )
ثالثاً: نقوم بتحديد تاريخ التسجيل عن طريق الدالة time .
رابعاً: نقوم بادخال البيانات التالية في جدول الاعضاء و هي :
1- اسم المستخدم : الاسم الذي ادخلناه في نموذج التسجيل
2- كلمة المرور : كلمة المرور التي ادخلناها و أكدناها في نموذج التسجيل بعد تشفيرها ( طبعاً ) .
3- البريد الالكتروني : البريد الالكتروني الذي ادخلناه في نموذج التسجيل .
4- كود التأكيد : الكود الذي أنشئناه عن طريق الدالة rand وهو عبارة عن رقم عشوائي مؤلف من 8 خانات
5- تاريخ التسجيل : و هو تاريخ اللحظة التي يتم فيها اضافة بيانات المستخدم إلى جدول قاعدة البيانات يتم جلبه بالدالة time .
في حال تنفيذ الاستعلام يطبع المتصفح عبارة
(تم قبول عضويتك ، سيتم ارسال رسالة الى البريد الالكتروني الذي استخدمته ، قم باتباع الرابط في الرسالة لتفعيل عضويتك ) .
ما هي رسالة التفعيل و ما هو الرابط المتبع بداخلها و كيف نقوم بتنفيذ هذه الأمور .. ؟
بعد أن يتم ادخال البيانات في جدول قاعدة البيانات نقوم بارسال رسالة الى البريد الالكتروني المدخل لدينا تتضمن رابطاً يحتوي على كود التأكيد و عند الضغط على الرابط نقوم بارسال كود التأكيد الى صفحة في موقعنا للتأكد من الكود .. و في حالة كان الكود صحيحاً سيتم تفعيل العضوية و ذلك بتغيير قيمة الحقل active من ( صفر ) إلى ( 1 ) .
$to = "$usermail"; $subject = "كود التفعيل"; $message = "السيد $username : شكراً لتسجيلك لدينا ، لاتمام عملية التسجيل يرجى النقر على الرابط التالي : <a href="sitename/path-to-folder/activation.php?code=$activation_code"> sitename/path-to-folder /activation.php?code=$activation_code </a>"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .="from: Qaswlasq.com "; $headers .="X-Mailer: smail-PHP ".phpversion()."\r\n"; mail($to, $subject, $message, $headers);
نستعمل دالة mail لارسال البريد الالكتروني حيث تتضمن اربع باراميترات و هي :
1 – المرسل اليه : و هو في مثالنا هذا البريد الالكتروني المستخدم في التسجيل
2 – العنوان : عنوان الرسالة
3 – الرسالة : محتوى الرسالة و ف مثالنا سيكون المحتوى هو رابط التفعيل .
4 – الترويسة : و تختلف من نوع الى آخر حسب ( المرفقات – الترميز – السيرفر – المرسل .. إلخ .. )
و في مثالنا استخدمنا أبسط ترويسة .
و بهذا يكتمل ملف register.php ويكون كاملاً بالشكل التالي :
register.php
include ("db.php"); $username = strip_tags($_POST['username']); $usermail = strip_tags($_POST['usermail']); $password = strip_tags($_POST['password']); $confirmpassword = strip_tags($_POST['confirmpassword']); $userquery = mysql_query("SELECT * FROM users WHERE username='$username'"); $checkname = mysql_num_rows($userquery); $mailquery = mysql_query("SELECT * FROM users WHERE usermail='$usermail'"); $checkmail = mysql_num_rows($mailquery); if (empty($username) OR empty($usermail) OR empty($password) or empty($confirmpassword)) { echo " أحد الحقول فارغة . يرجى تعبئة الحقول جميعها <a href="index.php">عودة لنموذج التسجيل</a> "; } elseif ($checkname > 0) { echo "الاسم الذي ادخلته مستخدم مسبقاً . <a href="index.php">عودة لنموذج التسجيل</a> "; } elseif ($checkmail > 0) { echo "البريد الالكتروني الذي ادخلته مستخدم مسبقاً . <a href="index.php">عودة لنموذج التسجيل</a> "; } elseif (strlen($password) < 6) { echo "كلمة المرور لا يجب ان تقل عن 6 حروف . <a href="index.php">عودة لنموذج التسجيل</a>"; } elseif ($password != $confirmpassword) { echo "كلمتي المرور غير متطابقتين . <a href="index.php">عودة لنموذج التسجيل</a>"; } else { $encrypted_password = md5($password); $activation_code = rand(00000000,99999999); $register_date = time(); $adduser = mysql_query("INSERT INTO users (username,password,usermail,activation_code,register_date) VALUES ('$username','$encrypted_password','$usermail','$activation_code','$register_date')"); if ($adduser) { $to = "$usermail"; $subject = "كود التفعيل"; $message = "السيد $username : شكراً لتسجيلك لدينا ، لاتمام عملية التسجيل يرجى النقر على الرابط التالي : <a href="sitename/path-to-folder/activation.php?code=$activation_code"> sitename/path-to-folder /activation.php?code=$activation_code </a>"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .="from: Qaswlasq.com "; $headers .="X-Mailer: smail-PHP ".phpversion()."\r\n"; mail($to, $subject, $message, $headers); echo "تم قبول عضويتك ، سيتم ارسال رسالة الى البريد الالكتروني الذي استخدمته ، قم باتباع الرابط في الرسالة لتفعيل عضويتك"; } else { echo "حصل خطأ يرجى معاودة التسجيل لاحقاً"; } }
بعد ان أرسلنا رسالة التأكيد إلى البريد الالكتروني للمستخدم يتبقى لنا الصفحة التي سيتم فيها تفعيل العضوية و التي اسميناها activation.php و مهمتها استقبال كود التفعيل الموجود في رسالة التأكيد و التأكد من صحته .
خامساً : صفحة تفعيل العضوية ( activation.php ) :
نقوم بتضمين ملف الاتصال بقاعدة البيانات في بداية الصفحة :
activation.php
include ("db.php"); نقوم باستقبال كود التفعيل : $activation_code = $_GET['code']; نقوم بعمل استعلام للتأكد من صحة الكود الذي استقبلناه : $checkactive = mysql_query("SELECT * FROM users WHERE activation_code='$activation_code'"); $result = mysql_num_rows($checkactive); if ($result == 0) { echo "الرابط الذي اتبعته غير صحيح يرجى التأكد من الرابط"; }
قمنا بعمل استعلام يجلب لنا عدد الصفوف التي يتطابق فيها كود التفعيل المخزن مع كود التفعيل المرسل من البريد الالكتروني .. فإن كان عدد الصفوف ( صفر ) فهذا يعني أن كود التفعيل غير صحيح و يقوم المتصفح وقتها بطباعة عبارة ( الرابط الذي اتبعته غير صحيح يرجى التأكد من الرابط ) .
أما في حالة العكس ( أي إذا كانت النتيجة أكبر من صفر فإننا نقوم بتحديث الصف الذي يتطابق فيه كود التفعيل مع كود التفعيل المرسل من البريد الالكتروني و تغيير قيمة active فيه من ( صفر ) و التي تعني ان العضو غير مفعل إلى ( واحد ) و التي تفيد بأن العضو قد قام بتفعيل عضويته و تأكيد بريده الالكتروني .
else { $activateuser = mysql_query("UPDATE users SET active='1' WHERE activation_code='$activation_code'"); if ($activateuser) { echo "أخي المستخدم لقد تم تفعيل عضويتك ، أهلا بك في موقعنا"; } else { echo "حصل خطأ ، يرجى المعاودة لاحقاً"; } }
وبهذا نكون قد انتهينا من صفحة التفعيل و اليكم الكود كاملاً :
activation.php
include ("db.php"); $activation_code = $_GET['code']; $checkactive = mysql_query("SELECT * FROM users WHERE activation_code='$activation_code'"); $result = mysql_num_rows($checkactive); if ($result == 0) { echo "الرابط الذي اتبعته غير صحيح يرجى التأكد من الرابط"; } else { $activateuser = mysql_query("UPDATE users SET active='1' WHERE activation_code='$activation_code'"); if ($activateuser) { echo "أخي المستخدم لقد تم تفعيل عضويتك ، أهلا بك في موقعنا"; } else { echo "حصل خطأ ، يرجى المعاودة لاحقاً"; } }
في النهاية نقوم بتزيين الفورم ببعض أكواد CSS ليصبح أنيقاً و مريحاً للمستخدم ..
كن على تواصل
تصنيفات
- أمن الإنترنت (2)
- التسويق الإلكتروني (2)
- بحث وتنقيب (3)
- تراجم (2)
- تصميم مواقع (2)
- تصميم واجهة المستخدم (1)
- تطوير مواقع (10)
- تطوير واجهة المستخدم (4)
- شعارات (7)
- عام (11)
- قابلية الإستخدام (1)
- محركات البحث (2)
- مقابلات (6)
- نظام إدارة المحتوى (2)







عدد التعليقات: 33
التعليق رقم: 1
عبدالرحمن إسحاق
في 28/02/2010، الساعة 21:35
درس منظم رائع ومفيد جداً، وضحت الكثير من الأمور التي لم أكن أعلمها
فشكراً لك وبارك الله فيك
التعليق رقم: 2
أبو عمر
في 28/02/2010، الساعة 22:37
جزاك الله ألف خير ما قصرت
التعليق رقم: 3
عبدالمهيمن
في 28/02/2010، الساعة 22:39
شكراً على الشرح الجميل وبصراحة أحيي مدونة قص ولصق على مستوى المقالات المطروحة في المدونة.
لكن المثال المطروح يحتوي على ثغرتين قاتلين من نوع SQL Injection.
حسب معلوماتي البسيطة الدالة strip_tags لا تحمي من حقن أوامر SQL بمعنى آخر صحيح أن الدالة تقوم بحذف html tags لكنها لا تقوم بحذف أوامر SQL وبهذه الحالة يمكن حقن استعلام آخر مع الاستعلام الأصلي, عوضاً عنها يجب استعمال الدالة mysql_real_escape_string.
الثغرة الثانية أخطر واكتشافها أسهل لأنها تستخدم الميثود GET والمتغيّر $activation_code تم تمريره الى قاعدة البيانات بشكل مباشر دون أي تأكد منه! (أبسط أنواع ثغرات SQL Injection)
أتمنى أن يتم تصحيح الأمثلة المطروحة لينتبه الجميع لهذه الأمور.
بالتوفيق…
التعليق رقم: 4
رودي هرمز
في 28/02/2010، الساعة 23:32
كلامك صحيح 100% .
فقد أوضحت سابقاً أن الغرض من الدرس هو فهم عملية التسجيل و أن طرق الحماية متعددة لكنني استعملت ابسط الطرق في بناء نموذجي
المثال الموضوع .. هو لتوضيح غاية الدرس فقط .. و مسألة الحماية مسألة كبيرة فعلاً و لو أنني تطرقت اليها لتضخم الدرس و خرجت عن الموضوع الاساسي و هو عملية التسجيل .
عموماً شكراً لك على المعلومة .. سآخذها بعين الاعتبار عندما أضع أمثلة مشابهة أخرى .
شكراً لك مجدداً .
التعليق رقم: 5
عبد الهادي اطويل
في 28/02/2010، الساعة 22:54
السلام عليكم ورحمة الله وبركاته..
بارك الله فيك أخي الكريم رودي، فهذا من بين أفضل الدروس في مجال php على المستوى العربي، وهذا فعلا ما نحتاجه، فهنيئا لنا بوجود مدونة عربية لها كتاب من هذا المستوى..
لاحظت ملاحظة بسيطة أثناء تتبعي للدرس، حيث إنه ورد:
“في بداية الصفحة قمنا بإنشاء نموذج form باسم register”
ولو لاحظنا كود النموذج لا نجد name=”register” ضمن كود النموذج وأعتقد أنه سقط سهوا، أيضا وحسب ما أعلم بأن الوسم name ضمن form يعتبر غير مقبول في اختبارات xhmtl 1.0 strict ويتم استعمال id بدلا من name (أي id=”name”).
الجميل في الأمر أيضا هو التفاعل في التعليقات من خلال الملاحظات المهمة للأخ الكريم عبد المهيمن فيما يتعلق بالحماية، فحينما تجتمع الخبرات نحصل على نتائج رائعة..
وفقكم الله جميعا وجزاكم عنا كل خير..
مني لكم أرق تحية..
التعليق رقم: 6
رودي هرمز
في 28/02/2010، الساعة 23:35
أخي عبد الهادي ..
شكراً للنصيحة ، لم أكن أعلم أن الوسم name غير مقبول .
بارك الله بك و بالأخ عبد المهيمن ، بأمثالك نرتقي .
التعليق رقم: 7
programmer-mood
في 01/03/2010، الساعة 03:14
صباح الخيـــر
يعطيـك العـافيه .. أعجبني وضوح الدرس و كذالك المشـاركة و التنبيه لبعض الأمور في التعليقات.
موفقيــن ,,
التعليق رقم: 8
عبد الهادي اطويل
في 01/03/2010، الساعة 03:53
لا شكر على واجب أخي الكريم رودي بل الشكر لك على هذا الدرس والتوضيح الكبير، وعذرا على الرد من جديد لكنني لاحظت أنني أخطأت سهوا أيضا في ردي السابق حيث وبدل أن أكتب id=register كتبت id=name..
شكرا مجددا ومني لك أرق تحية..
التعليق رقم: 9
أحمد شيكو
في 01/03/2010، الساعة 04:04
شكرا لك على كل تلك المعلومات القيمة لقد شوقتني لتعلم php لأني بصراحة صفر في تلك اللغة هههه
تقبل تحياتي,
التعليق رقم: 10
Ahmad Ismail
في 01/03/2010، الساعة 05:34
شكراً لك شرح جيد، ولكن بما أنني قمت ببرمجة نظام مشابه لدي بعض التحفظات الأمنية على السكريبت الذي أضفته.
strip_tags لا تكفي بالتأكيد لتنظيف محتوى المدخلات. فهي تنظف مدخلات على شكل أكواد هتمل فقط.
1- نصيحتي دائماً هي إستعمال PDO للإتصال بال MYSQL ، الجميل فيها أنها تقدم سرعة جيدة، متوافقة بطريقة جيدة مع البرمجات الكائنية، ممكن الإتصال على MYSQL أو ORacle… ، وفي هذه الحالة توفر إثنان فانكشين مهمين
prepare and bindparam وهم كفيلين بدرجة جيدة جدأ لتنقية المدخلات. MYSQLi كذلك جيدة ولكن لا تتعامل إلى مع MYSQL
2- لاحظت أنه تم إستلام كود التفعيل مباشرة في ال MYSQL
3- الأفضل دائماً إستخدام class php Mailer الذي يعتمد أيضأ على SMTP وتضمن أن الرسالة وصلة للبريد وليس للسخام . فالتسجيل بالموقع وإرسال رسالة جميلة بالهتمل للبريد يعطي نظرة أفضل للمشترك الجديد.
4- ناحية مهمة وهي ال SESSION و ال COOKIE مثلا بعد التسجيل بنجاح .
5- إستخدام white list لتحديد شكل تسجيل المستخدم والتأكد من عدم التسجيل إلى بأحرف أجنبية وعربية وأرقام فقط. كذلك التأكد من الميل
if(!filter_var($email, FILTER_VALIDATE_EMAIL
وهي فونكشين جاهزة بال PHP. أتمنى القيام بجميع التعديلات بكلاس validate واضح وجميل ، مع بعض التححق بال jQuery قبل الإرسال، ليكون سكريبت كامل ممكن دائماً الرجوع إليه.
تحياتي وبإنتظار الدرس الجديد
التعليق رقم: 11
pluscss
في 01/03/2010، الساعة 07:34
مهلك علي يا أخ اسماعيل ..
الأمور التي طلبتها كلها ممكنة لكن ألا تعتقد أن كل نقطة منها بحاجة إلى درس مستقل .
بالنسبة لمسألة الأمان فقد قمت بتعديل المثال و حماية المدخلات من أخطار sql injection
و سيتم استبدال الملفات القديمة بالملفات المصححة .
هذا من جهة و من جهة أخرى فإنني ان قمت بعملية validate فسأضطر حينها إلى تخصيص درس كامل لشرح التعابير القياسية .
ما أردته من درسي هذا هو أبسط طريقة لفهم عملية تسجيل العضوية .
شكراً لردك ، و كل النقاط التي ذكرتها ستؤخذ بعين الاعتبار .
ملاحظة : هل يمكنك أن تمرر لنا نظام تسجيل العضويات الذي قمت ببرمجته للاطلاع .
التعليق رقم: 12
Ahmad Ismail
في 01/03/2010، الساعة 17:41
شكراً لك،
إن شاء الله عندما أنهيه بشكل تام سأضعه هنا، لأني آخذ بعين الإعتبار أيضأ طرق حماية أخرى مثل عدد المحاولات و التسجيل عبر أجاكس. عندما أنهي السكريبت بشكل تام سأضعه هنا إن شاء الله للإطلاع أو التعديل عليه. دائماً بالعمل الجماعي ممكن رؤية أخطاء لا يتداركها الفرد.
سابقاً كنت أستعمل هذا السكريبت لإدارة الأعضاء ولكنه غير متوافق مع عديد من اللغات.
http://www.drsoft.com/p/Webber-21.html
إستعملته هنا
http://www.arabic-keyboard.org/typing-test/index.php
كحماية ممتاز وبدعم كثير من الأشياء الجميلة, ولكن برمجته معقدة لذا قررت بناء نظام عضويات موحد.
كذلك نفطة تهمني مثل دمج النظام ليعمل مع vbulletin و سكريبت الألعاب.
التعليق رقم: 13
أبوبكر نـور
في 01/03/2010، الساعة 11:05
السلام عليكم
درس رائع و مهم… شكرا لكم
كان يمكن كذلك التحقق من وجود البريد أصلا أم لا
التعليق رقم: 14
المجلة التقنية
في 01/03/2010، الساعة 20:35
بارك الله فيك
درس واضح و منظم جيدا
هذا الذي كان ينقصنا على الويب العربي و الحمد لله فتحت هذه المدونة الباب للمحتوى الراقي
التعليق رقم: 15
أحمد شيكو
في 01/03/2010، الساعة 22:56
تم التطبيق أخي بعد عدة محاولات نظرا لأني لم أكن أعلم حتى كيف أضيف الجداول و لكن (التكرار يعلم الشطار) ههه
أرجو أن تعطيني رأيك في تطبيقي من هنا
http://ara2.eb2a.com/reg/index.php
شكرا جزيلا لمجهودك الطيب
التعليق رقم: 16
pluscss
في 01/03/2010، الساعة 23:16
أهلا بك أخي أحمد ، قمت بتجربة التطبيق و حاولت أن أقوم بالتسجيل إلا أنه يظهر لي رسالة خطأ ( حصل خطأ يرجى معاودة التسجيل لاحقاً ) ..
التعليق رقم: 17
أحمد شيكو
في 02/03/2010، الساعة 00:13
سأقوم بإعادة المحاولة مرة أخرى مع أني لا أعرف ما الخطأ
التعليق رقم: 18
أحمد شيكو
في 02/03/2010، الساعة 00:27
أنا أعرف أني أتعبتك معي أخي
لكن في الجداول في user_id عندي مشكلة…انظر الصورة
http://www.up-00.com/Feb10/8KT75068.gif
و لو مافيها تعب أرجو شرح انشاء الجداول بتفصيل أكثر فأنا كما تعلم صفر في لغة php و الأشياء المتعلقة بها
جزاك الله خيرا عنا
التعليق رقم: 19
pluscss
في 03/03/2010، الساعة 19:19
أخي أحمد :
رسالة الخطأ تفيد بأنك قد حددت أكثر من حقل ليكون auto_increment
الحقل الوحيد الذي يحمل خاصية auto_increment و primary هو حقل user_id
حاول مجدداً .. و اعلمني بالنتيجة .
شكراً لمتابعتك .
التعليق رقم: 20
ابوسليمان
في 03/03/2010، الساعة 18:36
اشكرك اخي على الشرح المتميز طبعاً وانا من المتابعين المهمين لمقالاتك المتميزة
وان شاء الله اطبق هذا الدرس وتنجح معي العملية
التعليق رقم: 21
طارق العراش
في 11/03/2010، الساعة 18:11
شرح اكثر من رائع
نتمنى المزيد من الدروس على هذه الشاكلة
وفقنا ووفقك الله الى ما فيه صلاح الامة
التعليق رقم: 22
M.B.O
في 15/03/2010، الساعة 02:34
اشكرك على هذا الدرس الرائع
اتمنى لك التوفيق اخوي
^_^
التعليق رقم: 23
جمال
في 25/03/2010، الساعة 04:11
الدرس وافي وكافي، “رودي” أراد شرحا بسيطا لكيفية عمل صفحة التسجيل، يعني المعلومات الواردة في الدرس قاعدية جدا، وإذا تحدثت عن الجانب الأمني راح نحتاج لدرس أطول بمرتين، وإذا أضفنا الجانب الرسومي طول الموضوع سيتضاعف لأربع مرات…إلخ وبذلك ستجد أنك ألفت كتابا يفوق عدد صفحاته 300 أو أكثر،
اذا كان للأخوة المختصين مثلا في “المجال الأمني” مثل “عبد المهيمن” آراء حول الجانب الأمني والوقائي في الـPHP يمكنه مراسلة الإدارة وكتابة موضوع يفيد الجميع، وكل له دوره ومجال إختصاصه، فلنكن مححترفين.
التعليق رقم: 24
pluscss
في 25/03/2010، الساعة 09:44
أخي جمال ..
شكراً على ملاحظاتك القيمة بالنسبة للجانب الأمني فقد حاولت في القسم الثاني من الدرس أن أراعي ملاحظات الأخوة عبدالمهيمن و الأخ عبد الهادي ..
أشكرك على ردك و اتمنى ان اكون دائماً عند حسن الظن
التعليق رقم: 25
أنفاس
في 26/03/2010، الساعة 16:46
مدونة رائعة جداً…وشرح واضح و مفهوم …إلى الأمام ^_^
التعليق رقم: 26
خالد
في 05/04/2010، الساعة 03:36
السلام عليكم ورحمة الله
جزاك الله ألف خير على هذا الشرح الجميل المتناسق الذي نفتقده في كثير من المنتديات للاسف ” رحم الله عبدا عمل عملا فأتقنه ” أو كما قال رسول الله صلى الله عليه وسلم.
التعليق رقم: 27
oussama larhmich
في 21/04/2010، الساعة 19:38
السلام عليكم
شكرا لك على المدونة و الشرح الرائع ساطبق الشرح حالما انصب برنامج الأباتشي عندي و سأعدل على البرمجية لتشتغل مع برمجية اخرى لعمل نظام خاص بالزبناء مع كيفية الاتصال بهم والله نزلت علي فكرة روووعة تسلم، متابع الدرس الثاني
التعليق رقم: 28
سامي
في 01/08/2010، الساعة 17:18
من الأفكار الجيدة استخدام نموذج تأكيد العضوية عند تسجيل عضو جديد في أي منطقة أعضاء وهو نظام مزدوج يحمي الموقع من الوقوع في براثن ما يسمى SPAM ويضمن الرغبة الفعلية من المشتركين في الإنضمام والمشاركة.
اشكر لك هذا التوضيح المسهب متمنياً لك كل التوفيق.
التعليق رقم: 29
disha
في 10/08/2010، الساعة 15:48
موضوع رائع رائع رائع للغايه بارك الله فصاحب الموضوع الكريم
افادنى بطريقه كبيره جدا
التعليق رقم: 30
nour
في 17/10/2010، الساعة 01:01
الشرح مميز جداً والتعليقات فوق الروعة
موفقين جميعاً ونسعد بتتابع لمثل هذه الدروس
فى حفظ الرحمن
التعليق رقم: 31
ahmed hassan
في 17/09/2011، الساعة 18:32
شكرا على الدرس العالملا مشاء اللة بس عندى سؤال انا كان عندى فورم برمجتة و ضفت علية التفعيل بس المشكلة ان الدالة مابتكونش ارقام عشوئية السوال ؟ المفروض اضع الاكتفاشن كود فى الدالة $_post
$activation code= strip_tags($_POST['activation code']);
؟؟
التعليق رقم: 32
ahmed hassan
في 17/09/2011، الساعة 19:18
الحمد لله حلتها الف شكر
التعليق رقم: 33
arwa
في 02/12/2011، الساعة 04:03
السلام عليكم ورحمة الله وباركاته
بارك الله فيك بالفعل شرح ممتاز جدا ومنظم ولقد فرحت بشكل كبير عندما قراته
استمر في مساعدتنا دائما بشرح بسيط ومنظم مثل هذا
وسؤالي للاخ الي كتب كيفية التحقق من الايميل انا هذا مااريده فلو عندكم درس عليه ممكن تفيدوني وشكرا
عَلق على الموضوع