التحقق من صحة البيانات المدخلة فى الـ Form validation in php

يوسف الضادي

  • Hero Member
  • *****
    • مشاركة: 5333
    • مشاهدة الملف الشخصي
    • http://www.sou9dz.com
    • البريد الالكتروني
ماذا اذا كنا نبرمج سكريبت تسجيل عضويات جديدة مثلا

ونريد التحقق من كل حقل يدخله المستخدم؟ هل هذا الحقل هو حقا يحتوى فقط على البيانات التى نحتاجها؟ ام ان به اشياء خاطئة؟

هذا ماسنتعلمه, وهو لن يكون شئ جديد عليك, سوى ارشادك لكيفية تطبيق ماتعلمته من قبل.

اول شئ نحدد الحقول التى سنضعها بالفورم الذى سنصنعه

وهى كالتالى

1- الإسم.
2- العنوان.
3- البريد
4- الهاتف

ثانيا نبدأ فى تحليل هذه الحقول.

بالنسبة للأسم, لا اظن ان هناك شخص اسمه الأول يكون اكثر من 20 حرف.
ولا اقل من 3 حروف.

وايضا لا يوجد شخص اسمه يحتوى على رقم. او _ او - لكنه فقط يكون حروف وربما مسافات.

تمام هذا بالنسبة للإسم.

العنوان, هذا الحقل لا اظن انه يمكننا التحقق به اى شئ, الا ان نتأكد انه ليس اقل من 10 احرف لا اظن انه هناك عنوان شخص ما يكتب فى اقل من عشرة حروف.

وايضا العناوين لا يمكن به رموز سوى . (نقطة) مثلا بنهايتها, او فاصلة.
بجانب الأرقام والحروف.

بالنسبة للبريد.

عنوان البريد يقسم الى ثلاث اجزاء, جزء قبل علامة @ وجزء بعدها. ثم نقطة, ثم امتداد النقاط.
كالتالى مثلا user@example.com

اسم مستخدم البريد وهو فى المثال اعلاه هو user غير ممكن ان يكون اكثر من 64 حرف

لكن اسم النطاق, يمكن ان يصل لـ 255 حرف ورقم (متضمن امتداد النطاق)

لكن هذا العدد من الأحرف اقل من 1% من اصحاب المواقع يستخدموه.

بالتالى
اسم مستخدم البريد, سوف نحدده الا يتعدى 60 حرف (اظنها نسبة معقولة ومقبولة نوعا ما)
واسم النطاق لا يتعدى الـ 40 حرف (ايضا اظنها نسبة معقولة)

وامتداد النطاق لا يتعدى 6 احرف, صراحة لم اصادف اى نطاق يكون امتداده اكثر من ذلك.

بالنسبة لرقم الهاتف فهو معروف, يتكون من ارقام فقط, ولا يتعدى 14 رقم.

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

وسوف اعطه الإسم index.php
ومحتواه هو التالى


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xml:lang="Ar" lang="Ar" dir="rtl" xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>فورم احترافى</title>
</
head>

<
body>
<
form method="post" action="validator.php">
<
table border="1" align="center" cellpadding="0" cellspacing="0">
<
tr><td>الإسم: </td><td><input type="text" name="name" value="" /></td></tr>
<
tr><td>العنوان: </td><td><input name="address" type="text" size="60" value="" /></td></tr>
<
tr><td>البريد: </td><td><input type="text" dir="ltr" name="email" value="" /></td></tr>
<
tr><td>الهاتف: </td><td><input type="text" dir="ltr" name="phone" value="" /></td></tr>
<
tr><td colspan="2"><input type="submit" value="انهاء" /></td></tr>
</
table>
</
form>
</
body>
</
html>

لاحظ اننا حددنا الـ action على ملف له الإسم validator.php
وهذا هو الملف الذى سيقوم بمعالجة ماتم ارساله بواسطة الفورم.

هذا الملف سوف يحتوى على اربعة دوال (سنقوم نحن بصنعهم)
وايضا سيحتوى بقية متطلبات التعامل مع البيانات التى تم ادخالها بالـ form
ونبدأهم بدالة التحقق من الإسم

 
function valid_name($name){ 
    
//نتأكد اولا من عدم وجود اى رموز داخل النص 
    //اذا وجد اى رموز ستعود الدالة برسالة خطأ 
    
if(ereg("[[:punct:]]|[[:digit:]]|[[:cntrl:]]"$name) !== false){ 
        
//نعم هناك علامات ممنوع وضعها بالإسم 
        
return "الإسم الذى ادخلته غير صحيح او يحتوى على رموز يمنع استخدامها"
    } 
    
//نتأكد ان عدد الحروف ليس اقل من ثلاث حروف 
    
if(mb_strlen($name,'utf-8') < 3){ 
        return 
"الإسم لا يجب ان يكون اقل من ثلاث حروف"
    } 
    
//نتأكد ان عدد الحروف ليس اكثر من عشرين حرف 
    
if(mb_strlen($name'utf-8') > 20){ 
        return 
"الإسم لا يجب ان يكون اكثر من عشرين حرف"
    } 
    
//لم يتم العثور على اى خطأ 
    
return true


كما تلاحظ الدالة تأخذ معطى واحد, وهو الإسم, بعد ذلك تجرى عليه عدة تحققات, اذا وجد اى خطأ تعود لنا الدالة بهذا الخطأ.
(واذا كنت تتذكر, فـ الدالة يتوقف عملها عند اول امر return تصل له) اذن ان لم يتحقق اى خطأ فستعود لنا بـ true

يعنى لم يتم العثور على اى خطأ بالإسم, غير ذلك ستعود لنا برسالة توضح الخطأ.

الأن دالة التحقق من العنوان
وهى كالتالى

 
function valid_address($address){ 
    
//نحذف اى مسافات ببداية او نهاية الحقل 
    
$address trim($address); 
    
//تأكد ان عدد حروف العنوان ليست اقل من 10 
    
if(mb_strlen($address) < 10){ 
        return 
"العنوان لا يجب ان يكون اقل من 10 احرف"
    } 
    
//تأكد من عدم وجود اى رموز غير مطلوبة بالعنوان 
    
if(ereg("[[:punct:]+]|[[:cntrl:]]"$address) !== false){ 
        return 
"العنوان لا يجب ان يحتوى الا على حروف ومسافات وارقام فقط"
    } 
    return 
true


كما ترى, اولا نقوم بالتأكد ان عدد الأحرف ليست اقل من 10, بعد ذلك نتحقق من عدم وجود اى رموز داخل العنوان.

الأن دالة التحقق من البريد وهى كالتالى

 
function valid_email($email){ 
    
//اول شئ احذف اى مساحات فارغة ببداية او نهاية البريد 
    
$email trim($email); 
    
//كود المطابقة الذى سنطابقه مع البريد 
    
$pattern "^([[:alnum:]_.\-]{1,64})@([[:alnum:]_.\-]{2,40})(\.[a-z]{2,6})$"
    if(
ereg($pattern$email) === false){ 
        return 
"عنوان البريد الذى ادخلته غير صحيح"
    } 
    return 
true


كما ترى, بالأول نتحقق من صلاحية البريد بإستخدام اكواد regular expressions بنظام الـ posix
واذا حدث خطأ يتم طباعته.

والأن الدالة الأخيرة للتحقق من صحة رقم الهاتف. وهى تتحقق فقط ان قيمة حقل الهاتف بالكامل رقمية
ولا تقل عن 10 ارقام ولا تزيد عن 14 رقم.


function valid_phone($phone){ 
    
$phone trim($phone); 
    
//نتأكد اذا كان رقم الهاتف الذى تم ادخاله لا يحتوى الا على ارقام فقط 
    //وعدد الأرقام لا يقل عن 10 ولا يزيد عن 14 رقم 
    
if(ereg("[0-9]{10,14}"$phone) === false){ 
        return 
"رقم الهاتف الذى ادخلته غير صحيح"
    } 
    return 
true

الأن بعد انتهائنا من كل الدوال التى سنحتاجها.

نبدأ فى معالجة البيانات التى تم ارسالها بواسطة الفورم.

وسيكون بقية الإسكريبت كالتالى


//نبدأ فى تعريف المتغيرات التى سنعمل عليها 

//تعريف متغيير حقل الإسم 
$name $_POST['name']; 
//تعريف متغيير حقل العنوان 
$address $_POST['address']; 
//تعريف متغيير حقل البريد 
$email $_POST['email']; 
//تعريف حقل الهاتف 
$phone $_POST['phone']; 

//تعريف مصفوفة الأخطاء 
$errors = array(); 
//اذا لم يتم ادخال اسم صحيح 
if(valid_name($name) !== true){ 
    
$errors[] = valid_name($name); 


//اذا لم يتم ادخال عنوان مناسب 
if(valid_address($address) !== true){ 
    
$errors[] = valid_address($address); 


//اذا لم يتم ادخال بريد صحيح 
if(valid_email($email) !== true){ 
    
$errors[] = valid_email($email); 


//اذا كان هناك شئ غير صحيح برقم الهاتف 
if(valid_phone($phone) !== true){ 
    
$errors[] = valid_phone($phone); 


//اذا وجد اى اخطاء اطبعه ولا تكمل بقية الإسكريبت 
if(!empty($errors)){ 
    
$err_msg 'من فضلك قم بتصحيح الأخطاء التالية
'

    foreach(
$errors as $error){ 
        
$err_msg .="{$error} 
"

    } 
    echo 
$err_msg
    exit; 


//اذا لم يحدث اى خطأ, رحب بضيفنا 
$welcome = <<< WEL 
مرحبا بك عزيزى 
{$name}
 
بريدك هو : {$email}
 
وعنوانك : {$address}
 
هاتفك : {$phone
WEL
echo 
$welcome
لا تنسى ان تضع الأكواد بالملف بالترتيب كما هى داخل وسم php
وبنفس مسميات الملفات التى تم ذكرها.

وجرب بنفسك محاولة ادخال بيانات غير صحيحة بالإسكريبت.

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

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

وتأكد ان هذا الدرس مثلما هو مرهق لك, فهو ارهقنى كثيرا فى اعداده وترتيبه.

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

وان شاء الله انا معك اذا تعطلت فى اى شئ. او كان لك اى استفسار.

الأن اترككم فى امان الله, ولا تنسى ان تحاول ان تضيف ابداعتك ومهاراتك.

لا تنسى ان تضع الأكواد بالملف بالترتيب كما هى داخل وسم php
وبنفس مسميات الملفات التى تم ذكرها.

وجرب بنفسك محاولة ادخال بيانات غير صحيحة بالإسكريبت.


حنان لحن الحياة

  • Hero Member
  • *****
    • مشاركة: 2355
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
شكرا لك اخي و بارك الله فيك على مجهوداتك
فهمت الكود و سأبدأ الان بتجريبه
 موفق بإذن الله ... لك مني أجمل تحية .


يوسف الضادي

  • Hero Member
  • *****
    • مشاركة: 5333
    • مشاهدة الملف الشخصي
    • http://www.sou9dz.com
    • البريد الالكتروني
مقتبس من: حنان لحن الحياة;301250
شكرا لك اخي و بارك الله فيك على مجهوداتك
فهمت الكود و سأبدأ الان بتجريبه
 موفق بإذن الله ... لك مني أجمل تحية .

شكرا لمرورك اختاه تفضلي العمل الخاص فقط بايميل من المرفقات

مقتبس من: عاشق القلم;301302
شـكــ وبارك الله فيك ـــرا لك
 موفق بإذن الله
 لك مني أجمل تحية .



شكرا لمرورك اخي الكريم