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

التأكد من صحة بيانات المستخدم المرسلة عبر النماذج(2)

اذهب الى الأسفل

التأكد من صحة بيانات المستخدم المرسلة عبر النماذج(2) Empty التأكد من صحة بيانات المستخدم المرسلة عبر النماذج(2)

مُساهمة من طرف admin الخميس مارس 11, 2010 4:03 am

اخواني الكرام كما قلت لكم في نهاية الدرس السابق , ان هذا الدرس هو امتداد للدرس الذي قبله لذلك اتمنى ان لا تفصلوا بين الدرسين

والأن لنبدأ درسنا لهذا اليوم:


بناء الصف " FormValidator " :


بعد أن قمنا بإلقاء نظرة سريعة على الصفوف و المبدأ العام لبناء و شكل الصف في لغة PHP , دعونا نبدأ بتحقيق هدفنا المنشود ببناء صف للتحقق من البيانات و الذي سندعوه " مراقب النموذج " " FormValidator" و دعونا الآن نتناقش بهدوء حول ما يلزمنا لبنائه .

مكونات الصف الأساسية:

يتألف الصف الذي نريد بناءه من المكونين الرئيسين التالين:

1. مجموعة من الطرق التي تقوم بفحص البيانات المدخلة من قبل المستخدم و التي سيتم تمريرها كمتحولات لهذه الطرق و من ثم تقرر هذه الطرق فيما إذا كانت البيانات صحيحة أم لا حسب القيود التي نضعها و في حال وجود خطأ ما و عدم قبول البيانات تعيد رسالة خطأ للمستخدم تبين له لماذا لم يتم قبول البيانات .
2. بنية خاصة لتخزين مجموعة رسائل الخطأ التي يمكن أن تواجهنا خلال عملية التأكد و مجموعة من الطرق للوصول و معالجة هذه البنية و غالبا ما نستخدم بنية المصفوفة "Array" للتخزين .

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

المبدأ العام لعمل التطبيق

قبل البدء ببناء الصف سأوضح المبدأ العام لعمل التطبيق الذي سيستفيد من الصف و كيف أريد استخدامه .
في البداية هنا بعض المعالجات المختلفة للنموذج و سنفترض أن المتحولات هي "$a ", "$b " و التي تم الحصول عليها من العملية " POST"
بعد ذلك نقوم انشاء الغرض "$fv " من الصف " FormValidator" .
نستدعي طرق التأكد من البيانات و بشكل عام تحتاج كل طريقة إلى متحولين رئيسين :
• الأول: اسم الحقل المراد التأكد من البيانات ضمنه .
• الثاني: رسالة الخطأ التي ستظهر في حالة وجود خطأ في البيانات المدخلة ضمن الحقل .
نفس الأمر تماما لباقي المتحولات مثل "b" , و في النهاية نظهر لائحة بالأخطاء الموجودة ضمن إدخالات للمستخدم للحقول .
المقطع التالي يبين البنية العامة لعمل التطبيق الذي سيستفيد من الصف " FormValidator" :

الكود:

    <?php
    // some form processor
    // let's assume that the variables $a and $b
    // have been obtained via a form POST operation
    // create an object
    $fv = new FormValidator();
    // run validation methods
    // the first argument is the name of the field to validate
    // the second is the error to report if validation fails
    $fv->isString("a", "Please enter a string for field A");
    // same here
    $fv->isNumber("b", "Please enter a string for field B");
    // check to see error status
    echo $fv->isError();
    ?>

الطرق العامة للصف " FormValidator"

من المناقشة السابقة نستطيع سوية اقتراح التوابع اللازمة لعملية التأكد من البيانات و التي يجب أن يتضمنها الصف
" FormValidator" :

• الطريقة " isEmpty " للتأكد من ان الحقل غير فارغ .
• الطريقة " isString " للتأكد من أن الحقل المحدد يحتوي سلسلة نصية "String".
• الطريقة " isNumber " للتأكد من أن الحقل المحدد يحتوي قيمة عددية صحيحة "Integer".
• الطريقة " isWithinRange " للتأكد من أن الحقل المحدد يحتوي قيمة تنتمي لمجال محدد.
• الطريقة " isEmailAddress " للتأكد من أن الحقل المحدد يحتوي صيغة معينة مثل عنوان بريد الكتروني صحيح .
• الطريقة " isError " لمعرفة فيما إذا حدث أي خطا في التأكد من البيانات .
• الطريقة " getErrorList" للحصول على لائحة بالأخطاء الناتجة .
• الطريقة " resetErrorList" لتهيئة لائحة الأخطاء بان تكون فارغة لا تحتوي أي شيء .

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

تعريف الصف
يتم تعريف الصف ببساطة كما يلي:

الكود:

    // FormValidator.class.inc
    // class to perform form validation
    class FormValidator
    {
            // snip
    }


بعد التعريف نضع متحول خاص يدل على لائحة الأخطاء حيث قمت بجعله متحول خاص لا يمكن رؤيته إلا ضمن الصف نفسه .

الكود:

    <?php
    class FormValidator
    {
            //
            // private variables
            //
            var $_errorList;
            // snip
    }



كما تلاحظ قمت باستخدام المحدد "_" في المتحول "$_errorList " , لقد قمت باستخدامه لكي أستطيع التمييز مباشرة بين المتحولات الخاصة (Private) و المتحولات العامة (Public) ضمن الصف و كذلك الأمر بالنسبة للطرق , و هكذا يمكنك من معرفة المتحول أو الطريقة إذا ما كانت خاصة أو عامة من خلال المحدد فإذا سبقت بالمحدد "_" فهي خاصة و إلا فهي عامة .
سأذكرك بالفرق بين المتحولات الخاصة و العامة بسرعة , المتحولات و الطرق الخاصة (Private) لا يمكن الوصول إليها إلا ضمن الصف نفسه , و لا يمكن الوصول إليها من خارج الصف أي من صفوف أخرى أو من البرنامج الرئيسي أما المتحولات و الطرق العامة (Public) فهي عامة يمكن الوصول إليها ضمن الصف و من خارج الصف أي من البرنامج الرئيسي.

بناء التابع "_getValue($field) "

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

لا بد انك لاحظت أنني كررت عبارة ضمن الصف لذلك سنعتبر هذا التابع خاص (Private) لأنه لا يهمني استخدامه خارج الصف , إن دخل التابع هو متحول نصي يعبر عن اسم الحقل مثل "a"و أما خرجه هو متحول باسم الحقل أي "$a " , و تصبح الشيفرة البرمجية على الشكل التالي:

الكود:

    <?php
    class FormValidator
    {
            // snip
            //
            // methods (private)
            //
            // function to get the value of a variable (field)
            function _getValue($field)
            {
                    global ${$field};
                    return ${$field};
            }
            // snip
    }
    ?>


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

على كل حال يمكنك تعديل التابع السابق بحيث يحصل على متحول اسم الحق المطلوب مباشرة من المصفوفة "$HTTP_POST_VARS " و لكنني لم أقم بذلك لأنني لا أعرف أي من الطريقتين سأستخدمها مع نموذجي "Post" أم "Get" و بالنسبة لك إذا كنت متأكدا من استخدامك للطريقة "Post" فقم بتعديل الطريقة لكي تحصل على القيم من المصفوفة "$HTTP_POST_VARS" و يمكنك الحصول على معلومات أكثر في التعامل مع المصفوفة "$HTTP_POST_VARS" من خلال العنوان التالي :
[url]http://www.php.net/manual/en/language.variables.predefined.php
[/url]

بناء الطريقة isEmpty""
سنبدأ الآن بكتابة تابع للتأكد من البيانات المدخلة و هو " isEmpty ", و سنقوم بشرح هذا التابع بالتفصيل لأن جميع التوابع الأخرى لها بنية و مناقشة شبيهة له .
في البداية هذا التابع هو تابع عام (Public) سيتم استدعائه من البرنامج الرئيسي خارج الصف و وظيفته معرفة هل الحقل فارغ أم لا و هو سيعيد القيمة "True " في حال كون الحقل فارغ و إلا سيعيد القيمة "False"و له متحولان هما :
• اسم الحقل المراد فحص البيانات ضمنه .
• رسالة الخطأ التي سيتم عرضها في حال الحقل فارغ .

إذا كان الحقل فارغا فهذا يعني وجود خطأ و بالتالي يقوم بإضافة عنصر جديد للمصفوفة "_errorList[] " التي تعبر عن الأخطاء الناتجة و ذلك باستخدام التابع

الكود:
    array("field" => $field, "value" => $value, "msg" => $msg);

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

الكود:

    <?php

    class FormValidator
    {
            // snip
            //
            // methods (public)
            //
            // check whether input is empty
            function isEmpty($field, $msg)
            {
                    $value = $this->_getValue($field);
                    if (trim($value) == "")
                    {
      $this->_errorList[] = array("field" => $field, "value" => $value, "msg" => $msg);
      return true;
                    }
                    else
                    {
                              return false;
                    }
            }
            // snip
    }
    ?>

استخدمنا هنا الدالة "trim" لفحص المتحول , كما استخدمنا الدالة "This" التي تشير للصف نفسه أي لكي لا نكتب اسمه كاملا.
أسمعك تذكرني بأنني قد وعدتك بشرح سبب عدم استخدام متحولات أسماء الحقول بشكل مباشر مع طرق التأكد من البيانات و إنما تمرير اسم الحقل و من ثم نستخدم تابع للحصول على متحول باسم الحقل و قد حان الآن وقت تفسير ذلك .
عندما نقوم بتمرير اسم الحقل للطريقة فإننا نستطيع الحصول على القيمة بداخله عن طريق متحول اسم الحقل و التي يؤمنها التابع "_getValue " و عندئذ يكون من السهل إضافة كل من الاسم و القيمة إلى مصفوفة "$_errorList" عند حدوث خطأ ما أما إذا استخدمنا متحول اسم الحقل مباشرة فإننا لا نستطيع إيجاد اسم الحقل و إضافته للمصفوفة "$_errorList" عند حدوث خطأ, لا تعقد نفسك إذا لم تفهم هذه النقطة فهي بسيطة جدا , قم بتعديل الصف بحيث تقبل الطريقة متحول اسم الحقل بشكل مباشر , الآن إذا حدث خطأ كيف ستخزن اسم الحقل الذي حصل فيه الخطأ ضمن المصفوفة "$_errorList" , إذا وجدت طريقة ما فأنا اجزم أنها أصعب من طريقة استخدام التابع "_getValue ".

الطريقتان " isString" , "isNumber"

الآن اعتقد أنه ليس صعبا بناء طريقة لمعرفة هل القيمة المدخلة هي قيمة نصية و نسميها "isString " و بناء طريقة لمعرفة هل القيمة المدخلة هي قيمة عددية نسميها " isNumber" .
إليكم الطريقتين و التي سنستخدم فيهما توابع مضمنة في لغة PHP :

الكود:

    <?php
    class FormValidator
    {
            // snip
            // check whether input is a string
            function isString($field, $msg)
            {
                    $value = $this->_getValue($field);
                    if(!is_string($value))
    {
    $this->_errorList[] = array("field" => $field, "value" => $value, "msg" => $msg);
                              return false;
                    }
                    else
                    {
                              return true;
                    }
            }
            // check whether input is a number
            function isNumber($field, $msg)
            {
                    $value = $this->_getValue($field);
                    if(!is_numeric($value))
                    {
    $this->_errorList[] = array("field" => $field, "value" => $value, "msg" => $msg);

                            return false;
                    }
                    else
                    {
                              return true;
                    }
            }
    }
    ?>

قيم صحيحة أم حقيقية
قمنا بشرح التابع "isNumber" و الذي يدلنا فيما إذا كان الحقل يحتوي على بيانات عددية و لكن ماذا لو أردنا التمييز بدقة فيما إذا كانت الأعداد صحيحة "Integer" أو حقيقية "Float" , دعونا نكتب الطريقتين "isInteger " و "isFloat " اللتان تحققان المطلوب :

الكود:
    <?php
    class FormValidator
    {
            // snip
            // check whether input is an integer
            function isInteger($field, $msg)
            {
                    $value = $this->_getValue($field);
                    if(!is_integer($value))
                    {
    $this->_errorList[] = array("field" => $field, "value" => $value, "msg" => $msg);
            return false;
                    }
                    else
                    {
                              return true;
                    }
            }
            // check whether input is a float
            function isFloat($field, $msg)
            {
                    $value = $this->_getValue($field);
                    if(!is_float($value))
                    {
    $this->_errorList[] = array("field" => $field, "value" => $value, "msg" => $msg);
                    return false;
                    }
                    else
                    {
                    return true;
                    }
            }
    }
    ?>

الطريقة " isWithinRange"
تحتاجأحيانا لمعرفة فيما إذا كانت قيمة ما تنتمي لمجال محدد مثل العمر بين 8-88 و نقوم بذلك من خلال الطريقة التالية التي تفحص انتماء القيمة لمجال محدد:

الكود:

    <?php
    class FormValidator
    {
            // snip
    // check whether input is within a valid numeric range
            function isWithinRange($field, $msg, $min, $max)
            {
                    $value = $this->_getValue($field);
        if(!is_numeric($value) || $value < $min || $value > $max)
                    {
    $this->_errorList[] = array("field" => $field, "value" => $value, "msg" => $msg);
                    return false;
                    }
                    else
                    {
                    return true;
                    }
            }
    }
    ?>

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

القاكم في الدرس القادم

تحياتي

admin
المدير العام للمنتدى
المدير العام للمنتدى

البلد : المنتدى ذكر عدد المساهمات : 68
النقاط : 1307
تاريخ التسجيل : 21/01/2009
العمر : 33

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

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